Blame view

samples/bpf/tracex4_kern.c 1.24 KB
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
1
2
3
4
5
6
7
8
9
  /* Copyright (c) 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.
   */
  #include <linux/ptrace.h>
  #include <linux/version.h>
  #include <uapi/linux/bpf.h>
7cf245a37   Toke Høiland-Jørgensen   samples/bpf: Use ...
10
11
  #include <bpf/bpf_helpers.h>
  #include <bpf/bpf_tracing.h>
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
12
13
14
15
16
  
  struct pair {
  	u64 val;
  	u64 ip;
  };
59929cd1f   Daniel T. Lee   samples, bpf: Ref...
17
18
19
20
21
22
  struct {
  	__uint(type, BPF_MAP_TYPE_HASH);
  	__type(key, long);
  	__type(value, struct pair);
  	__uint(max_entries, 1000000);
  } my_map SEC(".maps");
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
23
24
25
26
27
28
29
  
  /* kprobe is NOT a stable ABI. If kernel internals change this bpf+kprobe
   * example will no longer be meaningful
   */
  SEC("kprobe/kmem_cache_free")
  int bpf_prog1(struct pt_regs *ctx)
  {
d912557b3   Michael Holzheu   samples: bpf: ena...
30
  	long ptr = PT_REGS_PARM2(ctx);
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
31
32
33
34
35
36
37
38
  
  	bpf_map_delete_elem(&my_map, &ptr);
  	return 0;
  }
  
  SEC("kretprobe/kmem_cache_alloc_node")
  int bpf_prog2(struct pt_regs *ctx)
  {
d912557b3   Michael Holzheu   samples: bpf: ena...
39
  	long ptr = PT_REGS_RC(ctx);
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
40
41
42
  	long ip = 0;
  
  	/* get ip address of kmem_cache_alloc_node() caller */
138d6153a   Naveen N. Rao   samples/bpf: Enab...
43
  	BPF_KRETPROBE_READ_RET_IP(ip, ctx);
9811e3535   Alexei Starovoitov   samples/bpf: Add ...
44
45
46
47
48
49
50
51
52
53
54
  
  	struct pair v = {
  		.val = bpf_ktime_get_ns(),
  		.ip = ip,
  	};
  
  	bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
  	return 0;
  }
  char _license[] SEC("license") = "GPL";
  u32 _version SEC("version") = LINUX_VERSION_CODE;