[PATCH] powerpc: eeh_event: convert semaphore to completion

Subsystems: linux for powerpc (32-bit and 64-bit), pci enhanced error handling (eeh) for powerpc, the rest

STALE2818d

4 messages, 4 authors, 2018-12-22 · open the first message on its own page

[PATCH] powerpc: eeh_event: convert semaphore to completion

From: Arnd Bergmann <arnd@arndb.de>
Date: 2018-12-10 21:52:27

For this use case, completions and semaphores are equivalent,
but semaphores are an awkward interface that should generally
be avoided, so use the completion instead.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/powerpc/kernel/eeh_event.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/powerpc/kernel/eeh_event.c b/arch/powerpc/kernel/eeh_event.c
index 61c9356bf9c9..227e57f980df 100644
--- a/arch/powerpc/kernel/eeh_event.c
+++ b/arch/powerpc/kernel/eeh_event.c
@@ -35,7 +35,7 @@
  */
 
 static DEFINE_SPINLOCK(eeh_eventlist_lock);
-static struct semaphore eeh_eventlist_sem;
+static DECLARE_COMPLETION(eeh_eventlist_event);
 static LIST_HEAD(eeh_eventlist);
 
 /**
@@ -55,7 +55,7 @@ static int eeh_event_handler(void * dummy)
 	struct eeh_pe *pe;
 
 	while (!kthread_should_stop()) {
-		if (down_interruptible(&eeh_eventlist_sem))
+		if (wait_for_completion_interruptible(&eeh_eventlist_event))
 			break;
 
 		/* Fetch EEH event from the queue */
@@ -102,9 +102,6 @@ int eeh_event_init(void)
 	struct task_struct *t;
 	int ret = 0;
 
-	/* Initialize semaphore */
-	sema_init(&eeh_eventlist_sem, 0);
-
 	t = kthread_run(eeh_event_handler, NULL, "eehd");
 	if (IS_ERR(t)) {
 		ret = PTR_ERR(t);
@@ -142,7 +139,7 @@ int eeh_send_failure_event(struct eeh_pe *pe)
 	spin_unlock_irqrestore(&eeh_eventlist_lock, flags);
 
 	/* For EEH deamon to knick in */
-	up(&eeh_eventlist_sem);
+	complete(&eeh_eventlist_event);
 
 	return 0;
 }
-- 
2.20.0

Re: [PATCH] powerpc: eeh_event: convert semaphore to completion

From: Oliver <oohall@gmail.com>
Date: 2018-12-10 23:18:45

On Tue, Dec 11, 2018 at 8:52 AM Arnd Bergmann [off-list ref] wrote:
For this use case, completions and semaphores are equivalent,
but semaphores are an awkward interface that should generally
be avoided, so use the completion instead.
IIRC Sam has been reworking the locking used inside of EEH so this is
probably going to clash with his changes. Converting to a completion
is probably a good idea, but we might want to do it as a part of his
series since it's going to collide with this anyway.

Sam, what do you think?
quoted hunk
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/powerpc/kernel/eeh_event.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/powerpc/kernel/eeh_event.c b/arch/powerpc/kernel/eeh_event.c
index 61c9356bf9c9..227e57f980df 100644
--- a/arch/powerpc/kernel/eeh_event.c
+++ b/arch/powerpc/kernel/eeh_event.c
@@ -35,7 +35,7 @@
  */

 static DEFINE_SPINLOCK(eeh_eventlist_lock);
-static struct semaphore eeh_eventlist_sem;
+static DECLARE_COMPLETION(eeh_eventlist_event);
 static LIST_HEAD(eeh_eventlist);

 /**
@@ -55,7 +55,7 @@ static int eeh_event_handler(void * dummy)
        struct eeh_pe *pe;

        while (!kthread_should_stop()) {
-               if (down_interruptible(&eeh_eventlist_sem))
+               if (wait_for_completion_interruptible(&eeh_eventlist_event))
                        break;

                /* Fetch EEH event from the queue */
@@ -102,9 +102,6 @@ int eeh_event_init(void)
        struct task_struct *t;
        int ret = 0;

-       /* Initialize semaphore */
-       sema_init(&eeh_eventlist_sem, 0);
-
        t = kthread_run(eeh_event_handler, NULL, "eehd");
        if (IS_ERR(t)) {
                ret = PTR_ERR(t);
@@ -142,7 +139,7 @@ int eeh_send_failure_event(struct eeh_pe *pe)
        spin_unlock_irqrestore(&eeh_eventlist_lock, flags);

        /* For EEH deamon to knick in */
-       up(&eeh_eventlist_sem);
+       complete(&eeh_eventlist_event);

        return 0;
 }
--
2.20.0

Re: [PATCH] powerpc: eeh_event: convert semaphore to completion

From: Sam Bobroff <hidden>
Date: 2018-12-10 23:33:15

On Tue, Dec 11, 2018 at 10:18:31AM +1100, Oliver wrote:
On Tue, Dec 11, 2018 at 8:52 AM Arnd Bergmann [off-list ref] wrote:
quoted
For this use case, completions and semaphores are equivalent,
but semaphores are an awkward interface that should generally
be avoided, so use the completion instead.
IIRC Sam has been reworking the locking used inside of EEH so this is
probably going to clash with his changes. Converting to a completion
is probably a good idea, but we might want to do it as a part of his
series since it's going to collide with this anyway.

Sam, what do you think?
It's such a small change, I don't think it will cause any problems for
the rework. Anyway it seems like a good change, so I'd prefer to see it
go in :-)

Cheers,
Sam.
quoted
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 arch/powerpc/kernel/eeh_event.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/powerpc/kernel/eeh_event.c b/arch/powerpc/kernel/eeh_event.c
index 61c9356bf9c9..227e57f980df 100644
--- a/arch/powerpc/kernel/eeh_event.c
+++ b/arch/powerpc/kernel/eeh_event.c
@@ -35,7 +35,7 @@
  */

 static DEFINE_SPINLOCK(eeh_eventlist_lock);
-static struct semaphore eeh_eventlist_sem;
+static DECLARE_COMPLETION(eeh_eventlist_event);
 static LIST_HEAD(eeh_eventlist);

 /**
@@ -55,7 +55,7 @@ static int eeh_event_handler(void * dummy)
        struct eeh_pe *pe;

        while (!kthread_should_stop()) {
-               if (down_interruptible(&eeh_eventlist_sem))
+               if (wait_for_completion_interruptible(&eeh_eventlist_event))
                        break;

                /* Fetch EEH event from the queue */
@@ -102,9 +102,6 @@ int eeh_event_init(void)
        struct task_struct *t;
        int ret = 0;

-       /* Initialize semaphore */
-       sema_init(&eeh_eventlist_sem, 0);
-
        t = kthread_run(eeh_event_handler, NULL, "eehd");
        if (IS_ERR(t)) {
                ret = PTR_ERR(t);
@@ -142,7 +139,7 @@ int eeh_send_failure_event(struct eeh_pe *pe)
        spin_unlock_irqrestore(&eeh_eventlist_lock, flags);

        /* For EEH deamon to knick in */
-       up(&eeh_eventlist_sem);
+       complete(&eeh_eventlist_event);

        return 0;
 }
--
2.20.0

Re: powerpc: eeh_event: convert semaphore to completion

From: Michael Ellerman <hidden>
Date: 2018-12-22 17:02:09

On Mon, 2018-12-10 at 21:51:57 UTC, Arnd Bergmann wrote:
For this use case, completions and semaphores are equivalent,
but semaphores are an awkward interface that should generally
be avoided, so use the completion instead.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/2fea82db113e4422ef5c8e62099088

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help