* [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful
@ 2023-05-30 18:32 Benjamin Segall
2023-05-31 1:57 ` Eric Biggers
0 siblings, 1 reply; 6+ messages in thread
From: Benjamin Segall @ 2023-05-30 18:32 UTC (permalink / raw)
To: Alexander Viro, Christian Brauner
Cc: linux-fsdevel, linux-kernel, stable, Andrew Morton
autoremove_wake_function uses list_del_init_careful, so should epoll's
more aggressive variant. It only doesn't because it was copied from an
older wait.c rather than the most recent.
Fixes: a16ceb139610 ("epoll: autoremove wakers even more aggressively")
Signed-off-by: Ben Segall <bsegall@google.com>
Cc: stable@vger.kernel.org
---
fs/eventpoll.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 52954d4637b5..081df056398a 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -1756,11 +1756,11 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
unsigned int mode, int sync, void *key)
{
int ret = default_wake_function(wq_entry, mode, sync, key);
- list_del_init(&wq_entry->entry);
+ list_del_init_careful(&wq_entry->entry);
return ret;
}
/**
* ep_poll - Retrieves ready events, and delivers them to the caller-supplied
--
2.39.0.rc0.267.gcb52ba06e7-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful
2023-05-30 18:32 [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful Benjamin Segall
@ 2023-05-31 1:57 ` Eric Biggers
2023-05-31 7:53 ` Christian Brauner
0 siblings, 1 reply; 6+ messages in thread
From: Eric Biggers @ 2023-05-31 1:57 UTC (permalink / raw)
To: Benjamin Segall
Cc: Alexander Viro, Christian Brauner, linux-fsdevel, linux-kernel,
stable, Andrew Morton
On Tue, May 30, 2023 at 11:32:28AM -0700, Benjamin Segall wrote:
> autoremove_wake_function uses list_del_init_careful, so should epoll's
> more aggressive variant. It only doesn't because it was copied from an
> older wait.c rather than the most recent.
>
> Fixes: a16ceb139610 ("epoll: autoremove wakers even more aggressively")
> Signed-off-by: Ben Segall <bsegall@google.com>
> Cc: stable@vger.kernel.org
> ---
> fs/eventpoll.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/eventpoll.c b/fs/eventpoll.c
> index 52954d4637b5..081df056398a 100644
> --- a/fs/eventpoll.c
> +++ b/fs/eventpoll.c
> @@ -1756,11 +1756,11 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
> static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
> unsigned int mode, int sync, void *key)
> {
> int ret = default_wake_function(wq_entry, mode, sync, key);
>
> - list_del_init(&wq_entry->entry);
> + list_del_init_careful(&wq_entry->entry);
> return ret;
> }
Can you please provide a more detailed explanation about why
list_del_init_careful() is needed here?
- Eric
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful
2023-05-31 1:57 ` Eric Biggers
@ 2023-05-31 7:53 ` Christian Brauner
2023-05-31 22:15 ` Benjamin Segall
0 siblings, 1 reply; 6+ messages in thread
From: Christian Brauner @ 2023-05-31 7:53 UTC (permalink / raw)
To: Eric Biggers
Cc: Benjamin Segall, Alexander Viro, linux-fsdevel, linux-kernel,
stable, Andrew Morton
On Tue, May 30, 2023 at 06:57:48PM -0700, Eric Biggers wrote:
> On Tue, May 30, 2023 at 11:32:28AM -0700, Benjamin Segall wrote:
> > autoremove_wake_function uses list_del_init_careful, so should epoll's
> > more aggressive variant. It only doesn't because it was copied from an
> > older wait.c rather than the most recent.
> >
> > Fixes: a16ceb139610 ("epoll: autoremove wakers even more aggressively")
> > Signed-off-by: Ben Segall <bsegall@google.com>
> > Cc: stable@vger.kernel.org
> > ---
> > fs/eventpoll.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/eventpoll.c b/fs/eventpoll.c
> > index 52954d4637b5..081df056398a 100644
> > --- a/fs/eventpoll.c
> > +++ b/fs/eventpoll.c
> > @@ -1756,11 +1756,11 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
> > static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
> > unsigned int mode, int sync, void *key)
> > {
> > int ret = default_wake_function(wq_entry, mode, sync, key);
> >
> > - list_del_init(&wq_entry->entry);
> > + list_del_init_careful(&wq_entry->entry);
> > return ret;
> > }
>
> Can you please provide a more detailed explanation about why
> list_del_init_careful() is needed here?
Yeah, this needs more explanation... Next time someone looks at this
code and there's a *_careful() added they'll want to know why.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful
2023-05-31 7:53 ` Christian Brauner
@ 2023-05-31 22:15 ` Benjamin Segall
2023-05-31 22:26 ` Andrew Morton
0 siblings, 1 reply; 6+ messages in thread
From: Benjamin Segall @ 2023-05-31 22:15 UTC (permalink / raw)
To: Christian Brauner
Cc: Eric Biggers, Alexander Viro, linux-fsdevel, linux-kernel,
stable, Andrew Morton
Christian Brauner <brauner@kernel.org> writes:
> On Tue, May 30, 2023 at 06:57:48PM -0700, Eric Biggers wrote:
>> On Tue, May 30, 2023 at 11:32:28AM -0700, Benjamin Segall wrote:
>> > autoremove_wake_function uses list_del_init_careful, so should epoll's
>> > more aggressive variant. It only doesn't because it was copied from an
>> > older wait.c rather than the most recent.
>> >
>> > Fixes: a16ceb139610 ("epoll: autoremove wakers even more aggressively")
>> > Signed-off-by: Ben Segall <bsegall@google.com>
>> > Cc: stable@vger.kernel.org
>> > ---
>> > fs/eventpoll.c | 2 +-
>> > 1 file changed, 1 insertion(+), 1 deletion(-)
>> >
>> > diff --git a/fs/eventpoll.c b/fs/eventpoll.c
>> > index 52954d4637b5..081df056398a 100644
>> > --- a/fs/eventpoll.c
>> > +++ b/fs/eventpoll.c
>> > @@ -1756,11 +1756,11 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
>> > static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
>> > unsigned int mode, int sync, void *key)
>> > {
>> > int ret = default_wake_function(wq_entry, mode, sync, key);
>> >
>> > - list_del_init(&wq_entry->entry);
>> > + list_del_init_careful(&wq_entry->entry);
>> > return ret;
>> > }
>>
>> Can you please provide a more detailed explanation about why
>> list_del_init_careful() is needed here?
>
> Yeah, this needs more explanation... Next time someone looks at this
> code and there's a *_careful() added they'll want to know why.
So the general reason is the same as with autoremove_wake_function, it
pairs with the list_entry_careful in ep_poll (which is epoll's modified
copy of finish_wait).
I think the original actual _problem_ was a -stable issue that was fixed
instead by doing additional backports, so this may just avoid potential
extra loops and avoid potential compiler shenanigans from the data race.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful
2023-05-31 22:15 ` Benjamin Segall
@ 2023-05-31 22:26 ` Andrew Morton
2023-05-31 23:24 ` [PATCH v2] " Benjamin Segall
0 siblings, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2023-05-31 22:26 UTC (permalink / raw)
To: Benjamin Segall
Cc: Christian Brauner, Eric Biggers, Alexander Viro, linux-fsdevel,
linux-kernel, stable
On Wed, 31 May 2023 15:15:41 -0700 Benjamin Segall <bsegall@google.com> wrote:
> >> Can you please provide a more detailed explanation about why
> >> list_del_init_careful() is needed here?
> >
> > Yeah, this needs more explanation... Next time someone looks at this
> > code and there's a *_careful() added they'll want to know why.
>
> So the general reason is the same as with autoremove_wake_function, it
> pairs with the list_entry_careful in ep_poll (which is epoll's modified
> copy of finish_wait).
>
> I think the original actual _problem_ was a -stable issue that was fixed
> instead by doing additional backports, so this may just avoid potential
> extra loops and avoid potential compiler shenanigans from the data race.
The point is that the foo_careful() callsites should be commented, please.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2] epoll: ep_autoremove_wake_function should use list_del_init_careful
2023-05-31 22:26 ` Andrew Morton
@ 2023-05-31 23:24 ` Benjamin Segall
0 siblings, 0 replies; 6+ messages in thread
From: Benjamin Segall @ 2023-05-31 23:24 UTC (permalink / raw)
To: Andrew Morton
Cc: Christian Brauner, Eric Biggers, Alexander Viro, linux-fsdevel,
linux-kernel, stable
autoremove_wake_function uses list_del_init_careful, so should epoll's
more aggressive variant. It only doesn't because it was copied from an
older wait.c rather than the most recent.
Fixes: a16ceb139610 ("epoll: autoremove wakers even more aggressively")
Signed-off-by: Ben Segall <bsegall@google.com>
Cc: stable@vger.kernel.org
Change-Id: Icca05359250297f091779c9dcf4fefea92ee8c93
---
fs/eventpoll.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 980483455cc09..266d45c7685b4 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -1803,11 +1803,15 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
unsigned int mode, int sync, void *key)
{
int ret = default_wake_function(wq_entry, mode, sync, key);
- list_del_init(&wq_entry->entry);
+ /*
+ * Pairs with list_empty_careful in ep_poll, and ensures future loop
+ * iterations see the cause of this wakeup.
+ */
+ list_del_init_careful(&wq_entry->entry);
return ret;
}
/**
* ep_poll - Retrieves ready events, and delivers them to the caller-supplied
--
2.41.0.rc0.172.g3f132b7071-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-05-31 23:24 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-30 18:32 [PATCH RESEND] epoll: ep_autoremove_wake_function should use list_del_init_careful Benjamin Segall
2023-05-31 1:57 ` Eric Biggers
2023-05-31 7:53 ` Christian Brauner
2023-05-31 22:15 ` Benjamin Segall
2023-05-31 22:26 ` Andrew Morton
2023-05-31 23:24 ` [PATCH v2] " Benjamin Segall
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.