···3131struct rpc_wait {3232 struct list_head list; /* wait queue links */3333 struct list_head links; /* Links to related tasks */3434- wait_queue_head_t waitq; /* sync: sleep on this q */3534 struct rpc_wait_queue * rpc_waitq; /* RPC wait queue we're on */3635};3736
+18-13
net/sunrpc/sched.c
···290290 return;291291 }292292 } else293293- wake_up(&task->u.tk_wait.waitq);293293+ wake_up_bit(&task->tk_runstate, RPC_TASK_QUEUED);294294}295295296296/*···578578 return 1;579579}580580581581+static int rpc_wait_bit_interruptible(void *word)582582+{583583+ if (signal_pending(current))584584+ return -ERESTARTSYS;585585+ schedule();586586+ return 0;587587+}588588+581589/*582590 * This is the RPC `scheduler' (or rather, the finite state machine).583591 */···656648657649 /* sync task: sleep here */658650 dprintk("RPC: %4d sync task going to sleep\n", task->tk_pid);659659- if (RPC_TASK_UNINTERRUPTIBLE(task)) {660660- __wait_event(task->u.tk_wait.waitq, !RPC_IS_QUEUED(task));661661- } else {662662- __wait_event_interruptible(task->u.tk_wait.waitq, !RPC_IS_QUEUED(task), status);651651+ /* Note: Caller should be using rpc_clnt_sigmask() */652652+ status = out_of_line_wait_on_bit(&task->tk_runstate,653653+ RPC_TASK_QUEUED, rpc_wait_bit_interruptible,654654+ TASK_INTERRUPTIBLE);655655+ if (status == -ERESTARTSYS) {663656 /*664657 * When a sync task receives a signal, it exits with665658 * -ERESTARTSYS. In order to catch any callbacks that666659 * clean up after sleeping on some queue, we don't667660 * break the loop here, but go around once more.668661 */669669- if (status == -ERESTARTSYS) {670670- dprintk("RPC: %4d got signal\n", task->tk_pid);671671- task->tk_flags |= RPC_TASK_KILLED;672672- rpc_exit(task, -ERESTARTSYS);673673- rpc_wake_up_task(task);674674- }662662+ dprintk("RPC: %4d got signal\n", task->tk_pid);663663+ task->tk_flags |= RPC_TASK_KILLED;664664+ rpc_exit(task, -ERESTARTSYS);665665+ rpc_wake_up_task(task);675666 }676667 rpc_set_running(task);677668 dprintk("RPC: %4d sync task resuming\n", task->tk_pid);···773766774767 /* Initialize workqueue for async tasks */775768 task->tk_workqueue = rpciod_workqueue;776776- if (!RPC_IS_ASYNC(task))777777- init_waitqueue_head(&task->u.tk_wait.waitq);778769779770 if (clnt) {780771 atomic_inc(&clnt->cl_users);