All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RT 0/3] Linux v5.10.90-rt61-rc1
@ 2022-01-07  2:14 Luis Claudio R. Goncalves
  2022-01-07  2:15 ` [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit Luis Claudio R. Goncalves
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Luis Claudio R. Goncalves @ 2022-01-07  2:14 UTC (permalink / raw)
  To: linux-rt-users, stable-rt@vger.kernel.org, Steven Rostedt,
	Thomas Gleixner, Carsten Emde, Sebastian Andrzej Siewior,
	Daniel Wagner, Tom Zanussi, Clark Williams, Mark Gross,
	Jeff Brady, Luis Goncalves

Dear RT Folks,

This is the RT stable review cycle of patch 5.10.90-rt61-rc1.

Please scream at me if I messed something up. Please test the patches
too.

The -rc release will be uploaded to kernel.org and will be deleted
when the final release is out. This is just a review release (or
release candidate).

The pre-releases will not be pushed to the git repository, only the
final release is.

If all goes well, this patch will be converted to the next main
release on 2022-01-13.

Known problem:

  There is a printk build warning that would be fixed by commit 43a17111c2553
  ("printk: wake up klogd in vprintk_emit"), already present in v4.19-rt. I am
  trying to decide whether it is justifiable to suggest the backport of this
  commit to 4.14-stable or if I should write a simple rt-only fix. Comments are
  welcome.


To build 5.10.90-rt61-rc1 directly, the following patches should be applied:

  https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.xz

  https://www.kernel.org/pub/linux/kernel/v5.x/patch-5.10.90.xz

  https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.90-rt61-rc1.patch.xz


You can also build from 5.10.90-rt60 by applying the incremental patch:

  https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/incr/patch-5.10.90-rt60-rt61-rc1.patch.xz

Enjoy,

-- Luis



Luis Claudio R. Goncalves (1):
  Linux 5.10.90-rt61-rc1

Sebastian Andrzej Siewior (1):
  stop_machine: Remove this_cpu_ptr() from print_stop_info().

Thomas Gleixner (1):
  eventfd: Make signal recursion protection a task bit

 fs/aio.c                |  2 +-
 fs/eventfd.c            | 12 +++++-------
 include/linux/eventfd.h | 11 +++++------
 include/linux/sched.h   |  4 ++++
 kernel/stop_machine.c   |  6 +++++-
 localversion-rt         |  2 +-
 6 files changed, 21 insertions(+), 16 deletions(-)

-- 
2.33.1


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

* [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit
  2022-01-07  2:14 [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Claudio R. Goncalves
@ 2022-01-07  2:15 ` Luis Claudio R. Goncalves
  2022-02-03  8:59   ` Daniel Vacek
  2022-01-07  2:15 ` [PATCH RT 2/3] stop_machine: Remove this_cpu_ptr() from print_stop_info() Luis Claudio R. Goncalves
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Luis Claudio R. Goncalves @ 2022-01-07  2:15 UTC (permalink / raw)
  To: linux-rt-users, stable-rt@vger.kernel.org, Steven Rostedt,
	Thomas Gleixner, Carsten Emde, Sebastian Andrzej Siewior,
	Daniel Wagner, Tom Zanussi, Clark Williams, Mark Gross,
	Jeff Brady, Luis Goncalves
  Cc: Daniel Bristot de Oliveira, Jason Wang, Al Viro

From: Thomas Gleixner <tglx@linutronix.de>

v5.10.90-rt61-rc1 stable review patch.
If anyone has any objections, please let me know.

-----------


Upstream commit b542e383d8c005f06a131e2b40d5889b812f19c6

The recursion protection for eventfd_signal() is based on a per CPU
variable and relies on the !RT semantics of spin_lock_irqsave() for
protecting this per CPU variable. On RT kernels spin_lock_irqsave() neither
disables preemption nor interrupts which allows the spin lock held section
to be preempted. If the preempting task invokes eventfd_signal() as well,
then the recursion warning triggers.

Paolo suggested to protect the per CPU variable with a local lock, but
that's heavyweight and actually not necessary. The goal of this protection
is to prevent the task stack from overflowing, which can be achieved with a
per task recursion protection as well.

Replace the per CPU variable with a per task bit similar to other recursion
protection bits like task_struct::in_page_owner. This works on both !RT and
RT kernels and removes as a side effect the extra per CPU storage.

No functional change for !RT kernels.

Reported-by: Daniel Bristot de Oliveira <bristot@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Daniel Bristot de Oliveira <bristot@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Link: https://lore.kernel.org/r/87wnp9idso.ffs@tglx
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 fs/aio.c                |  2 +-
 fs/eventfd.c            | 12 +++++-------
 include/linux/eventfd.h | 11 +++++------
 include/linux/sched.h   |  4 ++++
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/fs/aio.c b/fs/aio.c
index c72b2c51b446c..f7d47c9ff6deb 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1761,7 +1761,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
 		list_del_init(&req->wait.entry);
 		list_del(&iocb->ki_list);
 		iocb->ki_res.res = mangle_poll(mask);
-		if (iocb->ki_eventfd && eventfd_signal_count()) {
+		if (iocb->ki_eventfd && eventfd_signal_allowed()) {
 			iocb = NULL;
 			INIT_WORK(&req->work, aio_poll_put_work);
 			schedule_work(&req->work);
diff --git a/fs/eventfd.c b/fs/eventfd.c
index df466ef81dddf..9035ca60bfcf3 100644
--- a/fs/eventfd.c
+++ b/fs/eventfd.c
@@ -25,8 +25,6 @@
 #include <linux/idr.h>
 #include <linux/uio.h>
 
-DEFINE_PER_CPU(int, eventfd_wake_count);
-
 static DEFINE_IDA(eventfd_ida);
 
 struct eventfd_ctx {
@@ -67,21 +65,21 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n)
 	 * Deadlock or stack overflow issues can happen if we recurse here
 	 * through waitqueue wakeup handlers. If the caller users potentially
 	 * nested waitqueues with custom wakeup handlers, then it should
-	 * check eventfd_signal_count() before calling this function. If
-	 * it returns true, the eventfd_signal() call should be deferred to a
+	 * check eventfd_signal_allowed() before calling this function. If
+	 * it returns false, the eventfd_signal() call should be deferred to a
 	 * safe context.
 	 */
-	if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count)))
+	if (WARN_ON_ONCE(current->in_eventfd_signal))
 		return 0;
 
 	spin_lock_irqsave(&ctx->wqh.lock, flags);
-	this_cpu_inc(eventfd_wake_count);
+	current->in_eventfd_signal = 1;
 	if (ULLONG_MAX - ctx->count < n)
 		n = ULLONG_MAX - ctx->count;
 	ctx->count += n;
 	if (waitqueue_active(&ctx->wqh))
 		wake_up_locked_poll(&ctx->wqh, EPOLLIN);
-	this_cpu_dec(eventfd_wake_count);
+	current->in_eventfd_signal = 0;
 	spin_unlock_irqrestore(&ctx->wqh.lock, flags);
 
 	return n;
diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h
index dc4fd8a6644dd..836b4c021a0a4 100644
--- a/include/linux/eventfd.h
+++ b/include/linux/eventfd.h
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 #include <linux/percpu-defs.h>
 #include <linux/percpu.h>
+#include <linux/sched.h>
 
 /*
  * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
@@ -42,11 +43,9 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n);
 int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait,
 				  __u64 *cnt);
 
-DECLARE_PER_CPU(int, eventfd_wake_count);
-
-static inline bool eventfd_signal_count(void)
+static inline bool eventfd_signal_allowed(void)
 {
-	return this_cpu_read(eventfd_wake_count);
+	return !current->in_eventfd_signal;
 }
 
 #else /* CONFIG_EVENTFD */
@@ -77,9 +76,9 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx,
 	return -ENOSYS;
 }
 
-static inline bool eventfd_signal_count(void)
+static inline bool eventfd_signal_allowed(void)
 {
-	return false;
+	return true;
 }
 
 #endif
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 409a24036952c..29e6ff1af1df9 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -852,6 +852,10 @@ struct task_struct {
 	/* Stalled due to lack of memory */
 	unsigned			in_memstall:1;
 #endif
+#ifdef CONFIG_EVENTFD
+	/* Recursion prevention for eventfd_signal() */
+	unsigned			in_eventfd_signal:1;
+#endif
 
 	unsigned long			atomic_flags; /* Flags requiring atomic access. */
 
-- 
2.33.1


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

* [PATCH RT 2/3] stop_machine: Remove this_cpu_ptr() from print_stop_info().
  2022-01-07  2:14 [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Claudio R. Goncalves
  2022-01-07  2:15 ` [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit Luis Claudio R. Goncalves
@ 2022-01-07  2:15 ` Luis Claudio R. Goncalves
  2022-01-07  2:15 ` [PATCH RT 3/3] Linux 5.10.90-rt61-rc1 Luis Claudio R. Goncalves
  2022-01-07  2:19 ` [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Goncalves
  3 siblings, 0 replies; 8+ messages in thread
From: Luis Claudio R. Goncalves @ 2022-01-07  2:15 UTC (permalink / raw)
  To: linux-rt-users, stable-rt@vger.kernel.org, Steven Rostedt,
	Thomas Gleixner, Carsten Emde, Sebastian Andrzej Siewior,
	Daniel Wagner, Tom Zanussi, Clark Williams, Mark Gross,
	Jeff Brady, Luis Goncalves

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

v5.10.90-rt61-rc1 stable review patch.
If anyone has any objections, please let me know.

-----------


This aligns the patch ("stop_machine: Add function and caller debug
info) with commit
  a8b62fd085050 ("stop_machine: Add function and caller debug info")

that was merged upstream and is slightly different.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 kernel/stop_machine.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index dbf585cf4b9f8..971d8acceaecb 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -51,7 +51,11 @@ static bool stop_machine_initialized = false;
 
 void print_stop_info(const char *log_lvl, struct task_struct *task)
 {
-	struct cpu_stopper *stopper = this_cpu_ptr(&cpu_stopper);
+	/*
+	 * If @task is a stopper task, it cannot migrate and task_cpu() is
+	 * stable.
+	 */
+	struct cpu_stopper *stopper = per_cpu_ptr(&cpu_stopper, task_cpu(task));
 
 	if (task != stopper->thread)
 		return;
-- 
2.33.1


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

* [PATCH RT 3/3] Linux 5.10.90-rt61-rc1
  2022-01-07  2:14 [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Claudio R. Goncalves
  2022-01-07  2:15 ` [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit Luis Claudio R. Goncalves
  2022-01-07  2:15 ` [PATCH RT 2/3] stop_machine: Remove this_cpu_ptr() from print_stop_info() Luis Claudio R. Goncalves
@ 2022-01-07  2:15 ` Luis Claudio R. Goncalves
  2022-01-07  2:19 ` [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Goncalves
  3 siblings, 0 replies; 8+ messages in thread
From: Luis Claudio R. Goncalves @ 2022-01-07  2:15 UTC (permalink / raw)
  To: linux-rt-users, stable-rt@vger.kernel.org, Steven Rostedt,
	Thomas Gleixner, Carsten Emde, Sebastian Andrzej Siewior,
	Daniel Wagner, Tom Zanussi, Clark Williams, Mark Gross,
	Jeff Brady, Luis Goncalves

v5.10.90-rt61-rc1 stable review patch.
If anyone has any objections, please let me know.

-----------


Signed-off-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com>
---
 localversion-rt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/localversion-rt b/localversion-rt
index 66fa05e70f292..c040746653492 100644
--- a/localversion-rt
+++ b/localversion-rt
@@ -1 +1 @@
--rt60
+-rt61-rc1
-- 
2.33.1


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

* Re: [PATCH RT 0/3] Linux v5.10.90-rt61-rc1
  2022-01-07  2:14 [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Claudio R. Goncalves
                   ` (2 preceding siblings ...)
  2022-01-07  2:15 ` [PATCH RT 3/3] Linux 5.10.90-rt61-rc1 Luis Claudio R. Goncalves
@ 2022-01-07  2:19 ` Luis Goncalves
  3 siblings, 0 replies; 8+ messages in thread
From: Luis Goncalves @ 2022-01-07  2:19 UTC (permalink / raw)
  To: linux-rt-users, stable-rt, Steven Rostedt, Thomas Gleixner,
	Carsten Emde, Sebastian Andrzej Siewior, Daniel Wagner,
	Tom Zanussi, Clark Williams, Mark Gross, Jeff Brady,
	Luis Goncalves

On Thu, Jan 6, 2022 at 11:15 PM Luis Claudio R. Goncalves
<lgoncalv@redhat.com> wrote:
>
> Dear RT Folks,
>
> This is the RT stable review cycle of patch 5.10.90-rt61-rc1.
>
> Please scream at me if I messed something up. Please test the patches
> too.
>
> The -rc release will be uploaded to kernel.org and will be deleted
> when the final release is out. This is just a review release (or
> release candidate).
>
> The pre-releases will not be pushed to the git repository, only the
> final release is.
>
> If all goes well, this patch will be converted to the next main
> release on 2022-01-13.
>
> Known problem:
>
>   There is a printk build warning that would be fixed by commit 43a17111c2553
>   ("printk: wake up klogd in vprintk_emit"), already present in v4.19-rt. I am
>   trying to decide whether it is justifiable to suggest the backport of this
>   commit to 4.14-stable or if I should write a simple rt-only fix. Comments are
>   welcome.

Please disregard the note above. That was an error in my template message.
There are no known errors in this -rc1 release.

Sorry for any inconvenience.

> To build 5.10.90-rt61-rc1 directly, the following patches should be applied:
>
>   https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.xz
>
>   https://www.kernel.org/pub/linux/kernel/v5.x/patch-5.10.90.xz
>
>   https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.90-rt61-rc1.patch.xz
>
>
> You can also build from 5.10.90-rt60 by applying the incremental patch:
>
>   https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/incr/patch-5.10.90-rt60-rt61-rc1.patch.xz
>
> Enjoy,
>
> -- Luis
>
>
>
> Luis Claudio R. Goncalves (1):
>   Linux 5.10.90-rt61-rc1
>
> Sebastian Andrzej Siewior (1):
>   stop_machine: Remove this_cpu_ptr() from print_stop_info().
>
> Thomas Gleixner (1):
>   eventfd: Make signal recursion protection a task bit
>
>  fs/aio.c                |  2 +-
>  fs/eventfd.c            | 12 +++++-------
>  include/linux/eventfd.h | 11 +++++------
>  include/linux/sched.h   |  4 ++++
>  kernel/stop_machine.c   |  6 +++++-
>  localversion-rt         |  2 +-
>  6 files changed, 21 insertions(+), 16 deletions(-)
>
> --
> 2.33.1
>


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

* Re: [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit
  2022-01-07  2:15 ` [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit Luis Claudio R. Goncalves
@ 2022-02-03  8:59   ` Daniel Vacek
  2022-02-03  9:16     ` Daniel Vacek
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Vacek @ 2022-02-03  8:59 UTC (permalink / raw)
  To: Luis Claudio R. Goncalves
  Cc: linux-rt-users, stable-rt, Steven Rostedt, Thomas Gleixner,
	Carsten Emde, Sebastian Andrzej Siewior, Daniel Wagner,
	Tom Zanussi, Clark Williams, Mark Gross, Jeff Brady,
	Daniel Bristot de Oliveira, Jason Wang, Al Viro

Hi,

OT: Btw for some reason you're sending a copy to
"stable-rt@vger.kernel.org"@redhat.com.

On Fri, Jan 7, 2022 at 8:04 PM Luis Claudio R. Goncalves
<lgoncalv@redhat.com> wrote:
>
> From: Thomas Gleixner <tglx@linutronix.de>
>
> v5.10.90-rt61-rc1 stable review patch.
> If anyone has any objections, please let me know.
>
> -----------
>
>
> Upstream commit b542e383d8c005f06a131e2b40d5889b812f19c6
>
> The recursion protection for eventfd_signal() is based on a per CPU
> variable and relies on the !RT semantics of spin_lock_irqsave() for
> protecting this per CPU variable. On RT kernels spin_lock_irqsave() neither
> disables preemption nor interrupts which allows the spin lock held section
> to be preempted. If the preempting task invokes eventfd_signal() as well,
> then the recursion warning triggers.
>
> Paolo suggested to protect the per CPU variable with a local lock, but
> that's heavyweight and actually not necessary. The goal of this protection
> is to prevent the task stack from overflowing, which can be achieved with a
> per task recursion protection as well.
>
> Replace the per CPU variable with a per task bit similar to other recursion
> protection bits like task_struct::in_page_owner. This works on both !RT and
> RT kernels and removes as a side effect the extra per CPU storage.
>
> No functional change for !RT kernels.
>
> Reported-by: Daniel Bristot de Oliveira <bristot@redhat.com>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Tested-by: Daniel Bristot de Oliveira <bristot@redhat.com>
> Acked-by: Jason Wang <jasowang@redhat.com>
> Cc: Al Viro <viro@zeniv.linux.org.uk>
> Link: https://lore.kernel.org/r/87wnp9idso.ffs@tglx
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
>  fs/aio.c                |  2 +-
>  fs/eventfd.c            | 12 +++++-------
>  include/linux/eventfd.h | 11 +++++------
>  include/linux/sched.h   |  4 ++++
>  4 files changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/fs/aio.c b/fs/aio.c
> index c72b2c51b446c..f7d47c9ff6deb 100644
> --- a/fs/aio.c
> +++ b/fs/aio.c
> @@ -1761,7 +1761,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
>                 list_del_init(&req->wait.entry);
>                 list_del(&iocb->ki_list);
>                 iocb->ki_res.res = mangle_poll(mask);
> -               if (iocb->ki_eventfd && eventfd_signal_count()) {
> +               if (iocb->ki_eventfd && eventfd_signal_allowed()) {

IIUC, the logic changed and this should read
!eventfd_signal_allowed(). Or am I missing something here?

Actually checking other stable branches and upstream, this looks to be
a typo only in v5.10.90-rt61-rc1

--nX




>                         iocb = NULL;
>                         INIT_WORK(&req->work, aio_poll_put_work);
>                         schedule_work(&req->work);
> diff --git a/fs/eventfd.c b/fs/eventfd.c
> index df466ef81dddf..9035ca60bfcf3 100644
> --- a/fs/eventfd.c
> +++ b/fs/eventfd.c
> @@ -25,8 +25,6 @@
>  #include <linux/idr.h>
>  #include <linux/uio.h>
>
> -DEFINE_PER_CPU(int, eventfd_wake_count);
> -
>  static DEFINE_IDA(eventfd_ida);
>
>  struct eventfd_ctx {
> @@ -67,21 +65,21 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n)
>          * Deadlock or stack overflow issues can happen if we recurse here
>          * through waitqueue wakeup handlers. If the caller users potentially
>          * nested waitqueues with custom wakeup handlers, then it should
> -        * check eventfd_signal_count() before calling this function. If
> -        * it returns true, the eventfd_signal() call should be deferred to a
> +        * check eventfd_signal_allowed() before calling this function. If
> +        * it returns false, the eventfd_signal() call should be deferred to a
>          * safe context.
>          */
> -       if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count)))
> +       if (WARN_ON_ONCE(current->in_eventfd_signal))
>                 return 0;
>
>         spin_lock_irqsave(&ctx->wqh.lock, flags);
> -       this_cpu_inc(eventfd_wake_count);
> +       current->in_eventfd_signal = 1;
>         if (ULLONG_MAX - ctx->count < n)
>                 n = ULLONG_MAX - ctx->count;
>         ctx->count += n;
>         if (waitqueue_active(&ctx->wqh))
>                 wake_up_locked_poll(&ctx->wqh, EPOLLIN);
> -       this_cpu_dec(eventfd_wake_count);
> +       current->in_eventfd_signal = 0;
>         spin_unlock_irqrestore(&ctx->wqh.lock, flags);
>
>         return n;
> diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h
> index dc4fd8a6644dd..836b4c021a0a4 100644
> --- a/include/linux/eventfd.h
> +++ b/include/linux/eventfd.h
> @@ -14,6 +14,7 @@
>  #include <linux/err.h>
>  #include <linux/percpu-defs.h>
>  #include <linux/percpu.h>
> +#include <linux/sched.h>
>
>  /*
>   * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
> @@ -42,11 +43,9 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n);
>  int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait,
>                                   __u64 *cnt);
>
> -DECLARE_PER_CPU(int, eventfd_wake_count);
> -
> -static inline bool eventfd_signal_count(void)
> +static inline bool eventfd_signal_allowed(void)
>  {
> -       return this_cpu_read(eventfd_wake_count);
> +       return !current->in_eventfd_signal;
>  }
>
>  #else /* CONFIG_EVENTFD */
> @@ -77,9 +76,9 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx,
>         return -ENOSYS;
>  }
>
> -static inline bool eventfd_signal_count(void)
> +static inline bool eventfd_signal_allowed(void)
>  {
> -       return false;
> +       return true;
>  }
>
>  #endif
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 409a24036952c..29e6ff1af1df9 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -852,6 +852,10 @@ struct task_struct {
>         /* Stalled due to lack of memory */
>         unsigned                        in_memstall:1;
>  #endif
> +#ifdef CONFIG_EVENTFD
> +       /* Recursion prevention for eventfd_signal() */
> +       unsigned                        in_eventfd_signal:1;
> +#endif
>
>         unsigned long                   atomic_flags; /* Flags requiring atomic access. */
>
> --
> 2.33.1
>

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

* Re: [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit
  2022-02-03  8:59   ` Daniel Vacek
@ 2022-02-03  9:16     ` Daniel Vacek
  2022-02-03 21:42       ` Luis Goncalves
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Vacek @ 2022-02-03  9:16 UTC (permalink / raw)
  To: Luis Claudio R. Goncalves
  Cc: linux-rt-users, stable-rt, Steven Rostedt, Thomas Gleixner,
	Carsten Emde, Sebastian Andrzej Siewior, Daniel Wagner,
	Tom Zanussi, Clark Williams, Mark Gross, Jeff Brady,
	Daniel Bristot de Oliveira, Jason Wang, Al Viro

Actually I see it was fixed later with
4b3749865374899e115aa8c48681709b086fe6d3 so I guess it should be
included as well.

--nX

On Thu, Feb 3, 2022 at 9:59 AM Daniel Vacek <neelx.g@gmail.com> wrote:
>
> Hi,
>
> OT: Btw for some reason you're sending a copy to
> "stable-rt@vger.kernel.org"@redhat.com.
>
> On Fri, Jan 7, 2022 at 8:04 PM Luis Claudio R. Goncalves
> <lgoncalv@redhat.com> wrote:
> >
> > From: Thomas Gleixner <tglx@linutronix.de>
> >
> > v5.10.90-rt61-rc1 stable review patch.
> > If anyone has any objections, please let me know.
> >
> > -----------
> >
> >
> > Upstream commit b542e383d8c005f06a131e2b40d5889b812f19c6
> >
> > The recursion protection for eventfd_signal() is based on a per CPU
> > variable and relies on the !RT semantics of spin_lock_irqsave() for
> > protecting this per CPU variable. On RT kernels spin_lock_irqsave() neither
> > disables preemption nor interrupts which allows the spin lock held section
> > to be preempted. If the preempting task invokes eventfd_signal() as well,
> > then the recursion warning triggers.
> >
> > Paolo suggested to protect the per CPU variable with a local lock, but
> > that's heavyweight and actually not necessary. The goal of this protection
> > is to prevent the task stack from overflowing, which can be achieved with a
> > per task recursion protection as well.
> >
> > Replace the per CPU variable with a per task bit similar to other recursion
> > protection bits like task_struct::in_page_owner. This works on both !RT and
> > RT kernels and removes as a side effect the extra per CPU storage.
> >
> > No functional change for !RT kernels.
> >
> > Reported-by: Daniel Bristot de Oliveira <bristot@redhat.com>
> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> > Tested-by: Daniel Bristot de Oliveira <bristot@redhat.com>
> > Acked-by: Jason Wang <jasowang@redhat.com>
> > Cc: Al Viro <viro@zeniv.linux.org.uk>
> > Link: https://lore.kernel.org/r/87wnp9idso.ffs@tglx
> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > ---
> >  fs/aio.c                |  2 +-
> >  fs/eventfd.c            | 12 +++++-------
> >  include/linux/eventfd.h | 11 +++++------
> >  include/linux/sched.h   |  4 ++++
> >  4 files changed, 15 insertions(+), 14 deletions(-)
> >
> > diff --git a/fs/aio.c b/fs/aio.c
> > index c72b2c51b446c..f7d47c9ff6deb 100644
> > --- a/fs/aio.c
> > +++ b/fs/aio.c
> > @@ -1761,7 +1761,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
> >                 list_del_init(&req->wait.entry);
> >                 list_del(&iocb->ki_list);
> >                 iocb->ki_res.res = mangle_poll(mask);
> > -               if (iocb->ki_eventfd && eventfd_signal_count()) {
> > +               if (iocb->ki_eventfd && eventfd_signal_allowed()) {
>
> IIUC, the logic changed and this should read
> !eventfd_signal_allowed(). Or am I missing something here?
>
> Actually checking other stable branches and upstream, this looks to be
> a typo only in v5.10.90-rt61-rc1
>
> --nX
>
>
>
>
> >                         iocb = NULL;
> >                         INIT_WORK(&req->work, aio_poll_put_work);
> >                         schedule_work(&req->work);
> > diff --git a/fs/eventfd.c b/fs/eventfd.c
> > index df466ef81dddf..9035ca60bfcf3 100644
> > --- a/fs/eventfd.c
> > +++ b/fs/eventfd.c
> > @@ -25,8 +25,6 @@
> >  #include <linux/idr.h>
> >  #include <linux/uio.h>
> >
> > -DEFINE_PER_CPU(int, eventfd_wake_count);
> > -
> >  static DEFINE_IDA(eventfd_ida);
> >
> >  struct eventfd_ctx {
> > @@ -67,21 +65,21 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n)
> >          * Deadlock or stack overflow issues can happen if we recurse here
> >          * through waitqueue wakeup handlers. If the caller users potentially
> >          * nested waitqueues with custom wakeup handlers, then it should
> > -        * check eventfd_signal_count() before calling this function. If
> > -        * it returns true, the eventfd_signal() call should be deferred to a
> > +        * check eventfd_signal_allowed() before calling this function. If
> > +        * it returns false, the eventfd_signal() call should be deferred to a
> >          * safe context.
> >          */
> > -       if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count)))
> > +       if (WARN_ON_ONCE(current->in_eventfd_signal))
> >                 return 0;
> >
> >         spin_lock_irqsave(&ctx->wqh.lock, flags);
> > -       this_cpu_inc(eventfd_wake_count);
> > +       current->in_eventfd_signal = 1;
> >         if (ULLONG_MAX - ctx->count < n)
> >                 n = ULLONG_MAX - ctx->count;
> >         ctx->count += n;
> >         if (waitqueue_active(&ctx->wqh))
> >                 wake_up_locked_poll(&ctx->wqh, EPOLLIN);
> > -       this_cpu_dec(eventfd_wake_count);
> > +       current->in_eventfd_signal = 0;
> >         spin_unlock_irqrestore(&ctx->wqh.lock, flags);
> >
> >         return n;
> > diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h
> > index dc4fd8a6644dd..836b4c021a0a4 100644
> > --- a/include/linux/eventfd.h
> > +++ b/include/linux/eventfd.h
> > @@ -14,6 +14,7 @@
> >  #include <linux/err.h>
> >  #include <linux/percpu-defs.h>
> >  #include <linux/percpu.h>
> > +#include <linux/sched.h>
> >
> >  /*
> >   * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
> > @@ -42,11 +43,9 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n);
> >  int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait,
> >                                   __u64 *cnt);
> >
> > -DECLARE_PER_CPU(int, eventfd_wake_count);
> > -
> > -static inline bool eventfd_signal_count(void)
> > +static inline bool eventfd_signal_allowed(void)
> >  {
> > -       return this_cpu_read(eventfd_wake_count);
> > +       return !current->in_eventfd_signal;
> >  }
> >
> >  #else /* CONFIG_EVENTFD */
> > @@ -77,9 +76,9 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx,
> >         return -ENOSYS;
> >  }
> >
> > -static inline bool eventfd_signal_count(void)
> > +static inline bool eventfd_signal_allowed(void)
> >  {
> > -       return false;
> > +       return true;
> >  }
> >
> >  #endif
> > diff --git a/include/linux/sched.h b/include/linux/sched.h
> > index 409a24036952c..29e6ff1af1df9 100644
> > --- a/include/linux/sched.h
> > +++ b/include/linux/sched.h
> > @@ -852,6 +852,10 @@ struct task_struct {
> >         /* Stalled due to lack of memory */
> >         unsigned                        in_memstall:1;
> >  #endif
> > +#ifdef CONFIG_EVENTFD
> > +       /* Recursion prevention for eventfd_signal() */
> > +       unsigned                        in_eventfd_signal:1;
> > +#endif
> >
> >         unsigned long                   atomic_flags; /* Flags requiring atomic access. */
> >
> > --
> > 2.33.1
> >

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

* Re: [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit
  2022-02-03  9:16     ` Daniel Vacek
@ 2022-02-03 21:42       ` Luis Goncalves
  0 siblings, 0 replies; 8+ messages in thread
From: Luis Goncalves @ 2022-02-03 21:42 UTC (permalink / raw)
  To: Daniel Vacek
  Cc: linux-rt-users, stable-rt, Steven Rostedt, Thomas Gleixner,
	Carsten Emde, Sebastian Andrzej Siewior, Daniel Wagner,
	Tom Zanussi, Clark Williams, Mark Gross, Jeff Brady,
	Daniel Bristot de Oliveira, Jason Wang, Al Viro

On Thu, Feb 3, 2022 at 6:17 AM Daniel Vacek <neelx.g@gmail.com> wrote:
>
> Actually I see it was fixed later with
> 4b3749865374899e115aa8c48681709b086fe6d3 so I guess it should be
> included as well.

Thank you for the feedback!
I will proceed with the changes and testing to release the kernel
probably on Monday.

Also, thank you for the note about the wrong email address!

Best regards,
Luis


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

end of thread, other threads:[~2022-02-03 21:43 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-07  2:14 [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Claudio R. Goncalves
2022-01-07  2:15 ` [PATCH RT 1/3] eventfd: Make signal recursion protection a task bit Luis Claudio R. Goncalves
2022-02-03  8:59   ` Daniel Vacek
2022-02-03  9:16     ` Daniel Vacek
2022-02-03 21:42       ` Luis Goncalves
2022-01-07  2:15 ` [PATCH RT 2/3] stop_machine: Remove this_cpu_ptr() from print_stop_info() Luis Claudio R. Goncalves
2022-01-07  2:15 ` [PATCH RT 3/3] Linux 5.10.90-rt61-rc1 Luis Claudio R. Goncalves
2022-01-07  2:19 ` [PATCH RT 0/3] Linux v5.10.90-rt61-rc1 Luis Goncalves

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.