lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <174464555063.20396.9545196538212416415.stgit@firesoul>
Date: Mon, 14 Apr 2025 17:45:50 +0200
From: Jesper Dangaard Brouer <hawk@...nel.org>
To: netdev@...r.kernel.org, Jakub Kicinski <kuba@...nel.org>
Cc: Jesper Dangaard Brouer <hawk@...nel.org>, bpf@...r.kernel.org,
 tom@...bertland.com, Eric Dumazet <eric.dumazet@...il.com>,
 "David S. Miller" <davem@...emloft.net>, Paolo Abeni <pabeni@...hat.com>,
 Toke Høiland-Jørgensen <toke@...e.dk>,
 dsahern@...nel.org, makita.toshiaki@....ntt.co.jp, kernel-team@...udflare.com
Subject: [PATCH net-next RFC V3 1/2] net: sched: generalize check for no-op
 qdisc on TX queue

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@...nel.org>
---
 drivers/net/vrf.c         |    4 +---
 include/net/sch_generic.h |    7 ++++++-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 7168b33adadb..f0a24fc85945 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -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
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index d48c657191cd..a1f5560350a6 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -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;



Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ