0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM xdp
0004
0005 #if !defined(_TRACE_XDP_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_XDP_H
0007
0008 #include <linux/netdevice.h>
0009 #include <linux/filter.h>
0010 #include <linux/tracepoint.h>
0011 #include <linux/bpf.h>
0012
0013 #define __XDP_ACT_MAP(FN) \
0014 FN(ABORTED) \
0015 FN(DROP) \
0016 FN(PASS) \
0017 FN(TX) \
0018 FN(REDIRECT)
0019
0020 #define __XDP_ACT_TP_FN(x) \
0021 TRACE_DEFINE_ENUM(XDP_##x);
0022 #define __XDP_ACT_SYM_FN(x) \
0023 { XDP_##x, #x },
0024 #define __XDP_ACT_SYM_TAB \
0025 __XDP_ACT_MAP(__XDP_ACT_SYM_FN) { -1, NULL }
0026 __XDP_ACT_MAP(__XDP_ACT_TP_FN)
0027
0028 TRACE_EVENT(xdp_exception,
0029
0030 TP_PROTO(const struct net_device *dev,
0031 const struct bpf_prog *xdp, u32 act),
0032
0033 TP_ARGS(dev, xdp, act),
0034
0035 TP_STRUCT__entry(
0036 __field(int, prog_id)
0037 __field(u32, act)
0038 __field(int, ifindex)
0039 ),
0040
0041 TP_fast_assign(
0042 __entry->prog_id = xdp->aux->id;
0043 __entry->act = act;
0044 __entry->ifindex = dev->ifindex;
0045 ),
0046
0047 TP_printk("prog_id=%d action=%s ifindex=%d",
0048 __entry->prog_id,
0049 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0050 __entry->ifindex)
0051 );
0052
0053 TRACE_EVENT(xdp_bulk_tx,
0054
0055 TP_PROTO(const struct net_device *dev,
0056 int sent, int drops, int err),
0057
0058 TP_ARGS(dev, sent, drops, err),
0059
0060 TP_STRUCT__entry(
0061 __field(int, ifindex)
0062 __field(u32, act)
0063 __field(int, drops)
0064 __field(int, sent)
0065 __field(int, err)
0066 ),
0067
0068 TP_fast_assign(
0069 __entry->ifindex = dev->ifindex;
0070 __entry->act = XDP_TX;
0071 __entry->drops = drops;
0072 __entry->sent = sent;
0073 __entry->err = err;
0074 ),
0075
0076 TP_printk("ifindex=%d action=%s sent=%d drops=%d err=%d",
0077 __entry->ifindex,
0078 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0079 __entry->sent, __entry->drops, __entry->err)
0080 );
0081
0082 #ifndef __DEVMAP_OBJ_TYPE
0083 #define __DEVMAP_OBJ_TYPE
0084 struct _bpf_dtab_netdev {
0085 struct net_device *dev;
0086 };
0087 #endif
0088
0089 DECLARE_EVENT_CLASS(xdp_redirect_template,
0090
0091 TP_PROTO(const struct net_device *dev,
0092 const struct bpf_prog *xdp,
0093 const void *tgt, int err,
0094 enum bpf_map_type map_type,
0095 u32 map_id, u32 index),
0096
0097 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index),
0098
0099 TP_STRUCT__entry(
0100 __field(int, prog_id)
0101 __field(u32, act)
0102 __field(int, ifindex)
0103 __field(int, err)
0104 __field(int, to_ifindex)
0105 __field(u32, map_id)
0106 __field(int, map_index)
0107 ),
0108
0109 TP_fast_assign(
0110 u32 ifindex = 0, map_index = index;
0111
0112 if (map_type == BPF_MAP_TYPE_DEVMAP || map_type == BPF_MAP_TYPE_DEVMAP_HASH) {
0113
0114
0115
0116 if (tgt)
0117 ifindex = ((struct _bpf_dtab_netdev *)tgt)->dev->ifindex;
0118 } else if (map_type == BPF_MAP_TYPE_UNSPEC && map_id == INT_MAX) {
0119 ifindex = index;
0120 map_index = 0;
0121 }
0122
0123 __entry->prog_id = xdp->aux->id;
0124 __entry->act = XDP_REDIRECT;
0125 __entry->ifindex = dev->ifindex;
0126 __entry->err = err;
0127 __entry->to_ifindex = ifindex;
0128 __entry->map_id = map_id;
0129 __entry->map_index = map_index;
0130 ),
0131
0132 TP_printk("prog_id=%d action=%s ifindex=%d to_ifindex=%d err=%d"
0133 " map_id=%d map_index=%d",
0134 __entry->prog_id,
0135 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0136 __entry->ifindex, __entry->to_ifindex,
0137 __entry->err, __entry->map_id, __entry->map_index)
0138 );
0139
0140 DEFINE_EVENT(xdp_redirect_template, xdp_redirect,
0141 TP_PROTO(const struct net_device *dev,
0142 const struct bpf_prog *xdp,
0143 const void *tgt, int err,
0144 enum bpf_map_type map_type,
0145 u32 map_id, u32 index),
0146 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index)
0147 );
0148
0149 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_err,
0150 TP_PROTO(const struct net_device *dev,
0151 const struct bpf_prog *xdp,
0152 const void *tgt, int err,
0153 enum bpf_map_type map_type,
0154 u32 map_id, u32 index),
0155 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index)
0156 );
0157
0158 #define _trace_xdp_redirect(dev, xdp, to) \
0159 trace_xdp_redirect(dev, xdp, NULL, 0, BPF_MAP_TYPE_UNSPEC, INT_MAX, to)
0160
0161 #define _trace_xdp_redirect_err(dev, xdp, to, err) \
0162 trace_xdp_redirect_err(dev, xdp, NULL, err, BPF_MAP_TYPE_UNSPEC, INT_MAX, to)
0163
0164 #define _trace_xdp_redirect_map(dev, xdp, to, map_type, map_id, index) \
0165 trace_xdp_redirect(dev, xdp, to, 0, map_type, map_id, index)
0166
0167 #define _trace_xdp_redirect_map_err(dev, xdp, to, map_type, map_id, index, err) \
0168 trace_xdp_redirect_err(dev, xdp, to, err, map_type, map_id, index)
0169
0170
0171 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_map,
0172 TP_PROTO(const struct net_device *dev,
0173 const struct bpf_prog *xdp,
0174 const void *tgt, int err,
0175 enum bpf_map_type map_type,
0176 u32 map_id, u32 index),
0177 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index)
0178 );
0179
0180 DEFINE_EVENT(xdp_redirect_template, xdp_redirect_map_err,
0181 TP_PROTO(const struct net_device *dev,
0182 const struct bpf_prog *xdp,
0183 const void *tgt, int err,
0184 enum bpf_map_type map_type,
0185 u32 map_id, u32 index),
0186 TP_ARGS(dev, xdp, tgt, err, map_type, map_id, index)
0187 );
0188
0189 TRACE_EVENT(xdp_cpumap_kthread,
0190
0191 TP_PROTO(int map_id, unsigned int processed, unsigned int drops,
0192 int sched, struct xdp_cpumap_stats *xdp_stats),
0193
0194 TP_ARGS(map_id, processed, drops, sched, xdp_stats),
0195
0196 TP_STRUCT__entry(
0197 __field(int, map_id)
0198 __field(u32, act)
0199 __field(int, cpu)
0200 __field(unsigned int, drops)
0201 __field(unsigned int, processed)
0202 __field(int, sched)
0203 __field(unsigned int, xdp_pass)
0204 __field(unsigned int, xdp_drop)
0205 __field(unsigned int, xdp_redirect)
0206 ),
0207
0208 TP_fast_assign(
0209 __entry->map_id = map_id;
0210 __entry->act = XDP_REDIRECT;
0211 __entry->cpu = smp_processor_id();
0212 __entry->drops = drops;
0213 __entry->processed = processed;
0214 __entry->sched = sched;
0215 __entry->xdp_pass = xdp_stats->pass;
0216 __entry->xdp_drop = xdp_stats->drop;
0217 __entry->xdp_redirect = xdp_stats->redirect;
0218 ),
0219
0220 TP_printk("kthread"
0221 " cpu=%d map_id=%d action=%s"
0222 " processed=%u drops=%u"
0223 " sched=%d"
0224 " xdp_pass=%u xdp_drop=%u xdp_redirect=%u",
0225 __entry->cpu, __entry->map_id,
0226 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0227 __entry->processed, __entry->drops,
0228 __entry->sched,
0229 __entry->xdp_pass, __entry->xdp_drop, __entry->xdp_redirect)
0230 );
0231
0232 TRACE_EVENT(xdp_cpumap_enqueue,
0233
0234 TP_PROTO(int map_id, unsigned int processed, unsigned int drops,
0235 int to_cpu),
0236
0237 TP_ARGS(map_id, processed, drops, to_cpu),
0238
0239 TP_STRUCT__entry(
0240 __field(int, map_id)
0241 __field(u32, act)
0242 __field(int, cpu)
0243 __field(unsigned int, drops)
0244 __field(unsigned int, processed)
0245 __field(int, to_cpu)
0246 ),
0247
0248 TP_fast_assign(
0249 __entry->map_id = map_id;
0250 __entry->act = XDP_REDIRECT;
0251 __entry->cpu = smp_processor_id();
0252 __entry->drops = drops;
0253 __entry->processed = processed;
0254 __entry->to_cpu = to_cpu;
0255 ),
0256
0257 TP_printk("enqueue"
0258 " cpu=%d map_id=%d action=%s"
0259 " processed=%u drops=%u"
0260 " to_cpu=%d",
0261 __entry->cpu, __entry->map_id,
0262 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0263 __entry->processed, __entry->drops,
0264 __entry->to_cpu)
0265 );
0266
0267 TRACE_EVENT(xdp_devmap_xmit,
0268
0269 TP_PROTO(const struct net_device *from_dev,
0270 const struct net_device *to_dev,
0271 int sent, int drops, int err),
0272
0273 TP_ARGS(from_dev, to_dev, sent, drops, err),
0274
0275 TP_STRUCT__entry(
0276 __field(int, from_ifindex)
0277 __field(u32, act)
0278 __field(int, to_ifindex)
0279 __field(int, drops)
0280 __field(int, sent)
0281 __field(int, err)
0282 ),
0283
0284 TP_fast_assign(
0285 __entry->from_ifindex = from_dev->ifindex;
0286 __entry->act = XDP_REDIRECT;
0287 __entry->to_ifindex = to_dev->ifindex;
0288 __entry->drops = drops;
0289 __entry->sent = sent;
0290 __entry->err = err;
0291 ),
0292
0293 TP_printk("ndo_xdp_xmit"
0294 " from_ifindex=%d to_ifindex=%d action=%s"
0295 " sent=%d drops=%d"
0296 " err=%d",
0297 __entry->from_ifindex, __entry->to_ifindex,
0298 __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
0299 __entry->sent, __entry->drops,
0300 __entry->err)
0301 );
0302
0303
0304 #include <net/xdp_priv.h>
0305
0306 #define __MEM_TYPE_MAP(FN) \
0307 FN(PAGE_SHARED) \
0308 FN(PAGE_ORDER0) \
0309 FN(PAGE_POOL) \
0310 FN(XSK_BUFF_POOL)
0311
0312 #define __MEM_TYPE_TP_FN(x) \
0313 TRACE_DEFINE_ENUM(MEM_TYPE_##x);
0314 #define __MEM_TYPE_SYM_FN(x) \
0315 { MEM_TYPE_##x, #x },
0316 #define __MEM_TYPE_SYM_TAB \
0317 __MEM_TYPE_MAP(__MEM_TYPE_SYM_FN) { -1, 0 }
0318 __MEM_TYPE_MAP(__MEM_TYPE_TP_FN)
0319
0320 TRACE_EVENT(mem_disconnect,
0321
0322 TP_PROTO(const struct xdp_mem_allocator *xa),
0323
0324 TP_ARGS(xa),
0325
0326 TP_STRUCT__entry(
0327 __field(const struct xdp_mem_allocator *, xa)
0328 __field(u32, mem_id)
0329 __field(u32, mem_type)
0330 __field(const void *, allocator)
0331 ),
0332
0333 TP_fast_assign(
0334 __entry->xa = xa;
0335 __entry->mem_id = xa->mem.id;
0336 __entry->mem_type = xa->mem.type;
0337 __entry->allocator = xa->allocator;
0338 ),
0339
0340 TP_printk("mem_id=%d mem_type=%s allocator=%p",
0341 __entry->mem_id,
0342 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB),
0343 __entry->allocator
0344 )
0345 );
0346
0347 TRACE_EVENT(mem_connect,
0348
0349 TP_PROTO(const struct xdp_mem_allocator *xa,
0350 const struct xdp_rxq_info *rxq),
0351
0352 TP_ARGS(xa, rxq),
0353
0354 TP_STRUCT__entry(
0355 __field(const struct xdp_mem_allocator *, xa)
0356 __field(u32, mem_id)
0357 __field(u32, mem_type)
0358 __field(const void *, allocator)
0359 __field(const struct xdp_rxq_info *, rxq)
0360 __field(int, ifindex)
0361 ),
0362
0363 TP_fast_assign(
0364 __entry->xa = xa;
0365 __entry->mem_id = xa->mem.id;
0366 __entry->mem_type = xa->mem.type;
0367 __entry->allocator = xa->allocator;
0368 __entry->rxq = rxq;
0369 __entry->ifindex = rxq->dev->ifindex;
0370 ),
0371
0372 TP_printk("mem_id=%d mem_type=%s allocator=%p"
0373 " ifindex=%d",
0374 __entry->mem_id,
0375 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB),
0376 __entry->allocator,
0377 __entry->ifindex
0378 )
0379 );
0380
0381 TRACE_EVENT(mem_return_failed,
0382
0383 TP_PROTO(const struct xdp_mem_info *mem,
0384 const struct page *page),
0385
0386 TP_ARGS(mem, page),
0387
0388 TP_STRUCT__entry(
0389 __field(const struct page *, page)
0390 __field(u32, mem_id)
0391 __field(u32, mem_type)
0392 ),
0393
0394 TP_fast_assign(
0395 __entry->page = page;
0396 __entry->mem_id = mem->id;
0397 __entry->mem_type = mem->type;
0398 ),
0399
0400 TP_printk("mem_id=%d mem_type=%s page=%p",
0401 __entry->mem_id,
0402 __print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB),
0403 __entry->page
0404 )
0405 );
0406
0407 #endif
0408
0409 #include <trace/define_trace.h>