From: Ursula Braun Date: Sun, 15 Jul 2007 02:03:41 +0000 (-0700) Subject: [AF_IUCV]: Avoid deadlock between iucv_path_connect and tasklet. X-Git-Tag: v2.6.23-rc1~1054^2~21 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=13fdc9a74df0fec70f421c6891e184ed8c3b9088;p=~shefty%2Frdma-dev.git [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 Acked-by: Frank Pavlic Signed-off-by: David S. Miller --- diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index b7333061016..ad5150b8dfa 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c @@ -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);