[PATCH RESEND v2 07/23] powerpc/rtasd: let procfs own the wait queue of the rtas error log

From: Christian Brauner

Date: Wed Nov 04 2026 - 15:18:47 EST


rtas_log_poll() sleeps the poller on rtas_log_wait, which the blocking
read sleeps on as well. procfs owns the queue poll() uses now, so leave
the poll_wait() to it and wake its pollers along with the readers.

Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
arch/powerpc/kernel/rtasd.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kernel/rtasd.c b/arch/powerpc/kernel/rtasd.c
index 360ed2e30fd5..fa9574131f40 100644
--- a/arch/powerpc/kernel/rtasd.c
+++ b/arch/powerpc/kernel/rtasd.c
@@ -33,6 +33,7 @@
static DEFINE_SPINLOCK(rtasd_log_lock);

static DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
+static struct proc_dir_entry *rtas_log_entry;

static char *rtas_log_buf;
static unsigned long rtas_log_start;
@@ -259,6 +260,7 @@ void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
WARN_ON_ONCE(!irqs_disabled()); /* @@@ DEBUG @@@ */
spin_unlock_irqrestore(&rtasd_log_lock, s);
wake_up_interruptible(&rtas_log_wait);
+ proc_poll_notify(rtas_log_entry);
break;
case ERR_TYPE_KERNEL_PANIC:
default:
@@ -343,7 +345,6 @@ out:

static __poll_t rtas_log_poll(struct file *file, poll_table * wait)
{
- poll_wait(file, &rtas_log_wait, wait);
if (rtas_log_size)
return EPOLLIN | EPOLLRDNORM;
return 0;
@@ -529,17 +530,15 @@ arch_initcall(rtas_event_scan_init);

static int __init rtas_init(void)
{
- struct proc_dir_entry *entry;
-
if (!machine_is(pseries) && !machine_is(chrp))
return 0;

if (!rtas_log_buf)
return -ENODEV;

- entry = proc_create("powerpc/rtas/error_log", 0400, NULL,
- &rtas_log_proc_ops);
- if (!entry)
+ rtas_log_entry = proc_create("powerpc/rtas/error_log", 0400, NULL,
+ &rtas_log_proc_ops);
+ if (!rtas_log_entry)
printk(KERN_ERR "Failed to create error_log proc entry\n");

return 0;

--
2.53.0