Commit 13fdc9a7 authored by Ursula Braun's avatar Ursula Braun Committed by David S. Miller

[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: default avatarUrsula Braun <braunu@de.ibm.com>
Acked-by: default avatarFrank Pavlic <fpavlic@de.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent da7de31c
...@@ -1494,7 +1494,10 @@ static void iucv_tasklet_fn(unsigned long ignored) ...@@ -1494,7 +1494,10 @@ static void iucv_tasklet_fn(unsigned long ignored)
struct iucv_irq_list *p, *n; struct iucv_irq_list *p, *n;
/* Serialize tasklet, iucv_path_sever and iucv_path_connect. */ /* 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(); iucv_active_cpu = smp_processor_id();
spin_lock_irq(&iucv_queue_lock); spin_lock_irq(&iucv_queue_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment