2013-04-29 07:13:30

by Stefan Kristiansson

[permalink] [raw]
Subject: [PATCH] openrisc: call do_notify_resume() with interrupts enabled

A signal delivered through do_notify_resume() would cause the
irqs_disabled() check in _local_bh_enable_ip() to be triggered.

Enable interrupts before calling do_notify_resume().

Signed-off-by: Stefan Kristiansson <[email protected]>
---
arch/openrisc/kernel/entry.S | 1 +
1 file changed, 1 insertion(+)

diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
index d8a455e..55ffc97 100644
--- a/arch/openrisc/kernel/entry.S
+++ b/arch/openrisc/kernel/entry.S
@@ -874,6 +874,7 @@ _work_pending:
* must be set so that the syscall restart functionality works.
*/
_work_notifysig:
+ ENABLE_INTERRUPTS(r29)
l.jal do_notify_resume
l.ori r3,r1,0 /* pt_regs */

--
1.8.1.2


2013-04-29 09:50:59

by Stefan Kristiansson

[permalink] [raw]
Subject: Re: [PATCH] openrisc: call do_notify_resume() with interrupts enabled

On Mon, Apr 29, 2013 at 10:12:37AM +0300, Stefan Kristiansson wrote:
> A signal delivered through do_notify_resume() would cause the
> irqs_disabled() check in _local_bh_enable_ip() to be triggered.
>
> Enable interrupts before calling do_notify_resume().
>
> Signed-off-by: Stefan Kristiansson <[email protected]>
> ---
> arch/openrisc/kernel/entry.S | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
> index d8a455e..55ffc97 100644
> --- a/arch/openrisc/kernel/entry.S
> +++ b/arch/openrisc/kernel/entry.S
> @@ -874,6 +874,7 @@ _work_pending:
> * must be set so that the syscall restart functionality works.
> */
> _work_notifysig:
> + ENABLE_INTERRUPTS(r29)
> l.jal do_notify_resume
> l.ori r3,r1,0 /* pt_regs */
>

I just realised that this one-liner isn't quite enough,
the flags that are used in do_notify_resume() has to be read with
interrupts off.
Revised patch coming up.

Stefan

2013-04-29 10:40:47

by Stefan Kristiansson

[permalink] [raw]
Subject: [PATCH v2] openrisc: call do_notify_resume() with interrupts enabled

A signal delivered through do_notify_resume() would cause the
irqs_disabled() check in _local_bh_enable_ip() to be triggered.

Enable interrupts before calling do_notify_resume(), but read
the current_thread_info->flags before doing so.

Signed-off-by: Stefan Kristiansson <[email protected]>
---
arch/openrisc/kernel/entry.S | 5 +++--
arch/openrisc/kernel/signal.c | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
index d8a455e..7564784 100644
--- a/arch/openrisc/kernel/entry.S
+++ b/arch/openrisc/kernel/entry.S
@@ -858,8 +858,8 @@ _work_pending:
* if (current_thread_info->flags & _TIF_NEED_RESCHED)
* schedule();
*/
- l.lwz r5,TI_FLAGS(r10)
- l.andi r3,r5,_TIF_NEED_RESCHED
+ l.lwz r4,TI_FLAGS(r10)
+ l.andi r3,r4,_TIF_NEED_RESCHED
l.sfnei r3,0
l.bnf _work_notifysig
l.nop
@@ -874,6 +874,7 @@ _work_pending:
* must be set so that the syscall restart functionality works.
*/
_work_notifysig:
+ ENABLE_INTERRUPTS(r29)
l.jal do_notify_resume
l.ori r3,r1,0 /* pt_regs */

diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c
index ae167f7..032bed1 100644
--- a/arch/openrisc/kernel/signal.c
+++ b/arch/openrisc/kernel/signal.c
@@ -331,12 +331,13 @@ void do_signal(struct pt_regs *regs)
return;
}

-asmlinkage void do_notify_resume(struct pt_regs *regs)
+asmlinkage void do_notify_resume(struct pt_regs *regs,
+ unsigned long thread_flags)
{
- if (current_thread_info()->flags & _TIF_SIGPENDING)
+ if (thread_flags & _TIF_SIGPENDING)
do_signal(regs);

- if (current_thread_info()->flags & _TIF_NOTIFY_RESUME) {
+ if (thread_flags & _TIF_NOTIFY_RESUME) {
clear_thread_flag(TIF_NOTIFY_RESUME);
tracehook_notify_resume(regs);
}
--
1.8.1.2

2013-06-26 08:35:58

by Henrik Nordström

[permalink] [raw]
Subject: Re: openrisc: call do_notify_resume() with interrupts enabled

mån 2013-04-29 klockan 10:12 +0300 skrev Stefan Kristiansson:
> A signal delivered through do_notify_resume() would cause the
> irqs_disabled() check in _local_bh_enable_ip() to be triggered.
>
> Enable interrupts before calling do_notify_resume().
>
> Signed-off-by: Stefan Kristiansson <[email protected]>

Tested-by: Henrik Nordstrom <[email protected]>

Regards
Henrik