The driver may sleep under a spin lock, and the function call path is: cfs_wi_exit (acquire the lock by spin_lock) LASSERT lbug_with_loc libcfs_debug_dumplog schedule and kthread_run --> may sleep
To fix it, all "LASSERT" is placed out of the spin_lock and spin_unlock. Signed-off-by: Jia-Ju Bai <baijiaju1...@163.com> --- drivers/staging/lustre/lnet/libcfs/workitem.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/lustre/lnet/libcfs/workitem.c b/drivers/staging/lustre/lnet/libcfs/workitem.c index dbc2a9b..cef25c8 100644 --- a/drivers/staging/lustre/lnet/libcfs/workitem.c +++ b/drivers/staging/lustre/lnet/libcfs/workitem.c @@ -111,20 +111,20 @@ struct cfs_wi_sched { { LASSERT(!in_interrupt()); /* because we use plain spinlock */ LASSERT(!sched->ws_stopping); + LASSERT(wi->wi_running); + if (wi->wi_scheduled) { + LASSERT(!list_empty(&wi->wi_list)); + LASSERT(sched->ws_nscheduled > 0); + } + LASSERT(list_empty(&wi->wi_list)); spin_lock(&sched->ws_lock); - LASSERT(wi->wi_running); if (wi->wi_scheduled) { /* cancel pending schedules */ - LASSERT(!list_empty(&wi->wi_list)); list_del_init(&wi->wi_list); - - LASSERT(sched->ws_nscheduled > 0); sched->ws_nscheduled--; } - LASSERT(list_empty(&wi->wi_list)); - wi->wi_scheduled = 1; /* LBUG future schedule attempts */ spin_unlock(&sched->ws_lock); } -- 1.7.9.5