diff mbox series

[net-next,2/2] qdisc: add tracepoint qdisc:qdisc_requeue for requeued SKBs

Message ID 20210711050007.1200-2-xiangxia.m.yue@gmail.com (mailing list archive)
State Deferred
Delegated to: Netdev Maintainers
Headers show
Series [net-next,1/2] qdisc: add tracepoint qdisc:qdisc_enqueue for enqueued SKBs | expand

Checks

Context Check Description
netdev/apply fail Patch does not apply to net-next
netdev/tree_selection success Clearly marked for net-next

Commit Message

Tonghao Zhang July 11, 2021, 5 a.m. UTC
From: Tonghao Zhang <xiangxia.m.yue@gmail.com>

The main purpose of this tracepoint is to monitor what,
how many and why packets were requeued. The txq_state can
be used for determining the reason for packets requeued.

Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com>
---
 include/trace/events/qdisc.h | 32 ++++++++++++++++++++++++++++++++
 net/sched/sch_generic.c      |  8 +++++---
 2 files changed, 37 insertions(+), 3 deletions(-)

Comments

Cong Wang July 12, 2021, 3:51 a.m. UTC | #1
On Sat, Jul 10, 2021 at 10:00 PM <xiangxia.m.yue@gmail.com> wrote:
>
> From: Tonghao Zhang <xiangxia.m.yue@gmail.com>
>
> The main purpose of this tracepoint is to monitor what,
> how many and why packets were requeued. The txq_state can
> be used for determining the reason for packets requeued.

Hmm, how can I figure out the requeue is caused by
validate_xmit_skb_list() when it returns again==true?
I fail to see you trace it.

For the other case, we can figure it out by trace_net_dev_xmit().

So, in short, your patch looks useless.

Thanks.
Tonghao Zhang July 12, 2021, 4:17 a.m. UTC | #2
On Mon, Jul 12, 2021 at 11:51 AM Cong Wang <xiyou.wangcong@gmail.com> wrote:
>
> On Sat, Jul 10, 2021 at 10:00 PM <xiangxia.m.yue@gmail.com> wrote:
> >
> > From: Tonghao Zhang <xiangxia.m.yue@gmail.com>
> >
> > The main purpose of this tracepoint is to monitor what,
> > how many and why packets were requeued. The txq_state can
> > be used for determining the reason for packets requeued.
>
> Hmm, how can I figure out the requeue is caused by
> validate_xmit_skb_list() when it returns again==true?
> I fail to see you trace it.
This patch looks not good.
> For the other case, we can figure it out by trace_net_dev_xmit().
> So, in short, your patch looks useless.
>
> Thanks.



--
Best regards, Tonghao
Tonghao Zhang July 13, 2021, 2:06 a.m. UTC | #3
On Mon, Jul 12, 2021 at 12:17 PM Tonghao Zhang <xiangxia.m.yue@gmail.com> wrote:
>
> On Mon, Jul 12, 2021 at 11:51 AM Cong Wang <xiyou.wangcong@gmail.com> wrote:
> >
> > On Sat, Jul 10, 2021 at 10:00 PM <xiangxia.m.yue@gmail.com> wrote:
> > >
> > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com>
> > >
> > > The main purpose of this tracepoint is to monitor what,
> > > how many and why packets were requeued. The txq_state can
> > > be used for determining the reason for packets requeued.
> >
> > Hmm, how can I figure out the requeue is caused by
> > validate_xmit_skb_list() when it returns again==true?
Hi cong
Consider this patch again.
The main purpose of this tracepoint is to monitor what, how many and
why packets were requeued.
So should we figure out packets required by validate_xmit_skb_list or
dev_hard_start_xmit ?
because we may want to know what packets were requeued and how many.

if we should figure out, we can add more arg for trace, right ?
> > I fail to see you trace it.
> This patch looks not good.
> > For the other case, we can figure it out by trace_net_dev_xmit().
> > So, in short, your patch looks useless.
> >
> > Thanks.
>
>
>
> --
> Best regards, Tonghao



--
Best regards, Tonghao
Cong Wang July 15, 2021, 4:24 a.m. UTC | #4
On Mon, Jul 12, 2021 at 7:07 PM Tonghao Zhang <xiangxia.m.yue@gmail.com> wrote:
>
> On Mon, Jul 12, 2021 at 12:17 PM Tonghao Zhang <xiangxia.m.yue@gmail.com> wrote:
> >
> > On Mon, Jul 12, 2021 at 11:51 AM Cong Wang <xiyou.wangcong@gmail.com> wrote:
> > >
> > > On Sat, Jul 10, 2021 at 10:00 PM <xiangxia.m.yue@gmail.com> wrote:
> > > >
> > > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com>
> > > >
> > > > The main purpose of this tracepoint is to monitor what,
> > > > how many and why packets were requeued. The txq_state can
> > > > be used for determining the reason for packets requeued.
> > >
> > > Hmm, how can I figure out the requeue is caused by
> > > validate_xmit_skb_list() when it returns again==true?
> Hi cong
> Consider this patch again.
> The main purpose of this tracepoint is to monitor what, how many and
> why packets were requeued.
> So should we figure out packets required by validate_xmit_skb_list or
> dev_hard_start_xmit ?
> because we may want to know what packets were requeued and how many.
>
> if we should figure out, we can add more arg for trace, right ?

Figuring out which case is important to determine the cause,
so you have to fix it to make it useful.

Thanks.
diff mbox series

Patch

diff --git a/include/trace/events/qdisc.h b/include/trace/events/qdisc.h
index b0e76237bb74..c6187a8fc103 100644
--- a/include/trace/events/qdisc.h
+++ b/include/trace/events/qdisc.h
@@ -78,6 +78,38 @@  TRACE_EVENT(qdisc_dequeue,
 		  __entry->txq_state, __entry->packets, __entry->skbaddr )
 );
 
+TRACE_EVENT(qdisc_requeue,
+
+	TP_PROTO(struct sk_buff *skb, struct Qdisc *qdisc,
+		 const struct netdev_queue *txq),
+
+	TP_ARGS(skb, qdisc, txq),
+
+	TP_STRUCT__entry(
+		__field(	struct Qdisc *,		qdisc	)
+		__field(const	struct netdev_queue *,	txq	)
+		__field(	void *,			skbaddr	)
+		__field(	int,			ifindex	)
+		__field(	u32,			handle	)
+		__field(	u32,			parent	)
+		__field(	unsigned long,		txq_state)
+	),
+
+	TP_fast_assign(
+		__entry->qdisc		= qdisc;
+		__entry->txq		= txq;
+		__entry->skbaddr	= skb;
+		__entry->ifindex	= txq->dev ? txq->dev->ifindex : 0;
+		__entry->handle		= qdisc->handle;
+		__entry->parent		= qdisc->parent;
+		__entry->txq_state	= txq->state;
+	),
+
+	TP_printk("requeue ifindex=%d qdisc handle=0x%X parent=0x%X txq_state=0x%lX skbaddr=%p",
+		  __entry->ifindex, __entry->handle, __entry->parent,
+		  __entry->txq_state, __entry->skbaddr)
+);
+
 TRACE_EVENT(qdisc_reset,
 
 	TP_PROTO(struct Qdisc *q),
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 75605075178f..0701d1e9d221 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -137,7 +137,8 @@  static inline void qdisc_enqueue_skb_bad_txq(struct Qdisc *q,
 		spin_unlock(lock);
 }
 
-static inline void dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q)
+static inline void dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q,
+				   struct netdev_queue *txq)
 {
 	spinlock_t *lock = NULL;
 
@@ -149,6 +150,7 @@  static inline void dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q)
 	while (skb) {
 		struct sk_buff *next = skb->next;
 
+		trace_qdisc_requeue(skb, q, txq);
 		__skb_queue_tail(&q->gso_skb, skb);
 
 		/* it's still part of the queue */
@@ -325,7 +327,7 @@  bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
 		if (root_lock)
 			spin_lock(root_lock);
 
-		dev_requeue_skb(skb, q);
+		dev_requeue_skb(skb, q, txq);
 		return false;
 	}
 #endif
@@ -353,7 +355,7 @@  bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
 			net_warn_ratelimited("BUG %s code %d qlen %d\n",
 					     dev->name, ret, q->q.qlen);
 
-		dev_requeue_skb(skb, q);
+		dev_requeue_skb(skb, q, txq);
 		return false;
 	}