1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM xdp 4 5 #if !defined(_TRACE_XDP_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_XDP_H 7 8 #include <linux/netdevice.h> 9 #include <linux/filter.h> 10 #include <linux/tracepoint.h> 11 #include <linux/bpf.h> 12 #include <net/xdp.h> 13 14 #define __XDP_ACT_MAP(FN) \ 15 FN(ABORTED) \ 16 FN(DROP) \ 17 FN(PASS) \ 18 FN(TX) \ 19 FN(REDIRECT) 20 21 #define __XDP_ACT_TP_FN(x) \ 22 TRACE_DEFINE_ENUM(XDP_##x); 23 #define __XDP_ACT_SYM_FN(x) \ 24 { XDP_##x, #x }, 25 #define __XDP_ACT_SYM_TAB \ 26 __XDP_ACT_MAP(__XDP_ACT_SYM_FN) { -1, NULL } 27 __XDP_ACT_MAP(__XDP_ACT_TP_FN) 28 29 TRACE_EVENT(xdp_exception, 30 31 TP_PROTO(const struct net_device *dev, 32 const struct bpf_prog *xdp, u32 act), 33 34 TP_ARGS(dev, xdp, act), 35 36 TP_STRUCT__entry( 37 __field(int, prog_id) 38 __field(u32, act) 39 __field(int, ifindex) 40 ), 41 42 TP_fast_assign( 43 __entry->prog_id = xdp->aux->id; 44 __entry->act = act; 45 __entry->ifindex = dev->ifindex; 46 ), 47 48 TP_printk("prog_id=%d action=%s ifindex=%d", 49 __entry->prog_id, 50 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 51 __entry->ifindex) 52 ); 53 54 TRACE_EVENT(xdp_bulk_tx, 55 56 TP_PROTO(const struct net_device *dev, 57 int sent, int drops, int err), 58 59 TP_ARGS(dev, sent, drops, err), 60 61 TP_STRUCT__entry( 62 __field(int, ifindex) 63 __field(u32, act) 64 __field(int, drops) 65 __field(int, sent) 66 __field(int, err) 67 ), 68 69 TP_fast_assign( 70 __entry->ifindex = dev->ifindex; 71 __entry->act = XDP_TX; 72 __entry->drops = drops; 73 __entry->sent = sent; 74 __entry->err = err; 75 ), 76 77 TP_printk("ifindex=%d action=%s sent=%d drops=%d err=%d", 78 __entry->ifindex, 79 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 80 __entry->sent, __entry->drops, __entry->err) 81 ); 82 83 #ifndef __DEVMAP_OBJ_TYPE 84 #define __DEVMAP_OBJ_TYPE 85 struct _bpf_dtab_netdev { 86 struct net_device *dev; 87 }; 88 #endif /* __DEVMAP_OBJ_TYPE */ 89 90 DECLARE_EVENT_CLASS(xdp_redirect_template, 91 92 TP_PROTO(const struct net_device *dev, 93 const struct bpf_prog *xdp, 94 const void *tgt, int err, 95 enum bpf_map_type map_type, 96 u32 map_id, u32 index), 97 98 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index), 99 100 TP_STRUCT__entry( 101 __field(int, prog_id) 102 __field(u32, act) 103 __field(int, ifindex) 104 __field(int, err) 105 __field(int, to_ifindex) 106 __field(u32, map_id) 107 __field(int, map_index) 108 ), 109 110 TP_fast_assign( 111 u32 ifindex = 0, map_index = index; 112 113 if (map_type == BPF_MAP_TYPE_DEVMAP || map_type == BPF_MAP_TYPE_DEVMAP_HASH) { 114 /* Just leave to_ifindex to 0 if do broadcast redirect, 115 * as tgt will be NULL. 116 */ 117 if (tgt) 118 ifindex = ((struct _bpf_dtab_netdev *)tgt)->dev->ifindex; 119 } else if (map_type == BPF_MAP_TYPE_UNSPEC && map_id == INT_MAX) { 120 ifindex = index; 121 map_index = 0; 122 } 123 124 __entry->prog_id = xdp->aux->id; 125 __entry->act = XDP_REDIRECT; 126 __entry->ifindex = dev->ifindex; 127 __entry->err = err; 128 __entry->to_ifindex = ifindex; 129 __entry->map_id = map_id; 130 __entry->map_index = map_index; 131 ), 132 133 TP_printk("prog_id=%d action=%s ifindex=%d to_ifindex=%d err=%d" 134 " map_id=%d map_index=%d", 135 __entry->prog_id, 136 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 137 __entry->ifindex, __entry->to_ifindex, 138 __entry->err, __entry->map_id, __entry->map_index) 139 ); 140 141 DEFINE_EVENT(xdp_redirect_template, xdp_redirect, 142 TP_PROTO(const struct net_device *dev, 143 const struct bpf_prog *xdp, 144 const void *tgt, int err, 145 enum bpf_map_type map_type, 146 u32 map_id, u32 index), 147 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index) 148 ); 149 150 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_err, 151 TP_PROTO(const struct net_device *dev, 152 const struct bpf_prog *xdp, 153 const void *tgt, int err, 154 enum bpf_map_type map_type, 155 u32 map_id, u32 index), 156 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index) 157 ); 158 159 #define _trace_xdp_redirect(dev, xdp, to) \ 160 trace_xdp_redirect(dev, xdp, NULL, 0, BPF_MAP_TYPE_UNSPEC, INT_MAX, to) 161 162 #define _trace_xdp_redirect_err(dev, xdp, to, err) \ 163 trace_xdp_redirect_err(dev, xdp, NULL, err, BPF_MAP_TYPE_UNSPEC, INT_MAX, to) 164 165 #define _trace_xdp_redirect_map(dev, xdp, to, map_type, map_id, index) \ 166 trace_xdp_redirect(dev, xdp, to, 0, map_type, map_id, index) 167 168 #define _trace_xdp_redirect_map_err(dev, xdp, to, map_type, map_id, index, err) \ 169 trace_xdp_redirect_err(dev, xdp, to, err, map_type, map_id, index) 170 171 /* not used anymore, but kept around so as not to break old programs */ 172 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_map, 173 TP_PROTO(const struct net_device *dev, 174 const struct bpf_prog *xdp, 175 const void *tgt, int err, 176 enum bpf_map_type map_type, 177 u32 map_id, u32 index), 178 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index) 179 ); 180 181 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_map_err, 182 TP_PROTO(const struct net_device *dev, 183 const struct bpf_prog *xdp, 184 const void *tgt, int err, 185 enum bpf_map_type map_type, 186 u32 map_id, u32 index), 187 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index) 188 ); 189 190 TRACE_EVENT(xdp_cpumap_kthread, 191 192 TP_PROTO(int map_id, unsigned int processed, unsigned int drops, 193 int sched, struct xdp_cpumap_stats *xdp_stats), 194 195 TP_ARGS(map_id, processed, drops, sched, xdp_stats), 196 197 TP_STRUCT__entry( 198 __field(int, map_id) 199 __field(u32, act) 200 __field(int, cpu) 201 __field(unsigned int, drops) 202 __field(unsigned int, processed) 203 __field(int, sched) 204 __field(unsigned int, xdp_pass) 205 __field(unsigned int, xdp_drop) 206 __field(unsigned int, xdp_redirect) 207 ), 208 209 TP_fast_assign( 210 __entry->map_id = map_id; 211 __entry->act = XDP_REDIRECT; 212 __entry->cpu = smp_processor_id(); 213 __entry->drops = drops; 214 __entry->processed = processed; 215 __entry->sched = sched; 216 __entry->xdp_pass = xdp_stats->pass; 217 __entry->xdp_drop = xdp_stats->drop; 218 __entry->xdp_redirect = xdp_stats->redirect; 219 ), 220 221 TP_printk("kthread" 222 " cpu=%d map_id=%d action=%s" 223 " processed=%u drops=%u" 224 " sched=%d" 225 " xdp_pass=%u xdp_drop=%u xdp_redirect=%u", 226 __entry->cpu, __entry->map_id, 227 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 228 __entry->processed, __entry->drops, 229 __entry->sched, 230 __entry->xdp_pass, __entry->xdp_drop, __entry->xdp_redirect) 231 ); 232 233 TRACE_EVENT(xdp_cpumap_enqueue, 234 235 TP_PROTO(int map_id, unsigned int processed, unsigned int drops, 236 int to_cpu), 237 238 TP_ARGS(map_id, processed, drops, to_cpu), 239 240 TP_STRUCT__entry( 241 __field(int, map_id) 242 __field(u32, act) 243 __field(int, cpu) 244 __field(unsigned int, drops) 245 __field(unsigned int, processed) 246 __field(int, to_cpu) 247 ), 248 249 TP_fast_assign( 250 __entry->map_id = map_id; 251 __entry->act = XDP_REDIRECT; 252 __entry->cpu = smp_processor_id(); 253 __entry->drops = drops; 254 __entry->processed = processed; 255 __entry->to_cpu = to_cpu; 256 ), 257 258 TP_printk("enqueue" 259 " cpu=%d map_id=%d action=%s" 260 " processed=%u drops=%u" 261 " to_cpu=%d", 262 __entry->cpu, __entry->map_id, 263 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 264 __entry->processed, __entry->drops, 265 __entry->to_cpu) 266 ); 267 268 TRACE_EVENT(xdp_devmap_xmit, 269 270 TP_PROTO(const struct net_device *from_dev, 271 const struct net_device *to_dev, 272 int sent, int drops, int err), 273 274 TP_ARGS(from_dev, to_dev, sent, drops, err), 275 276 TP_STRUCT__entry( 277 __field(int, from_ifindex) 278 __field(u32, act) 279 __field(int, to_ifindex) 280 __field(int, drops) 281 __field(int, sent) 282 __field(int, err) 283 ), 284 285 TP_fast_assign( 286 __entry->from_ifindex = from_dev->ifindex; 287 __entry->act = XDP_REDIRECT; 288 __entry->to_ifindex = to_dev->ifindex; 289 __entry->drops = drops; 290 __entry->sent = sent; 291 __entry->err = err; 292 ), 293 294 TP_printk("ndo_xdp_xmit" 295 " from_ifindex=%d to_ifindex=%d action=%s" 296 " sent=%d drops=%d" 297 " err=%d", 298 __entry->from_ifindex, __entry->to_ifindex, 299 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 300 __entry->sent, __entry->drops, 301 __entry->err) 302 ); 303 304 /* Expect users already include <net/xdp.h>, but not xdp_priv.h */ 305 #include <net/xdp_priv.h> 306 307 #define __MEM_TYPE_MAP(FN) \ 308 FN(PAGE_SHARED) \ 309 FN(PAGE_ORDER0) \ 310 FN(PAGE_POOL) \ 311 FN(XSK_BUFF_POOL) 312 313 #define __MEM_TYPE_TP_FN(x) \ 314 TRACE_DEFINE_ENUM(MEM_TYPE_##x); 315 #define __MEM_TYPE_SYM_FN(x) \ 316 { MEM_TYPE_##x, #x }, 317 #define __MEM_TYPE_SYM_TAB \ 318 __MEM_TYPE_MAP(__MEM_TYPE_SYM_FN) { -1, 0 } 319 __MEM_TYPE_MAP(__MEM_TYPE_TP_FN) 320 321 TRACE_EVENT(mem_disconnect, 322 323 TP_PROTO(const struct xdp_mem_allocator *xa), 324 325 TP_ARGS(xa), 326 327 TP_STRUCT__entry( 328 __field(const struct xdp_mem_allocator *, xa) 329 __field(u32, mem_id) 330 __field(u32, mem_type) 331 __field(const void *, allocator) 332 ), 333 334 TP_fast_assign( 335 __entry->xa = xa; 336 __entry->mem_id = xa->mem.id; 337 __entry->mem_type = xa->mem.type; 338 __entry->allocator = xa->allocator; 339 ), 340 341 TP_printk("mem_id=%d mem_type=%s allocator=%p", 342 __entry->mem_id, 343 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB), 344 __entry->allocator 345 ) 346 ); 347 348 TRACE_EVENT(mem_connect, 349 350 TP_PROTO(const struct xdp_mem_allocator *xa, 351 const struct xdp_rxq_info *rxq), 352 353 TP_ARGS(xa, rxq), 354 355 TP_STRUCT__entry( 356 __field(const struct xdp_mem_allocator *, xa) 357 __field(u32, mem_id) 358 __field(u32, mem_type) 359 __field(const void *, allocator) 360 __field(const struct xdp_rxq_info *, rxq) 361 __field(int, ifindex) 362 ), 363 364 TP_fast_assign( 365 __entry->xa = xa; 366 __entry->mem_id = xa->mem.id; 367 __entry->mem_type = xa->mem.type; 368 __entry->allocator = xa->allocator; 369 __entry->rxq = rxq; 370 __entry->ifindex = rxq->dev->ifindex; 371 ), 372 373 TP_printk("mem_id=%d mem_type=%s allocator=%p" 374 " ifindex=%d", 375 __entry->mem_id, 376 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB), 377 __entry->allocator, 378 __entry->ifindex 379 ) 380 ); 381 382 TRACE_EVENT(mem_return_failed, 383 384 TP_PROTO(const struct xdp_mem_info *mem, 385 const struct page *page), 386 387 TP_ARGS(mem, page), 388 389 TP_STRUCT__entry( 390 __field(const struct page *, page) 391 __field(u32, mem_id) 392 __field(u32, mem_type) 393 ), 394 395 TP_fast_assign( 396 __entry->page = page; 397 __entry->mem_id = mem->id; 398 __entry->mem_type = mem->type; 399 ), 400 401 TP_printk("mem_id=%d mem_type=%s page=%p", 402 __entry->mem_id, 403 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB), 404 __entry->page 405 ) 406 ); 407 408 TRACE_EVENT(bpf_xdp_link_attach_failed, 409 410 TP_PROTO(const char *msg), 411 412 TP_ARGS(msg), 413 414 TP_STRUCT__entry( 415 __string(msg, msg) 416 ), 417 418 TP_fast_assign( 419 __assign_str(msg); 420 ), 421 422 TP_printk("errmsg=%s", __get_str(msg)) 423 ); 424 425 #endif /* _TRACE_XDP_H */ 426 427 #include <trace/define_trace.h> 428