Skip to content

Commit 34dd0fe

Browse files
netoptimizerkuba-moo
authored andcommitted
net: sched: generalize check for no-queue qdisc on TX queue
The "noqueue" qdisc can either be directly attached, or get default attached if net_device priv_flags has IFF_NO_QUEUE. In both cases, the allocated Qdisc structure gets it's enqueue function pointer reset to NULL by noqueue_init() via noqueue_qdisc_ops. This is a common case for software virtual net_devices. For these devices with no-queue, the transmission path in __dev_queue_xmit() will bypass the qdisc layer. Directly invoking device drivers ndo_start_xmit (via dev_hard_start_xmit). In this mode the device driver is not allowed to ask for packets to be queued (either via returning NETDEV_TX_BUSY or stopping the TXQ). The simplest and most reliable way to identify this no-queue case is by checking if enqueue == NULL. The vrf driver currently open-codes this check (!qdisc->enqueue). While functionally correct, this low-level detail is better encapsulated in a dedicated helper for clarity and long-term maintainability. To make this behavior more explicit and reusable, this patch introduce a new helper: qdisc_txq_has_no_queue(). Helper will also be used by the veth driver in the next patch, which introduces optional qdisc-based backpressure. This is a non-functional change. Reviewed-by: David Ahern <dsahern@kernel.org> Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> Signed-off-by: Jesper Dangaard Brouer <hawk@kernel.org> Link: https://patch.msgid.link/174559293172.827981.7583862632045264175.stgit@firesoul Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent ccc2515 commit 34dd0fe

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

drivers/net/vrf.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,15 +343,13 @@ static int vrf_ifindex_lookup_by_table_id(struct net *net, u32 table_id)
343343
static bool qdisc_tx_is_default(const struct net_device *dev)
344344
{
345345
struct netdev_queue *txq;
346-
struct Qdisc *qdisc;
347346

348347
if (dev->num_tx_queues > 1)
349348
return false;
350349

351350
txq = netdev_get_tx_queue(dev, 0);
352-
qdisc = rcu_access_pointer(txq->qdisc);
353351

354-
return !qdisc->enqueue;
352+
return qdisc_txq_has_no_queue(txq);
355353
}
356354

357355
/* Local traffic destined to local address. Reinsert the packet to rx

include/net/sch_generic.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,14 @@ static inline bool qdisc_tx_changing(const struct net_device *dev)
803803
return false;
804804
}
805805

806+
/* "noqueue" qdisc identified by not having any enqueue, see noqueue_init() */
807+
static inline bool qdisc_txq_has_no_queue(const struct netdev_queue *txq)
808+
{
809+
struct Qdisc *qdisc = rcu_access_pointer(txq->qdisc);
810+
811+
return qdisc->enqueue == NULL;
812+
}
813+
806814
/* Is the device using the noop qdisc on all queues? */
807815
static inline bool qdisc_tx_is_noop(const struct net_device *dev)
808816
{

0 commit comments

Comments
 (0)