[PATCH net-next] net: pktgen: return bool from __pktgen_NN_threads()

From: Chengfeng Ye

Date: Tue Aug 25 2026 - 14:53:45 EST


Callers of __pktgen_NN_threads() only check whether a pktgen_dev was
found. After the RCU lookup they never dereference the returned
pointer, so returning it past rcu_read_unlock() is confusing.

Return bool instead and keep the pktgen_dev pointer local to the
RCU critical section.

Suggested-by: Paolo Abeni <pabeni@xxxxxxxxxx>
Signed-off-by: Chengfeng Ye <nicoyip.dev@xxxxxxxxx>
---
This is a net-next follow-up to
https://lore.kernel.org/netdev/20260824152331.216494-1-nicoyip.dev@xxxxxxxxx/

net/core/pktgen.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 4fb1853589b3..9985b30c5a42 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -2024,11 +2024,11 @@ static const struct proc_ops pktgen_thread_proc_ops = {
};

/* Think find or remove for NN */
-static struct pktgen_dev *__pktgen_NN_threads(const struct pktgen_net *pn,
- const char *ifname, int remove)
+static bool __pktgen_NN_threads(const struct pktgen_net *pn,
+ const char *ifname, int remove)
{
struct pktgen_thread *t;
- struct pktgen_dev *pkt_dev = NULL;
+ struct pktgen_dev *pkt_dev;
bool exact = (remove == FIND);

list_for_each_entry(t, &pn->pktgen_threads, th_list) {
@@ -2042,9 +2042,9 @@ static struct pktgen_dev *__pktgen_NN_threads(const struct pktgen_net *pn,
}
rcu_read_unlock();
if (pkt_dev)
- break;
+ return true;
}
- return pkt_dev;
+ return false;
}

/*
@@ -2052,7 +2052,6 @@ static struct pktgen_dev *__pktgen_NN_threads(const struct pktgen_net *pn,
*/
static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname)
{
- struct pktgen_dev *pkt_dev = NULL;
const int max_tries = 10, msec_per_try = 125;
int i = 0;

@@ -2061,8 +2060,7 @@ static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname)

while (1) {

- pkt_dev = __pktgen_NN_threads(pn, ifname, REMOVE);
- if (pkt_dev == NULL)
+ if (!__pktgen_NN_threads(pn, ifname, REMOVE))
break; /* success */

mutex_unlock(&pktgen_thread_lock);
@@ -3836,8 +3834,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)

/* We don't allow a device to be on several threads */

- pkt_dev = __pktgen_NN_threads(t->net, ifname, FIND);
- if (pkt_dev) {
+ if (__pktgen_NN_threads(t->net, ifname, FIND)) {
pr_err("ERROR: interface already used\n");
return -EBUSY;
}
--
2.43.0