All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Wei Wang <weiwan@google.com>
Cc: Alexander Duyck <alexanderduyck@fb.com>,
	Eric Dumazet <edumazet@google.com>,
	"David S . Miller" <davem@davemloft.net>,
	netdev <netdev@vger.kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Hannes Frederic Sowa <hannes@stressinduktion.org>,
	Martin Zaharinov <micron10@gmail.com>
Subject: Re: [PATCH net] net: fix race between napi kthread mode and busy poll
Date: Thu, 25 Feb 2021 17:18:57 -0800	[thread overview]
Message-ID: <20210225171857.798e6c81@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com> (raw)
In-Reply-To: <CAEA6p_DnoQ8OLm731burXB58d9PfSPNU7_MvbeX_Ly1Grk2XbA@mail.gmail.com>

On Thu, 25 Feb 2021 16:16:20 -0800 Wei Wang wrote:
> On Thu, Feb 25, 2021 at 3:00 PM Jakub Kicinski <kuba@kernel.org> wrote:
> > On Thu, 25 Feb 2021 10:29:47 -0800 Wei Wang wrote:  
> > > Hmm... I don't think the above patch would work. Consider a situation that:
> > > 1. At first, the kthread is in sleep mode.
> > > 2. Then someone calls napi_schedule() to schedule work on this napi.
> > > So ____napi_schedule() is called. But at this moment, the kthread is
> > > not yet in RUNNING state. So this function does not set SCHED_THREAD
> > > bit.
> > > 3. Then wake_up_process() is called to wake up the thread.
> > > 4. Then napi_threaded_poll() calls napi_thread_wait().  
> >
> > But how is the task not in running state outside of napi_thread_wait()?
> >
> > My scheduler knowledge is rudimentary, but AFAIU off CPU tasks which
> > were not put to sleep are still in RUNNING state, so unless we set
> > INTERRUPTIBLE the task will be running, even if it's stuck in cond_resched().
>
> I think the thread is only in RUNNING state after wake_up_process() is
> called on the thread in ____napi_schedule(). Before that, it should be
> in INTERRUPTIBLE state. napi_thread_wait() explicitly calls
> set_current_state(TASK_INTERRUPTIBLE) when it finishes 1 round of
> polling.

Are you concerned about it not being in RUNNING state after it's
spawned but before it's first parked?

> > > woken is false
> > > and SCHED_THREAD bit is not set. So the kthread will go to sleep again
> > > (in INTERRUPTIBLE mode) when schedule() is called, and waits to be
> > > woken up by the next napi_schedule().
> > > That will introduce arbitrary delay for the napi->poll() to be called.
> > > Isn't it? Please enlighten me if I did not understand it correctly.  
> >
> > Probably just me not understanding the scheduler :)
> >  
> > > I personally prefer to directly set SCHED_THREAD bit in ____napi_schedule().
> > > Or stick with SCHED_BUSY_POLL solution and replace kthread_run() with
> > > kthread_create().  
> >
> > Well, I'm fine with that too, no point arguing further if I'm not
> > convincing anyone. But we need a fix which fixes the issue completely,
> > not just one of three incarnations.  
> 
> Alexander and Eric,
> Do you guys have preference on which approach to take?
> If we keep the current SCHED_BUSY_POLL patch, I think we need to
> change kthread_run() to kthread_create() to address the warning Martin
> reported.
> Or if we choose to set SCHED_THREADED, we could keep kthread_run().
> But there is 1 extra set_bit() operation.

To be clear extra set_bit() only if thread is running, which if IRQ
coalescing works should be rather rare.

  reply	other threads:[~2021-02-26  1:19 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-23 23:41 [PATCH net] net: fix race between napi kthread mode and busy poll Wei Wang
2021-02-24 19:48 ` Jakub Kicinski
2021-02-24 20:37   ` Eric Dumazet
2021-02-24 21:30     ` Jakub Kicinski
2021-02-24 22:29       ` Wei Wang
2021-02-24 23:29         ` Jakub Kicinski
     [not found]       ` <CANn89i+xGsMpRfPwZK281jyfum_1fhTNFXq7Z8HOww9H1BHmiw@mail.gmail.com>
2021-02-24 23:52         ` Jakub Kicinski
2021-02-24 23:59           ` Eric Dumazet
2021-02-25  0:07             ` Jakub Kicinski
2021-02-25  0:11               ` Alexander Duyck
2021-02-25  0:16                 ` Wei Wang
2021-02-25  0:32                   ` Jakub Kicinski
2021-02-25  0:44                     ` Wei Wang
2021-02-25  0:49                       ` Jakub Kicinski
2021-02-25  1:06                         ` Wei Wang
2021-02-25  1:40                           ` Jakub Kicinski
2021-02-25  2:16                             ` Wei Wang
2021-02-25  0:20                 ` Jakub Kicinski
2021-02-25  1:22                   ` Alexander Duyck
2021-02-25  2:03                     ` Jakub Kicinski
2021-02-25  2:31                       ` Wei Wang
2021-02-25  5:52                         ` Martin Zaharinov
2021-02-25  8:21                         ` Jakub Kicinski
2021-02-25 18:29                           ` Wei Wang
2021-02-25 23:00                             ` Jakub Kicinski
2021-02-26  0:16                               ` Wei Wang
2021-02-26  1:18                                 ` Jakub Kicinski [this message]
2021-02-26  1:49                                   ` Wei Wang
2021-02-26  3:52                                   ` Alexander Duyck
2021-02-26 18:28                                     ` Wei Wang
2021-02-26 21:35                                       ` Jakub Kicinski
2021-02-26 22:24                                         ` Wei Wang
     [not found]                                           ` <CALidq=UWupwXMMYAMMF2GW4ifR0WQJos6VqXPuzQ0_seHGUHdA@mail.gmail.com>
2021-02-26 22:37                                             ` Wei Wang
2021-02-26 23:10                                           ` Jakub Kicinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210225171857.798e6c81@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com \
    --to=kuba@kernel.org \
    --cc=alexanderduyck@fb.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=hannes@stressinduktion.org \
    --cc=micron10@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=weiwan@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.