Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] RPC: Shrink struct rpc_task by switching to wait_on_bit()

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

+18 -14
-1
include/linux/sunrpc/sched.h
··· 31 31 struct rpc_wait { 32 32 struct list_head list; /* wait queue links */ 33 33 struct list_head links; /* Links to related tasks */ 34 - wait_queue_head_t waitq; /* sync: sleep on this q */ 35 34 struct rpc_wait_queue * rpc_waitq; /* RPC wait queue we're on */ 36 35 }; 37 36
+18 -13
net/sunrpc/sched.c
··· 290 290 return; 291 291 } 292 292 } else 293 - wake_up(&task->u.tk_wait.waitq); 293 + wake_up_bit(&task->tk_runstate, RPC_TASK_QUEUED); 294 294 } 295 295 296 296 /* ··· 578 578 return 1; 579 579 } 580 580 581 + static int rpc_wait_bit_interruptible(void *word) 582 + { 583 + if (signal_pending(current)) 584 + return -ERESTARTSYS; 585 + schedule(); 586 + return 0; 587 + } 588 + 581 589 /* 582 590 * This is the RPC `scheduler' (or rather, the finite state machine). 583 591 */ ··· 656 648 657 649 /* sync task: sleep here */ 658 650 dprintk("RPC: %4d sync task going to sleep\n", task->tk_pid); 659 - if (RPC_TASK_UNINTERRUPTIBLE(task)) { 660 - __wait_event(task->u.tk_wait.waitq, !RPC_IS_QUEUED(task)); 661 - } else { 662 - __wait_event_interruptible(task->u.tk_wait.waitq, !RPC_IS_QUEUED(task), status); 651 + /* Note: Caller should be using rpc_clnt_sigmask() */ 652 + status = out_of_line_wait_on_bit(&task->tk_runstate, 653 + RPC_TASK_QUEUED, rpc_wait_bit_interruptible, 654 + TASK_INTERRUPTIBLE); 655 + if (status == -ERESTARTSYS) { 663 656 /* 664 657 * When a sync task receives a signal, it exits with 665 658 * -ERESTARTSYS. In order to catch any callbacks that 666 659 * clean up after sleeping on some queue, we don't 667 660 * break the loop here, but go around once more. 668 661 */ 669 - if (status == -ERESTARTSYS) { 670 - dprintk("RPC: %4d got signal\n", task->tk_pid); 671 - task->tk_flags |= RPC_TASK_KILLED; 672 - rpc_exit(task, -ERESTARTSYS); 673 - rpc_wake_up_task(task); 674 - } 662 + dprintk("RPC: %4d got signal\n", task->tk_pid); 663 + task->tk_flags |= RPC_TASK_KILLED; 664 + rpc_exit(task, -ERESTARTSYS); 665 + rpc_wake_up_task(task); 675 666 } 676 667 rpc_set_running(task); 677 668 dprintk("RPC: %4d sync task resuming\n", task->tk_pid); ··· 773 766 774 767 /* Initialize workqueue for async tasks */ 775 768 task->tk_workqueue = rpciod_workqueue; 776 - if (!RPC_IS_ASYNC(task)) 777 - init_waitqueue_head(&task->u.tk_wait.waitq); 778 769 779 770 if (clnt) { 780 771 atomic_inc(&clnt->cl_users);