: powerpc: block interrupts when updating TIDR
PATCH 1/1 : powerpc: block interrupts when updating TIDR
From: Sukadev Bhattiprolu <[email protected]>
Date: Tue, 28 Nov 2017 13:39:43 -0600
Subject: [PATCH 1/1]: powerpc: block interrupts when updating TIDR
clear_thread_tidr() is called in interrupt context as a part of delayed put of the task structure (i.e as a part of timer interrupt). To prevent a deadlock, block interrupts when holding vas_thread_id_lock to set/ clear TIDR for a task.
--- arch/powerpc/kernel/process.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
arch/powerpc/kernel/process.c +9 -6
@@ -1509,14 +1509,15 @@ static int assign_thread_tidr(void) {int index;int err; +unsigned long flags; again:if (!ida_pre_get (&vas_thread_ida,GFP_KERNEL ))return -ENOMEM ; -spin_lock (&vas_thread_id_lock); +spin_lock_irqsave (&vas_thread_id_lock, flags); err =ida_get_new_above (&vas_thread_ida,1 , &index); -spin_unlock (&vas_thread_id_lock); +spin_unlock_irqrestore (&vas_thread_id_lock, flags);if (err == -EAGAIN ) goto again;
@@ -1524,9 +1525,9 @@ static int assign_thread_tidr(void)return err;if (index >MAX_THREAD_CONTEXT ) { -spin_lock (&vas_thread_id_lock); +spin_lock_irqsave (&vas_thread_id_lock, flags);ida_remove (&vas_thread_ida, index); -spin_unlock (&vas_thread_id_lock); +spin_unlock_irqrestore (&vas_thread_id_lock, flags);return -ENOMEM ; }
@@ -1535,9 +1536,11 @@ static int assign_thread_tidr(void)static void free_thread_tidr (int id) { -spin_lock (&vas_thread_id_lock); +unsigned long flags; + +spin_lock_irqsave (&vas_thread_id_lock, flags);ida_remove (&vas_thread_ida, id); -spin_unlock (&vas_thread_id_lock); +spin_unlock_irqrestore (&vas_thread_id_lock, flags); }/*
Signature · 1 line
2.7.4
Michael Ellerman
AppliedQuoted 10 lines · Sukadev Bhattiprolu
From: Sukadev Bhattiprolu <[email protected]>
Date: Tue, 28 Nov 2017 13:39:43 -0600
Subject: [PATCH 1/1]: powerpc: block interrupts when updating TIDR
clear_thread_tidr()is called in interrupt context as a part of delayed put of the task structure (i.e as a part of timer interrupt). To prevent a deadlock, block interrupts when holdingvas_thread_id_lockto set/ clear TIDR for a task.Signed-off-by Sukadev Bhattiprolu <[email protected]>
Applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/384dfd627f1ee67d028e6f14c6e9bf
cheers