mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
[AF_IUCV]: Avoid deadlock between iucv_path_connect and tasklet.
An iucv deadlock may occur, where one CPU is spinning on the iucv_table_lock for iucv_tasklet_fn(), while another CPU is holding the iucv_table_lock for an iucv_path_connect() and is waiting for the first CPU in an smp_call_function. Solution: replace spin_lock in iucv_tasklet_fn by spin_trylock and reschedule tasklet in case of non-granted lock. Signed-off-by: Ursula Braun <braunu@de.ibm.com> Acked-by: Frank Pavlic <fpavlic@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
da7de31cc5
commit
13fdc9a74d
@ -1494,7 +1494,10 @@ static void iucv_tasklet_fn(unsigned long ignored)
|
||||
struct iucv_irq_list *p, *n;
|
||||
|
||||
/* Serialize tasklet, iucv_path_sever and iucv_path_connect. */
|
||||
spin_lock(&iucv_table_lock);
|
||||
if (!spin_trylock(&iucv_table_lock)) {
|
||||
tasklet_schedule(&iucv_tasklet);
|
||||
return;
|
||||
}
|
||||
iucv_active_cpu = smp_processor_id();
|
||||
|
||||
spin_lock_irq(&iucv_queue_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user