10ac01febSIra Weiny // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
20ac01febSIra Weiny
34ce7d68bSAditya Srivastava /*
40ac01febSIra Weiny * ibumad BPF sample kernel side
50ac01febSIra Weiny *
60ac01febSIra Weiny * This program is free software; you can redistribute it and/or
70ac01febSIra Weiny * modify it under the terms of version 2 of the GNU General Public
80ac01febSIra Weiny * License as published by the Free Software Foundation.
90ac01febSIra Weiny *
100ac01febSIra Weiny * Copyright(c) 2018 Ira Weiny, Intel Corporation
110ac01febSIra Weiny */
120ac01febSIra Weiny
130ac01febSIra Weiny #define KBUILD_MODNAME "ibumad_count_pkts_by_class"
140ac01febSIra Weiny #include <uapi/linux/bpf.h>
150ac01febSIra Weiny
167cf245a3SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
170ac01febSIra Weiny
180ac01febSIra Weiny
19763af200SDaniel T. Lee struct {
20763af200SDaniel T. Lee __uint(type, BPF_MAP_TYPE_ARRAY);
21763af200SDaniel T. Lee __type(key, u32); /* class; u32 required */
22763af200SDaniel T. Lee __type(value, u64); /* count of mads read */
23763af200SDaniel T. Lee __uint(max_entries, 256); /* Room for all Classes */
24763af200SDaniel T. Lee } read_count SEC(".maps");
250ac01febSIra Weiny
26763af200SDaniel T. Lee struct {
27763af200SDaniel T. Lee __uint(type, BPF_MAP_TYPE_ARRAY);
28763af200SDaniel T. Lee __type(key, u32); /* class; u32 required */
29763af200SDaniel T. Lee __type(value, u64); /* count of mads written */
30763af200SDaniel T. Lee __uint(max_entries, 256); /* Room for all Classes */
31763af200SDaniel T. Lee } write_count SEC(".maps");
320ac01febSIra Weiny
330ac01febSIra Weiny #undef DEBUG
347ae9f281SMichal Rostecki #ifndef DEBUG
357ae9f281SMichal Rostecki #undef bpf_printk
367ae9f281SMichal Rostecki #define bpf_printk(fmt, ...)
370ac01febSIra Weiny #endif
380ac01febSIra Weiny
390ac01febSIra Weiny /* Taken from the current format defined in
400ac01febSIra Weiny * include/trace/events/ib_umad.h
410ac01febSIra Weiny * and
42*27d7fdf0SRoss Zwisler * /sys/kernel/tracing/events/ib_umad/ib_umad_read/format
43*27d7fdf0SRoss Zwisler * /sys/kernel/tracing/events/ib_umad/ib_umad_write/format
440ac01febSIra Weiny */
450ac01febSIra Weiny struct ib_umad_rw_args {
460ac01febSIra Weiny u64 pad;
470ac01febSIra Weiny u8 port_num;
480ac01febSIra Weiny u8 sl;
490ac01febSIra Weiny u8 path_bits;
500ac01febSIra Weiny u8 grh_present;
510ac01febSIra Weiny u32 id;
520ac01febSIra Weiny u32 status;
530ac01febSIra Weiny u32 timeout_ms;
540ac01febSIra Weiny u32 retires;
550ac01febSIra Weiny u32 length;
560ac01febSIra Weiny u32 qpn;
570ac01febSIra Weiny u32 qkey;
580ac01febSIra Weiny u8 gid_index;
590ac01febSIra Weiny u8 hop_limit;
600ac01febSIra Weiny u16 lid;
610ac01febSIra Weiny u16 attr_id;
620ac01febSIra Weiny u16 pkey_index;
630ac01febSIra Weiny u8 base_version;
640ac01febSIra Weiny u8 mgmt_class;
650ac01febSIra Weiny u8 class_version;
660ac01febSIra Weiny u8 method;
670ac01febSIra Weiny u32 flow_label;
680ac01febSIra Weiny u16 mad_status;
690ac01febSIra Weiny u16 class_specific;
700ac01febSIra Weiny u32 attr_mod;
710ac01febSIra Weiny u64 tid;
720ac01febSIra Weiny u8 gid[16];
730ac01febSIra Weiny u32 dev_index;
740ac01febSIra Weiny u8 traffic_class;
750ac01febSIra Weiny };
760ac01febSIra Weiny
770ac01febSIra Weiny SEC("tracepoint/ib_umad/ib_umad_read_recv")
on_ib_umad_read_recv(struct ib_umad_rw_args * ctx)780ac01febSIra Weiny int on_ib_umad_read_recv(struct ib_umad_rw_args *ctx)
790ac01febSIra Weiny {
800ac01febSIra Weiny u64 zero = 0, *val;
810ac01febSIra Weiny u8 class = ctx->mgmt_class;
820ac01febSIra Weiny
837ae9f281SMichal Rostecki bpf_printk("ib_umad read recv : class 0x%x\n", class);
840ac01febSIra Weiny
850ac01febSIra Weiny val = bpf_map_lookup_elem(&read_count, &class);
860ac01febSIra Weiny if (!val) {
870ac01febSIra Weiny bpf_map_update_elem(&read_count, &class, &zero, BPF_NOEXIST);
880ac01febSIra Weiny val = bpf_map_lookup_elem(&read_count, &class);
890ac01febSIra Weiny if (!val)
900ac01febSIra Weiny return 0;
910ac01febSIra Weiny }
920ac01febSIra Weiny
930ac01febSIra Weiny (*val) += 1;
940ac01febSIra Weiny
950ac01febSIra Weiny return 0;
960ac01febSIra Weiny }
970ac01febSIra Weiny SEC("tracepoint/ib_umad/ib_umad_read_send")
on_ib_umad_read_send(struct ib_umad_rw_args * ctx)980ac01febSIra Weiny int on_ib_umad_read_send(struct ib_umad_rw_args *ctx)
990ac01febSIra Weiny {
1000ac01febSIra Weiny u64 zero = 0, *val;
1010ac01febSIra Weiny u8 class = ctx->mgmt_class;
1020ac01febSIra Weiny
1037ae9f281SMichal Rostecki bpf_printk("ib_umad read send : class 0x%x\n", class);
1040ac01febSIra Weiny
1050ac01febSIra Weiny val = bpf_map_lookup_elem(&read_count, &class);
1060ac01febSIra Weiny if (!val) {
1070ac01febSIra Weiny bpf_map_update_elem(&read_count, &class, &zero, BPF_NOEXIST);
1080ac01febSIra Weiny val = bpf_map_lookup_elem(&read_count, &class);
1090ac01febSIra Weiny if (!val)
1100ac01febSIra Weiny return 0;
1110ac01febSIra Weiny }
1120ac01febSIra Weiny
1130ac01febSIra Weiny (*val) += 1;
1140ac01febSIra Weiny
1150ac01febSIra Weiny return 0;
1160ac01febSIra Weiny }
1170ac01febSIra Weiny SEC("tracepoint/ib_umad/ib_umad_write")
on_ib_umad_write(struct ib_umad_rw_args * ctx)1180ac01febSIra Weiny int on_ib_umad_write(struct ib_umad_rw_args *ctx)
1190ac01febSIra Weiny {
1200ac01febSIra Weiny u64 zero = 0, *val;
1210ac01febSIra Weiny u8 class = ctx->mgmt_class;
1220ac01febSIra Weiny
1237ae9f281SMichal Rostecki bpf_printk("ib_umad write : class 0x%x\n", class);
1240ac01febSIra Weiny
1250ac01febSIra Weiny val = bpf_map_lookup_elem(&write_count, &class);
1260ac01febSIra Weiny if (!val) {
1270ac01febSIra Weiny bpf_map_update_elem(&write_count, &class, &zero, BPF_NOEXIST);
1280ac01febSIra Weiny val = bpf_map_lookup_elem(&write_count, &class);
1290ac01febSIra Weiny if (!val)
1300ac01febSIra Weiny return 0;
1310ac01febSIra Weiny }
1320ac01febSIra Weiny
1330ac01febSIra Weiny (*val) += 1;
1340ac01febSIra Weiny
1350ac01febSIra Weiny return 0;
1360ac01febSIra Weiny }
1370ac01febSIra Weiny
1380ac01febSIra Weiny char _license[] SEC("license") = "GPL";
139