Commit 29b86cda authored by John Fastabend's avatar John Fastabend Committed by David S. Miller

net: sched: remove remaining uses for qdisc_qlen in xmit path

sch_direct_xmit() uses qdisc_qlen as a return value but all call sites
of the routine only check if it is zero or not. Simplify the logic so
that we don't need to return an actual queue length value.

This introduces a case now where sch_direct_xmit would have returned
a qlen of zero but now it returns true. However in this case all
call sites of sch_direct_xmit will implement a dequeue() and get
a null skb and abort. This trades tracking qlen in the hotpath for
an extra dequeue operation. Overall this seems to be good for
performance.
Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b3ba914
...@@ -105,9 +105,9 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, ...@@ -105,9 +105,9 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
void qdisc_put_rtab(struct qdisc_rate_table *tab); void qdisc_put_rtab(struct qdisc_rate_table *tab);
void qdisc_put_stab(struct qdisc_size_table *tab); void qdisc_put_stab(struct qdisc_size_table *tab);
void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc); void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc);
int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
struct net_device *dev, struct netdev_queue *txq, struct net_device *dev, struct netdev_queue *txq,
spinlock_t *root_lock, bool validate); spinlock_t *root_lock, bool validate);
void __qdisc_run(struct Qdisc *q); void __qdisc_run(struct Qdisc *q);
......
...@@ -164,12 +164,12 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, ...@@ -164,12 +164,12 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
* only one CPU can execute this function. * only one CPU can execute this function.
* *
* Returns to the caller: * Returns to the caller:
* 0 - queue is empty or throttled. * false - hardware queue frozen backoff
* >0 - queue is not empty. * true - feel free to send more pkts
*/ */
int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
struct net_device *dev, struct netdev_queue *txq, struct net_device *dev, struct netdev_queue *txq,
spinlock_t *root_lock, bool validate) spinlock_t *root_lock, bool validate)
{ {
int ret = NETDEV_TX_BUSY; int ret = NETDEV_TX_BUSY;
...@@ -190,28 +190,26 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, ...@@ -190,28 +190,26 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
} else { } else {
if (root_lock) if (root_lock)
spin_lock(root_lock); spin_lock(root_lock);
return qdisc_qlen(q); return true;
} }
if (root_lock) if (root_lock)
spin_lock(root_lock); spin_lock(root_lock);
if (dev_xmit_complete(ret)) { if (!dev_xmit_complete(ret)) {
/* Driver sent out skb successfully or skb was consumed */
ret = qdisc_qlen(q);
} else {
/* Driver returned NETDEV_TX_BUSY - requeue skb */ /* Driver returned NETDEV_TX_BUSY - requeue skb */
if (unlikely(ret != NETDEV_TX_BUSY)) if (unlikely(ret != NETDEV_TX_BUSY))
net_warn_ratelimited("BUG %s code %d qlen %d\n", net_warn_ratelimited("BUG %s code %d qlen %d\n",
dev->name, ret, q->q.qlen); dev->name, ret, q->q.qlen);
ret = dev_requeue_skb(skb, q); dev_requeue_skb(skb, q);
return false;
} }
if (ret && netif_xmit_frozen_or_stopped(txq)) if (ret && netif_xmit_frozen_or_stopped(txq))
ret = 0; return false;
return ret; return true;
} }
/* /*
...@@ -233,7 +231,7 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, ...@@ -233,7 +231,7 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
* >0 - queue is not empty. * >0 - queue is not empty.
* *
*/ */
static inline int qdisc_restart(struct Qdisc *q, int *packets) static inline bool qdisc_restart(struct Qdisc *q, int *packets)
{ {
spinlock_t *root_lock = NULL; spinlock_t *root_lock = NULL;
struct netdev_queue *txq; struct netdev_queue *txq;
...@@ -244,7 +242,7 @@ static inline int qdisc_restart(struct Qdisc *q, int *packets) ...@@ -244,7 +242,7 @@ static inline int qdisc_restart(struct Qdisc *q, int *packets)
/* Dequeue packet */ /* Dequeue packet */
skb = dequeue_skb(q, &validate, packets); skb = dequeue_skb(q, &validate, packets);
if (unlikely(!skb)) if (unlikely(!skb))
return 0; return false;
if (!(q->flags & TCQ_F_NOLOCK)) if (!(q->flags & TCQ_F_NOLOCK))
root_lock = qdisc_lock(q); root_lock = qdisc_lock(q);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment