/*
 * From: https://github.com/iovisor/bcc/blob/master/examples/tracing/vfsreadlat.c
 *
 * vfsreadlat.c		VFS read latency distribution.
 *			For Linux, uses BCC, eBPF. See .py/.rb file.
 *
 * Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * 15-Aug-2015	Brendan Gregg	Created this.
 */

#include <uapi/linux/ptrace.h>

BPF_HASH(start, u32);
BPF_HISTOGRAM(dist);

int do_entry(struct pt_regs *ctx)
{
  u32 pid;
  u64 ts, *val;

  pid = bpf_get_current_pid_tgid();
  ts = bpf_ktime_get_ns();
  start.update(&pid, &ts);
  return 0;
}

int do_return(struct pt_regs *ctx)
{
  u32 pid;
  u64 *tsp, delta;

  pid = bpf_get_current_pid_tgid();
  tsp = start.lookup(&pid);

  if (tsp != 0) {
    delta = bpf_ktime_get_ns() - *tsp;
    dist.increment(bpf_log2l(delta / 1000));
    start.delete(&pid);
  }

  return 0;
}
