diff mbox series

[1/2] powerpc/pseries: Avoid blocking rtas polling handling multiple PRRN events

Message ID 20180713142224.4516-2-jallen@linux.ibm.com (mailing list archive)
State Superseded
Headers show
Series powerpc/pseries: Improve serialization of PRRN events | expand

Commit Message

John Allen July 13, 2018, 2:22 p.m. UTC
When a PRRN event is being handled and another PRRN event comes in, the
second event will block rtas polling waiting on the first to complete,
preventing any further rtas events from being handled. This can be
especially problematic in case that PRRN events are continuously being
queued in which case rtas polling gets indefinitely blocked completely.

This patch introduces a mutex that prevents any subsequent PRRN events from
running while there is a prrn event being handled, allowing rtas polling to
continue normally.

Signed-off-by: John Allen <jallen@linux.ibm.com>
---
 arch/powerpc/kernel/rtasd.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Comments

John Allen July 16, 2018, 9:23 p.m. UTC | #1
On Fri, Jul 13, 2018 at 09:22:23AM -0500, John Allen wrote:
>When a PRRN event is being handled and another PRRN event comes in, the
>second event will block rtas polling waiting on the first to complete,
>preventing any further rtas events from being handled. This can be
>especially problematic in case that PRRN events are continuously being
>queued in which case rtas polling gets indefinitely blocked completely.
>
>This patch introduces a mutex that prevents any subsequent PRRN events from
>running while there is a prrn event being handled, allowing rtas polling to
>continue normally.
>
>Signed-off-by: John Allen <jallen@linux.ibm.com>
>---
> arch/powerpc/kernel/rtasd.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
>diff --git a/arch/powerpc/kernel/rtasd.c b/arch/powerpc/kernel/rtasd.c
>index 44d66c33d59d..8a72a53d62c0 100644
>--- a/arch/powerpc/kernel/rtasd.c
>+++ b/arch/powerpc/kernel/rtasd.c
>@@ -35,6 +35,8 @@
>
> static DEFINE_SPINLOCK(rtasd_log_lock);
>
>+static DEFINE_MUTEX(prrn_lock);
>+
> static DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
>
> static char *rtas_log_buf;
>@@ -290,9 +292,12 @@ static DECLARE_WORK(prrn_work, prrn_work_fn);
>
> static void prrn_schedule_update(u32 scope)
> {
>-	flush_work(&prrn_work);
>-	prrn_update_scope = scope;
>-	schedule_work(&prrn_work);
>+	if (mutex_trylock(&prrn_lock)) {
>+		flush_work(&prrn_work);
>+		prrn_update_scope = scope;
>+		schedule_work(&prrn_work);
>+		mutex_unlock(&prrn_lock);

This appears to be bugged. The mutex_unlock should be done elsewhere.  
Will send an updated version.

-John

>+	}
> }
>
> static void handle_rtas_event(const struct rtas_error_log *log)
>-- 
>2.17.1
>
diff mbox series

Patch

diff --git a/arch/powerpc/kernel/rtasd.c b/arch/powerpc/kernel/rtasd.c
index 44d66c33d59d..8a72a53d62c0 100644
--- a/arch/powerpc/kernel/rtasd.c
+++ b/arch/powerpc/kernel/rtasd.c
@@ -35,6 +35,8 @@ 
 
 static DEFINE_SPINLOCK(rtasd_log_lock);
 
+static DEFINE_MUTEX(prrn_lock);
+
 static DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
 
 static char *rtas_log_buf;
@@ -290,9 +292,12 @@  static DECLARE_WORK(prrn_work, prrn_work_fn);
 
 static void prrn_schedule_update(u32 scope)
 {
-	flush_work(&prrn_work);
-	prrn_update_scope = scope;
-	schedule_work(&prrn_work);
+	if (mutex_trylock(&prrn_lock)) {
+		flush_work(&prrn_work);
+		prrn_update_scope = scope;
+		schedule_work(&prrn_work);
+		mutex_unlock(&prrn_lock);
+	}
 }
 
 static void handle_rtas_event(const struct rtas_error_log *log)