Skip to content

Commit e543002

Browse files
netoptimizerdavem330
authored andcommitted
qdisc: add tracepoint qdisc:qdisc_dequeue for dequeued SKBs
The main purpose of this tracepoint is to monitor bulk dequeue in the network qdisc layer, as it cannot be deducted from the existing qdisc stats. The txq_state can be used for determining the reason for zero packet dequeues, see enum netdev_queue_state_t. Notice all packets doesn't necessary activate this tracepoint. As qdiscs with flag TCQ_F_CAN_BYPASS, can directly invoke sch_direct_xmit() when qdisc_qlen is zero. Remember that perf record supports filters like: perf record -e qdisc:qdisc_dequeue \ --filter 'ifindex == 4 && (packets > 1 || txq_state > 0)' Signed-off-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7440ccc commit e543002

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

include/trace/events/qdisc.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#undef TRACE_SYSTEM
2+
#define TRACE_SYSTEM qdisc
3+
4+
#if !defined(_TRACE_QDISC_H) || defined(TRACE_HEADER_MULTI_READ)
5+
#define _TRACE_QDISC_H_
6+
7+
#include <linux/skbuff.h>
8+
#include <linux/netdevice.h>
9+
#include <linux/tracepoint.h>
10+
#include <linux/ftrace.h>
11+
12+
TRACE_EVENT(qdisc_dequeue,
13+
14+
TP_PROTO(struct Qdisc *qdisc, const struct netdev_queue *txq,
15+
int packets, struct sk_buff *skb),
16+
17+
TP_ARGS(qdisc, txq, packets, skb),
18+
19+
TP_STRUCT__entry(
20+
__field( struct Qdisc *, qdisc )
21+
__field(const struct netdev_queue *, txq )
22+
__field( int, packets )
23+
__field( void *, skbaddr )
24+
__field( int, ifindex )
25+
__field( u32, handle )
26+
__field( u32, parent )
27+
__field( unsigned long, txq_state)
28+
),
29+
30+
/* skb==NULL indicate packets dequeued was 0, even when packets==1 */
31+
TP_fast_assign(
32+
__entry->qdisc = qdisc;
33+
__entry->txq = txq;
34+
__entry->packets = skb ? packets : 0;
35+
__entry->skbaddr = skb;
36+
__entry->ifindex = txq->dev ? txq->dev->ifindex : 0;
37+
__entry->handle = qdisc->handle;
38+
__entry->parent = qdisc->parent;
39+
__entry->txq_state = txq->state;
40+
),
41+
42+
TP_printk("dequeue ifindex=%d qdisc handle=0x%X parent=0x%X txq_state=0x%lX packets=%d skbaddr=%p",
43+
__entry->ifindex, __entry->handle, __entry->parent,
44+
__entry->txq_state, __entry->packets, __entry->skbaddr )
45+
);
46+
47+
#endif /* _TRACE_QDISC_H_ */
48+
49+
/* This part must be outside protection */
50+
#include <trace/define_trace.h>

net/core/net-traces.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <trace/events/sock.h>
3333
#include <trace/events/udp.h>
3434
#include <trace/events/fib.h>
35+
#include <trace/events/qdisc.h>
3536
#if IS_ENABLED(CONFIG_IPV6)
3637
#include <trace/events/fib6.h>
3738
EXPORT_TRACEPOINT_SYMBOL_GPL(fib6_table_lookup);

net/sched/sch_generic.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <net/sch_generic.h>
3030
#include <net/pkt_sched.h>
3131
#include <net/dst.h>
32+
#include <trace/events/qdisc.h>
3233

3334
/* Qdisc to use by default */
3435
const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops;
@@ -126,7 +127,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
126127
q->q.qlen--;
127128
} else
128129
skb = NULL;
129-
return skb;
130+
goto trace;
130131
}
131132
*validate = true;
132133
skb = q->skb_bad_txq;
@@ -139,7 +140,8 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
139140
q->q.qlen--;
140141
goto bulk;
141142
}
142-
return NULL;
143+
skb = NULL;
144+
goto trace;
143145
}
144146
if (!(q->flags & TCQ_F_ONETXQUEUE) ||
145147
!netif_xmit_frozen_or_stopped(txq))
@@ -151,6 +153,8 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
151153
else
152154
try_bulk_dequeue_skb_slow(q, skb, packets);
153155
}
156+
trace:
157+
trace_qdisc_dequeue(q, txq, *packets, skb);
154158
return skb;
155159
}
156160

0 commit comments

Comments
 (0)