@@ -343,15 +343,13 @@ static int vrf_ifindex_lookup_by_table_id(struct net *net, u32 table_id)
static bool qdisc_tx_is_default(const struct net_device *dev)
{
struct netdev_queue *txq;
- struct Qdisc *qdisc;
if (dev->num_tx_queues > 1)
return false;
txq = netdev_get_tx_queue(dev, 0);
- qdisc = rcu_access_pointer(txq->qdisc);
- return !qdisc->enqueue;
+ return qdisc_txq_is_noop(txq);
}
/* Local traffic destined to local address. Reinsert the packet to rx
@@ -803,6 +803,11 @@ static inline bool qdisc_tx_changing(const struct net_device *dev)
return false;
}
+static inline bool qdisc_txq_is_noop(const struct netdev_queue *txq)
+{
+ return rcu_access_pointer(txq->qdisc) == &noop_qdisc;
+}
+
/* Is the device using the noop qdisc on all queues? */
static inline bool qdisc_tx_is_noop(const struct net_device *dev)
{
@@ -810,7 +815,7 @@ static inline bool qdisc_tx_is_noop(const struct net_device *dev)
for (i = 0; i < dev->num_tx_queues; i++) {
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
- if (rcu_access_pointer(txq->qdisc) != &noop_qdisc)
+ if (!qdisc_txq_is_noop(txq))
return false;
}
return true;
WARNING: Testing show this is NOT correct! - I need help figuring out why this patch is incorrect. - Testing against &noop_qdisc is not the same as q->enqueue == NULL - I copied test (txq->qdisc == &noop_qdisc) from qdisc_tx_is_noop - Q: is qdisc_tx_is_noop() function incorrect? The vrf driver includes an open-coded check to determine whether a TX queue (netdev_queue) has a real qdisc attached. This is done by testing whether qdisc->enqueue is NULL, which is functionally equivalent to checking whether the qdisc is &noop_qdisc. This equivalence stems from noqueue_init(), which explicitly clears the enqueue pointer to signal no-op behavior to __dev_queue_xmit(). This patch introduces a shared helper, qdisc_txq_is_noop(), to clarify intent and make this logic reusable. The vrf driver is updated to use this new helper. Subsequent patches will make further use of this helper in other drivers, such as veth. This is a non-functional change. Signed-off-by: Jesper Dangaard Brouer <hawk@kernel.org> --- drivers/net/vrf.c | 4 +--- include/net/sch_generic.h | 7 ++++++- 2 files changed, 7 insertions(+), 4 deletions(-)