Blame view

samples/bpf/ibumad_kern.c 2.97 KB
0ac01febd   Ira Weiny   BPF: Add sample c...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
  
  /**
   * ibumad BPF sample kernel side
   *
   * 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.
   *
   * Copyright(c) 2018 Ira Weiny, Intel Corporation
   */
  
  #define KBUILD_MODNAME "ibumad_count_pkts_by_class"
  #include <uapi/linux/bpf.h>
7cf245a37   Toke Høiland-Jørgensen   samples/bpf: Use ...
15
  #include <bpf/bpf_helpers.h>
0ac01febd   Ira Weiny   BPF: Add sample c...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  
  
  struct bpf_map_def SEC("maps") read_count = {
  	.type        = BPF_MAP_TYPE_ARRAY,
  	.key_size    = sizeof(u32), /* class; u32 required */
  	.value_size  = sizeof(u64), /* count of mads read */
  	.max_entries = 256, /* Room for all Classes */
  };
  
  struct bpf_map_def SEC("maps") write_count = {
  	.type        = BPF_MAP_TYPE_ARRAY,
  	.key_size    = sizeof(u32), /* class; u32 required */
  	.value_size  = sizeof(u64), /* count of mads written */
  	.max_entries = 256, /* Room for all Classes */
  };
  
  #undef DEBUG
7ae9f2817   Michal Rostecki   samples: bpf: Rem...
33
34
35
  #ifndef DEBUG
  #undef bpf_printk
  #define bpf_printk(fmt, ...)
0ac01febd   Ira Weiny   BPF: Add sample c...
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  #endif
  
  /* Taken from the current format defined in
   * include/trace/events/ib_umad.h
   * and
   * /sys/kernel/debug/tracing/events/ib_umad/ib_umad_read/format
   * /sys/kernel/debug/tracing/events/ib_umad/ib_umad_write/format
   */
  struct ib_umad_rw_args {
  	u64 pad;
  	u8 port_num;
  	u8 sl;
  	u8 path_bits;
  	u8 grh_present;
  	u32 id;
  	u32 status;
  	u32 timeout_ms;
  	u32 retires;
  	u32 length;
  	u32 qpn;
  	u32 qkey;
  	u8 gid_index;
  	u8 hop_limit;
  	u16 lid;
  	u16 attr_id;
  	u16 pkey_index;
  	u8 base_version;
  	u8 mgmt_class;
  	u8 class_version;
  	u8 method;
  	u32 flow_label;
  	u16 mad_status;
  	u16 class_specific;
  	u32 attr_mod;
  	u64 tid;
  	u8 gid[16];
  	u32 dev_index;
  	u8 traffic_class;
  };
  
  SEC("tracepoint/ib_umad/ib_umad_read_recv")
  int on_ib_umad_read_recv(struct ib_umad_rw_args *ctx)
  {
  	u64 zero = 0, *val;
  	u8 class = ctx->mgmt_class;
7ae9f2817   Michal Rostecki   samples: bpf: Rem...
81
82
  	bpf_printk("ib_umad read recv : class 0x%x
  ", class);
0ac01febd   Ira Weiny   BPF: Add sample c...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  
  	val = bpf_map_lookup_elem(&read_count, &class);
  	if (!val) {
  		bpf_map_update_elem(&read_count, &class, &zero, BPF_NOEXIST);
  		val = bpf_map_lookup_elem(&read_count, &class);
  		if (!val)
  			return 0;
  	}
  
  	(*val) += 1;
  
  	return 0;
  }
  SEC("tracepoint/ib_umad/ib_umad_read_send")
  int on_ib_umad_read_send(struct ib_umad_rw_args *ctx)
  {
  	u64 zero = 0, *val;
  	u8 class = ctx->mgmt_class;
7ae9f2817   Michal Rostecki   samples: bpf: Rem...
101
102
  	bpf_printk("ib_umad read send : class 0x%x
  ", class);
0ac01febd   Ira Weiny   BPF: Add sample c...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  
  	val = bpf_map_lookup_elem(&read_count, &class);
  	if (!val) {
  		bpf_map_update_elem(&read_count, &class, &zero, BPF_NOEXIST);
  		val = bpf_map_lookup_elem(&read_count, &class);
  		if (!val)
  			return 0;
  	}
  
  	(*val) += 1;
  
  	return 0;
  }
  SEC("tracepoint/ib_umad/ib_umad_write")
  int on_ib_umad_write(struct ib_umad_rw_args *ctx)
  {
  	u64 zero = 0, *val;
  	u8 class = ctx->mgmt_class;
7ae9f2817   Michal Rostecki   samples: bpf: Rem...
121
122
  	bpf_printk("ib_umad write : class 0x%x
  ", class);
0ac01febd   Ira Weiny   BPF: Add sample c...
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  
  	val = bpf_map_lookup_elem(&write_count, &class);
  	if (!val) {
  		bpf_map_update_elem(&write_count, &class, &zero, BPF_NOEXIST);
  		val = bpf_map_lookup_elem(&write_count, &class);
  		if (!val)
  			return 0;
  	}
  
  	(*val) += 1;
  
  	return 0;
  }
  
  char _license[] SEC("license") = "GPL";