Development discussion of WireGuard
 help / color / mirror / Atom feed
* [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
@ 2025-06-19 14:54 Yury Norov
  2025-06-30 16:52 ` Simon Horman
  2025-06-30 17:24 ` Jason A. Donenfeld
  0 siblings, 2 replies; 10+ messages in thread
From: Yury Norov @ 2025-06-19 14:54 UTC (permalink / raw)
  To: Jason A. Donenfeld, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, wireguard, netdev, linux-kernel
  Cc: Yury Norov [NVIDIA]

From: Yury Norov [NVIDIA] <yury.norov@gmail.com>

wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
function significantly simpler. While there, fix opencoded cpu_online()
too.

Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
---
v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
v2:
 - fix 'cpu' undeclared;
 - change subject (Jason);
 - keep the original function structure (Jason);

 drivers/net/wireguard/queueing.h | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
index 7eb76724b3ed..56314f98b6ba 100644
--- a/drivers/net/wireguard/queueing.h
+++ b/drivers/net/wireguard/queueing.h
@@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
 
 static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
 {
-	unsigned int cpu = *stored_cpu, cpu_index, i;
+	unsigned int cpu = *stored_cpu;
+
+	if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
+		cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
 
-	if (unlikely(cpu >= nr_cpu_ids ||
-		     !cpumask_test_cpu(cpu, cpu_online_mask))) {
-		cpu_index = id % cpumask_weight(cpu_online_mask);
-		cpu = cpumask_first(cpu_online_mask);
-		for (i = 0; i < cpu_index; ++i)
-			cpu = cpumask_next(cpu, cpu_online_mask);
-		*stored_cpu = cpu;
-	}
 	return cpu;
 }
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-19 14:54 [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online() Yury Norov
@ 2025-06-30 16:52 ` Simon Horman
  2025-06-30 17:24 ` Jason A. Donenfeld
  1 sibling, 0 replies; 10+ messages in thread
From: Simon Horman @ 2025-06-30 16:52 UTC (permalink / raw)
  To: Yury Norov
  Cc: Jason A. Donenfeld, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, wireguard, netdev, linux-kernel

On Thu, Jun 19, 2025 at 10:54:59AM -0400, Yury Norov wrote:
> From: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> 
> wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
> function significantly simpler. While there, fix opencoded cpu_online()
> too.
> 
> Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> ---
> v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
> v2:
>  - fix 'cpu' undeclared;
>  - change subject (Jason);
>  - keep the original function structure (Jason);

Reviewed-by: Simon Horman <horms@kernel.org>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-19 14:54 [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online() Yury Norov
  2025-06-30 16:52 ` Simon Horman
@ 2025-06-30 17:24 ` Jason A. Donenfeld
  2025-06-30 17:33   ` Yury Norov
  1 sibling, 1 reply; 10+ messages in thread
From: Jason A. Donenfeld @ 2025-06-30 17:24 UTC (permalink / raw)
  To: Yury Norov
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, wireguard, netdev, linux-kernel

On Thu, Jun 19, 2025 at 10:54:59AM -0400, Yury Norov wrote:
> From: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> 
> wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
> function significantly simpler. While there, fix opencoded cpu_online()
> too.
> 
> Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> ---
> v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
> v2:
>  - fix 'cpu' undeclared;
>  - change subject (Jason);
>  - keep the original function structure (Jason);
> 
>  drivers/net/wireguard/queueing.h | 13 ++++---------
>  1 file changed, 4 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> index 7eb76724b3ed..56314f98b6ba 100644
> --- a/drivers/net/wireguard/queueing.h
> +++ b/drivers/net/wireguard/queueing.h
> @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
>  
>  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
>  {
> -	unsigned int cpu = *stored_cpu, cpu_index, i;
> +	unsigned int cpu = *stored_cpu;
> +
> +	if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> +		cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);

I was about to apply this but then it occurred to me: what happens if
cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
cpumask_nth() will then return nr_cpu_ids?

Jason

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:24 ` Jason A. Donenfeld
@ 2025-06-30 17:33   ` Yury Norov
  2025-06-30 17:38     ` Jason A. Donenfeld
  0 siblings, 1 reply; 10+ messages in thread
From: Yury Norov @ 2025-06-30 17:33 UTC (permalink / raw)
  To: Jason A. Donenfeld
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, wireguard, netdev, linux-kernel

On Mon, Jun 30, 2025 at 07:24:33PM +0200, Jason A. Donenfeld wrote:
> On Thu, Jun 19, 2025 at 10:54:59AM -0400, Yury Norov wrote:
> > From: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > 
> > wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
> > function significantly simpler. While there, fix opencoded cpu_online()
> > too.
> > 
> > Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > ---
> > v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
> > v2:
> >  - fix 'cpu' undeclared;
> >  - change subject (Jason);
> >  - keep the original function structure (Jason);
> > 
> >  drivers/net/wireguard/queueing.h | 13 ++++---------
> >  1 file changed, 4 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> > index 7eb76724b3ed..56314f98b6ba 100644
> > --- a/drivers/net/wireguard/queueing.h
> > +++ b/drivers/net/wireguard/queueing.h
> > @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
> >  
> >  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
> >  {
> > -	unsigned int cpu = *stored_cpu, cpu_index, i;
> > +	unsigned int cpu = *stored_cpu;
> > +
> > +	if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> > +		cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
> 
> I was about to apply this but then it occurred to me: what happens if
> cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
> cpumask_nth() will then return nr_cpu_ids?

It will return >= nd_cpu_ids. The original version based a for-loop
does the same, so I decided that the caller is safe against it.

If not, I can send a v3. But, what should we do - retry, or return a
local cpu? Or something else?

Thanks,
Yury

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:33   ` Yury Norov
@ 2025-06-30 17:38     ` Jason A. Donenfeld
  2025-06-30 17:54       ` Yury Norov
  0 siblings, 1 reply; 10+ messages in thread
From: Jason A. Donenfeld @ 2025-06-30 17:38 UTC (permalink / raw)
  To: Yury Norov
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, wireguard, netdev, linux-kernel

On Mon, Jun 30, 2025 at 01:33:37PM -0400, Yury Norov wrote:
> On Mon, Jun 30, 2025 at 07:24:33PM +0200, Jason A. Donenfeld wrote:
> > On Thu, Jun 19, 2025 at 10:54:59AM -0400, Yury Norov wrote:
> > > From: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > > 
> > > wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
> > > function significantly simpler. While there, fix opencoded cpu_online()
> > > too.
> > > 
> > > Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > > ---
> > > v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
> > > v2:
> > >  - fix 'cpu' undeclared;
> > >  - change subject (Jason);
> > >  - keep the original function structure (Jason);
> > > 
> > >  drivers/net/wireguard/queueing.h | 13 ++++---------
> > >  1 file changed, 4 insertions(+), 9 deletions(-)
> > > 
> > > diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> > > index 7eb76724b3ed..56314f98b6ba 100644
> > > --- a/drivers/net/wireguard/queueing.h
> > > +++ b/drivers/net/wireguard/queueing.h
> > > @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
> > >  
> > >  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
> > >  {
> > > -	unsigned int cpu = *stored_cpu, cpu_index, i;
> > > +	unsigned int cpu = *stored_cpu;
> > > +
> > > +	if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> > > +		cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
> > 
> > I was about to apply this but then it occurred to me: what happens if
> > cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
> > cpumask_nth() will then return nr_cpu_ids?
> 
> It will return >= nd_cpu_ids. The original version based a for-loop
> does the same, so I decided that the caller is safe against it.

Good point. I just checked... This goes into queue_work_on() which
eventually hits:

        /* pwq which will be used unless @work is executing elsewhere */
        if (req_cpu == WORK_CPU_UNBOUND) {

And it turns out WORK_CPU_UNBOUND is the same as nr_cpu_ids. So I guess
that's a fine failure mode.

I'll queue this patch up.

Jason

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:38     ` Jason A. Donenfeld
@ 2025-06-30 17:54       ` Yury Norov
  2025-06-30 17:55         ` Jason A. Donenfeld
  0 siblings, 1 reply; 10+ messages in thread
From: Yury Norov @ 2025-06-30 17:54 UTC (permalink / raw)
  To: Jason A. Donenfeld
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, wireguard, netdev, linux-kernel

On Mon, Jun 30, 2025 at 07:38:02PM +0200, Jason A. Donenfeld wrote:
> On Mon, Jun 30, 2025 at 01:33:37PM -0400, Yury Norov wrote:
> > On Mon, Jun 30, 2025 at 07:24:33PM +0200, Jason A. Donenfeld wrote:
> > > On Thu, Jun 19, 2025 at 10:54:59AM -0400, Yury Norov wrote:
> > > > From: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > > > 
> > > > wg_cpumask_choose_online() opencodes cpumask_nth(). Use it and make the
> > > > function significantly simpler. While there, fix opencoded cpu_online()
> > > > too.
> > > > 
> > > > Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
> > > > ---
> > > > v1: https://lore.kernel.org/all/20250604233656.41896-1-yury.norov@gmail.com/
> > > > v2:
> > > >  - fix 'cpu' undeclared;
> > > >  - change subject (Jason);
> > > >  - keep the original function structure (Jason);
> > > > 
> > > >  drivers/net/wireguard/queueing.h | 13 ++++---------
> > > >  1 file changed, 4 insertions(+), 9 deletions(-)
> > > > 
> > > > diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> > > > index 7eb76724b3ed..56314f98b6ba 100644
> > > > --- a/drivers/net/wireguard/queueing.h
> > > > +++ b/drivers/net/wireguard/queueing.h
> > > > @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
> > > >  
> > > >  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
> > > >  {
> > > > -	unsigned int cpu = *stored_cpu, cpu_index, i;
> > > > +	unsigned int cpu = *stored_cpu;
> > > > +
> > > > +	if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> > > > +		cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
> > > 
> > > I was about to apply this but then it occurred to me: what happens if
> > > cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
> > > cpumask_nth() will then return nr_cpu_ids?
> > 
> > It will return >= nd_cpu_ids. The original version based a for-loop
> > does the same, so I decided that the caller is safe against it.
> 
> Good point. I just checked... This goes into queue_work_on() which
> eventually hits:
> 
>         /* pwq which will be used unless @work is executing elsewhere */
>         if (req_cpu == WORK_CPU_UNBOUND) {
> 
> And it turns out WORK_CPU_UNBOUND is the same as nr_cpu_ids. So I guess
> that's a fine failure mode.

Actually, cpumask_nth_cpu may return >= nr_cpu_ids because of
small_cpumask_nbits optimization. So it's safer to relax the
condition. 

Can you consider applying the following patch for that?

Thanks,
Yury


From fbdce972342437fb12703cae0c3a4f8f9e218a1b Mon Sep 17 00:00:00 2001
From: Yury Norov (NVIDIA) <yury.norov@gmail.com>
Date: Mon, 30 Jun 2025 13:47:49 -0400
Subject: [PATCH] workqueue: relax condition in __queue_work()

Some cpumask search functions may return a number greater than
nr_cpu_ids when nothing is found. Adjust __queue_work() to it.

Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
---
 kernel/workqueue.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 9f9148075828..abacfe157fe6 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2261,7 +2261,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
 	rcu_read_lock();
 retry:
 	/* pwq which will be used unless @work is executing elsewhere */
-	if (req_cpu == WORK_CPU_UNBOUND) {
+	if (req_cpu >= WORK_CPU_UNBOUND) {
 		if (wq->flags & WQ_UNBOUND)
 			cpu = wq_select_unbound_cpu(raw_smp_processor_id());
 		else
-- 
2.43.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:54       ` Yury Norov
@ 2025-06-30 17:55         ` Jason A. Donenfeld
  2025-06-30 17:59           ` Yury Norov
  0 siblings, 1 reply; 10+ messages in thread
From: Jason A. Donenfeld @ 2025-06-30 17:55 UTC (permalink / raw)
  To: Yury Norov, Tejun Heo
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, wireguard, netdev, linux-kernel

Hi Yury,

> > > > > diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> > > > > index 7eb76724b3ed..56314f98b6ba 100644
> > > > > --- a/drivers/net/wireguard/queueing.h
> > > > > +++ b/drivers/net/wireguard/queueing.h
> > > > > @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
> > > > >
> > > > >  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
> > > > >  {
> > > > > -       unsigned int cpu = *stored_cpu, cpu_index, i;
> > > > > +       unsigned int cpu = *stored_cpu;
> > > > > +
> > > > > +       if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> > > > > +               cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
> > > >
> > > > I was about to apply this but then it occurred to me: what happens if
> > > > cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
> > > > cpumask_nth() will then return nr_cpu_ids?
> > >
> > > It will return >= nd_cpu_ids. The original version based a for-loop
> > > does the same, so I decided that the caller is safe against it.
> >
> > Good point. I just checked... This goes into queue_work_on() which
> > eventually hits:
> >
> >         /* pwq which will be used unless @work is executing elsewhere */
> >         if (req_cpu == WORK_CPU_UNBOUND) {
> >
> > And it turns out WORK_CPU_UNBOUND is the same as nr_cpu_ids. So I guess
> > that's a fine failure mode.
>
> Actually, cpumask_nth_cpu may return >= nr_cpu_ids because of
> small_cpumask_nbits optimization. So it's safer to relax the
> condition.
>
> Can you consider applying the following patch for that?
>
> Thanks,
> Yury
>
>
> From fbdce972342437fb12703cae0c3a4f8f9e218a1b Mon Sep 17 00:00:00 2001
> From: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> Date: Mon, 30 Jun 2025 13:47:49 -0400
> Subject: [PATCH] workqueue: relax condition in __queue_work()
>
> Some cpumask search functions may return a number greater than
> nr_cpu_ids when nothing is found. Adjust __queue_work() to it.
>
> Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> ---
>  kernel/workqueue.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index 9f9148075828..abacfe157fe6 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -2261,7 +2261,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
>         rcu_read_lock();
>  retry:
>         /* pwq which will be used unless @work is executing elsewhere */
> -       if (req_cpu == WORK_CPU_UNBOUND) {
> +       if (req_cpu >= WORK_CPU_UNBOUND) {
>                 if (wq->flags & WQ_UNBOUND)
>                         cpu = wq_select_unbound_cpu(raw_smp_processor_id());
>                 else
>

Seems reasonable to me... Maybe submit this to Tejun and CC me?

Jason

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:55         ` Jason A. Donenfeld
@ 2025-06-30 17:59           ` Yury Norov
  2025-06-30 18:15             ` Yury Norov
  0 siblings, 1 reply; 10+ messages in thread
From: Yury Norov @ 2025-06-30 17:59 UTC (permalink / raw)
  To: Jason A. Donenfeld
  Cc: Tejun Heo, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, wireguard, netdev, linux-kernel

On Mon, Jun 30, 2025 at 07:55:49PM +0200, Jason A. Donenfeld wrote:
> Hi Yury,
> 
> > > > > > diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h
> > > > > > index 7eb76724b3ed..56314f98b6ba 100644
> > > > > > --- a/drivers/net/wireguard/queueing.h
> > > > > > +++ b/drivers/net/wireguard/queueing.h
> > > > > > @@ -104,16 +104,11 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
> > > > > >
> > > > > >  static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
> > > > > >  {
> > > > > > -       unsigned int cpu = *stored_cpu, cpu_index, i;
> > > > > > +       unsigned int cpu = *stored_cpu;
> > > > > > +
> > > > > > +       if (unlikely(cpu >= nr_cpu_ids || !cpu_online(cpu)))
> > > > > > +               cpu = *stored_cpu = cpumask_nth(id % num_online_cpus(), cpu_online_mask);
> > > > >
> > > > > I was about to apply this but then it occurred to me: what happens if
> > > > > cpu_online_mask changes (shrinks) after num_online_cpus() is evaluated?
> > > > > cpumask_nth() will then return nr_cpu_ids?
> > > >
> > > > It will return >= nd_cpu_ids. The original version based a for-loop
> > > > does the same, so I decided that the caller is safe against it.
> > >
> > > Good point. I just checked... This goes into queue_work_on() which
> > > eventually hits:
> > >
> > >         /* pwq which will be used unless @work is executing elsewhere */
> > >         if (req_cpu == WORK_CPU_UNBOUND) {
> > >
> > > And it turns out WORK_CPU_UNBOUND is the same as nr_cpu_ids. So I guess
> > > that's a fine failure mode.
> >
> > Actually, cpumask_nth_cpu may return >= nr_cpu_ids because of
> > small_cpumask_nbits optimization. So it's safer to relax the
> > condition.
> >
> > Can you consider applying the following patch for that?
> >
> > Thanks,
> > Yury
> >
> >
> > From fbdce972342437fb12703cae0c3a4f8f9e218a1b Mon Sep 17 00:00:00 2001
> > From: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > Date: Mon, 30 Jun 2025 13:47:49 -0400
> > Subject: [PATCH] workqueue: relax condition in __queue_work()
> >
> > Some cpumask search functions may return a number greater than
> > nr_cpu_ids when nothing is found. Adjust __queue_work() to it.
> >
> > Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > ---
> >  kernel/workqueue.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> > index 9f9148075828..abacfe157fe6 100644
> > --- a/kernel/workqueue.c
> > +++ b/kernel/workqueue.c
> > @@ -2261,7 +2261,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
> >         rcu_read_lock();
> >  retry:
> >         /* pwq which will be used unless @work is executing elsewhere */
> > -       if (req_cpu == WORK_CPU_UNBOUND) {
> > +       if (req_cpu >= WORK_CPU_UNBOUND) {
> >                 if (wq->flags & WQ_UNBOUND)
> >                         cpu = wq_select_unbound_cpu(raw_smp_processor_id());
> >                 else
> >
> 
> Seems reasonable to me... Maybe submit this to Tejun and CC me?

Sure, no problem.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 17:59           ` Yury Norov
@ 2025-06-30 18:15             ` Yury Norov
  2025-06-30 18:20               ` Jason A. Donenfeld
  0 siblings, 1 reply; 10+ messages in thread
From: Yury Norov @ 2025-06-30 18:15 UTC (permalink / raw)
  To: Jason A. Donenfeld
  Cc: Tejun Heo, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, wireguard, netdev, linux-kernel

> > > From fbdce972342437fb12703cae0c3a4f8f9e218a1b Mon Sep 17 00:00:00 2001
> > > From: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > > Date: Mon, 30 Jun 2025 13:47:49 -0400
> > > Subject: [PATCH] workqueue: relax condition in __queue_work()
> > >
> > > Some cpumask search functions may return a number greater than
> > > nr_cpu_ids when nothing is found. Adjust __queue_work() to it.
> > >
> > > Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > > ---
> > >  kernel/workqueue.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> > > index 9f9148075828..abacfe157fe6 100644
> > > --- a/kernel/workqueue.c
> > > +++ b/kernel/workqueue.c
> > > @@ -2261,7 +2261,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
> > >         rcu_read_lock();
> > >  retry:
> > >         /* pwq which will be used unless @work is executing elsewhere */
> > > -       if (req_cpu == WORK_CPU_UNBOUND) {
> > > +       if (req_cpu >= WORK_CPU_UNBOUND) {
> > >                 if (wq->flags & WQ_UNBOUND)
> > >                         cpu = wq_select_unbound_cpu(raw_smp_processor_id());
> > >                 else
> > >
> > 
> > Seems reasonable to me... Maybe submit this to Tejun and CC me?
> 
> Sure, no problem.

Hmm... So, actually WORK_CPU_UNBOUND is NR_CPUS, which is not the same
as nr_cpu_ids. For example, on my Ubuntu machine, the CONFIG_NR_CPUS
is 8192, and nr_cpu_ids is 8.

So, for the wg_cpumask_next_online() to work properly, we need to
return the WORK_CPU_UNBOUND in case of nothing is found.

I think I need to send a v3...

Thanks,
Yury


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online()
  2025-06-30 18:15             ` Yury Norov
@ 2025-06-30 18:20               ` Jason A. Donenfeld
  0 siblings, 0 replies; 10+ messages in thread
From: Jason A. Donenfeld @ 2025-06-30 18:20 UTC (permalink / raw)
  To: Yury Norov
  Cc: Tejun Heo, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, wireguard, netdev, linux-kernel

On Mon, Jun 30, 2025 at 8:15 PM Yury Norov <yury.norov@gmail.com> wrote:
>
> > > > From fbdce972342437fb12703cae0c3a4f8f9e218a1b Mon Sep 17 00:00:00 2001
> > > > From: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > > > Date: Mon, 30 Jun 2025 13:47:49 -0400
> > > > Subject: [PATCH] workqueue: relax condition in __queue_work()
> > > >
> > > > Some cpumask search functions may return a number greater than
> > > > nr_cpu_ids when nothing is found. Adjust __queue_work() to it.
> > > >
> > > > Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
> > > > ---
> > > >  kernel/workqueue.c | 2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > >
> > > > diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> > > > index 9f9148075828..abacfe157fe6 100644
> > > > --- a/kernel/workqueue.c
> > > > +++ b/kernel/workqueue.c
> > > > @@ -2261,7 +2261,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
> > > >         rcu_read_lock();
> > > >  retry:
> > > >         /* pwq which will be used unless @work is executing elsewhere */
> > > > -       if (req_cpu == WORK_CPU_UNBOUND) {
> > > > +       if (req_cpu >= WORK_CPU_UNBOUND) {
> > > >                 if (wq->flags & WQ_UNBOUND)
> > > >                         cpu = wq_select_unbound_cpu(raw_smp_processor_id());
> > > >                 else
> > > >
> > >
> > > Seems reasonable to me... Maybe submit this to Tejun and CC me?
> >
> > Sure, no problem.
>
> Hmm... So, actually WORK_CPU_UNBOUND is NR_CPUS, which is not the same
> as nr_cpu_ids. For example, on my Ubuntu machine, the CONFIG_NR_CPUS
> is 8192, and nr_cpu_ids is 8.
>
> So, for the wg_cpumask_next_online() to work properly, we need to
> return the WORK_CPU_UNBOUND in case of nothing is found.

Or just try again? Could just make your if into a while.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-06-30 18:31 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-06-19 14:54 [PATCH v2] wireguard: queueing: simplify wg_cpumask_next_online() Yury Norov
2025-06-30 16:52 ` Simon Horman
2025-06-30 17:24 ` Jason A. Donenfeld
2025-06-30 17:33   ` Yury Norov
2025-06-30 17:38     ` Jason A. Donenfeld
2025-06-30 17:54       ` Yury Norov
2025-06-30 17:55         ` Jason A. Donenfeld
2025-06-30 17:59           ` Yury Norov
2025-06-30 18:15             ` Yury Norov
2025-06-30 18:20               ` Jason A. Donenfeld

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).