Messages in this thread | | | Subject | Re: Deadlock in net/sunrpc/sched.c | From | Trond Myklebust <> | Date | Thu, 02 Mar 2006 09:58:02 -0800 |
| |
On Thu, 2006-03-02 at 18:51 +0100, Frederik Deweerdt wrote: > (Added Trond Myklebust to the cc list, as he's working on sunrpc) > > + if (RPC_IS_QUEUED(task)) { > > + struct rpc_wait_queue *queue = task->u.tk_wait.rpc_waitq; > > + spin_lock_bh(&queue->lock); > > + if (rpc_start_wakeup(task)) { > We may end up list_del'ing a task that is not queued > anymore: we may be interrupted just after the RPC_IS_QUEUED test. > Don't you think this patch could be enough? > > --- linux-2.6.16-rc5/net/sunrpc/sched.c 2006-03-01 11:26:15.000000000 +0100 > +++ linux-2.6.16-rc5-2/net/sunrpc/sched.c 2006-03-02 15:43:18.000000000 +0100 > @@ -521,8 +521,7 @@ > spin_lock_bh(&queue->lock); > head = &queue->tasks[queue->maxpriority]; > for (;;) { > - while (!list_empty(head)) { > - task = list_entry(head->next, struct rpc_task, u.tk_wait.list); > + list_for_each_entry(task, head, u.tk_wait.list) { > __rpc_wake_up_task(task); > } > if (head == &queue->tasks[0])
You need a list_for_each_entry_safe() here, since __rpc_wake_up_task() will cause the task to be removed from the list. See the patch I sent out 1/2 hour ago.
Cheers Trond - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |