sched.c (1e1093c7fd4951bb4272212c238d09cd7a22f5fc) | sched.c (c05eecf636101dd4347b2d8fa457626bf0088e0a) |
---|---|
1/* 2 * linux/net/sunrpc/sched.c 3 * 4 * Scheduling for synchronous and asynchronous RPC requests. 5 * 6 * Copyright (C) 1996 Olaf Kirch, <okir@monad.swb.de> 7 * 8 * TCP NFS related read + write fixes --- 84 unchanged lines hidden (view full) --- 93 task->tk_pid, task->tk_timeout * 1000 / HZ); 94 95 task->u.tk_wait.expires = jiffies + task->tk_timeout; 96 if (list_empty(&queue->timer_list.list) || time_before(task->u.tk_wait.expires, queue->timer_list.expires)) 97 rpc_set_queue_timer(queue, task->u.tk_wait.expires); 98 list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list); 99} 100 | 1/* 2 * linux/net/sunrpc/sched.c 3 * 4 * Scheduling for synchronous and asynchronous RPC requests. 5 * 6 * Copyright (C) 1996 Olaf Kirch, <okir@monad.swb.de> 7 * 8 * TCP NFS related read + write fixes --- 84 unchanged lines hidden (view full) --- 93 task->tk_pid, task->tk_timeout * 1000 / HZ); 94 95 task->u.tk_wait.expires = jiffies + task->tk_timeout; 96 if (list_empty(&queue->timer_list.list) || time_before(task->u.tk_wait.expires, queue->timer_list.expires)) 97 rpc_set_queue_timer(queue, task->u.tk_wait.expires); 98 list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list); 99} 100 |
101static void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority) 102{ 103 queue->priority = priority; 104} 105 106static void rpc_set_waitqueue_owner(struct rpc_wait_queue *queue, pid_t pid) 107{ 108 queue->owner = pid; 109 queue->nr = RPC_BATCH_COUNT; 110} 111 112static void rpc_reset_waitqueue_priority(struct rpc_wait_queue *queue) 113{ 114 rpc_set_waitqueue_priority(queue, queue->maxpriority); 115 rpc_set_waitqueue_owner(queue, 0); 116} 117 |
|
101/* 102 * Add new request to a priority queue. 103 */ 104static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue, 105 struct rpc_task *task, 106 unsigned char queue_priority) 107{ 108 struct list_head *q; 109 struct rpc_task *t; 110 111 INIT_LIST_HEAD(&task->u.tk_wait.links); | 118/* 119 * Add new request to a priority queue. 120 */ 121static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue, 122 struct rpc_task *task, 123 unsigned char queue_priority) 124{ 125 struct list_head *q; 126 struct rpc_task *t; 127 128 INIT_LIST_HEAD(&task->u.tk_wait.links); |
112 q = &queue->tasks[queue_priority]; | |
113 if (unlikely(queue_priority > queue->maxpriority)) | 129 if (unlikely(queue_priority > queue->maxpriority)) |
114 q = &queue->tasks[queue->maxpriority]; | 130 queue_priority = queue->maxpriority; 131 if (queue_priority > queue->priority) 132 rpc_set_waitqueue_priority(queue, queue_priority); 133 q = &queue->tasks[queue_priority]; |
115 list_for_each_entry(t, q, u.tk_wait.list) { 116 if (t->tk_owner == task->tk_owner) { 117 list_add_tail(&task->u.tk_wait.list, &t->u.tk_wait.links); 118 return; 119 } 120 } 121 list_add_tail(&task->u.tk_wait.list, q); 122} --- 52 unchanged lines hidden (view full) --- 175 if (RPC_IS_PRIORITY(queue)) 176 __rpc_remove_wait_queue_priority(task); 177 list_del(&task->u.tk_wait.list); 178 queue->qlen--; 179 dprintk("RPC: %5u removed from queue %p \"%s\"\n", 180 task->tk_pid, queue, rpc_qname(queue)); 181} 182 | 134 list_for_each_entry(t, q, u.tk_wait.list) { 135 if (t->tk_owner == task->tk_owner) { 136 list_add_tail(&task->u.tk_wait.list, &t->u.tk_wait.links); 137 return; 138 } 139 } 140 list_add_tail(&task->u.tk_wait.list, q); 141} --- 52 unchanged lines hidden (view full) --- 194 if (RPC_IS_PRIORITY(queue)) 195 __rpc_remove_wait_queue_priority(task); 196 list_del(&task->u.tk_wait.list); 197 queue->qlen--; 198 dprintk("RPC: %5u removed from queue %p \"%s\"\n", 199 task->tk_pid, queue, rpc_qname(queue)); 200} 201 |
183static inline void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority) 184{ 185 queue->priority = priority; 186 queue->count = 1 << (priority * 2); 187} 188 189static inline void rpc_set_waitqueue_owner(struct rpc_wait_queue *queue, pid_t pid) 190{ 191 queue->owner = pid; 192 queue->nr = RPC_BATCH_COUNT; 193} 194 195static inline void rpc_reset_waitqueue_priority(struct rpc_wait_queue *queue) 196{ 197 rpc_set_waitqueue_priority(queue, queue->maxpriority); 198 rpc_set_waitqueue_owner(queue, 0); 199} 200 | |
201static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname, unsigned char nr_queues) 202{ 203 int i; 204 205 spin_lock_init(&queue->lock); 206 for (i = 0; i < ARRAY_SIZE(queue->tasks); i++) 207 INIT_LIST_HEAD(&queue->tasks[i]); 208 queue->maxpriority = nr_queues - 1; --- 250 unchanged lines hidden (view full) --- 459 if (queue->owner == task->tk_owner) { 460 if (--queue->nr) 461 goto out; 462 list_move_tail(&task->u.tk_wait.list, q); 463 } 464 /* 465 * Check if we need to switch queues. 466 */ | 202static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname, unsigned char nr_queues) 203{ 204 int i; 205 206 spin_lock_init(&queue->lock); 207 for (i = 0; i < ARRAY_SIZE(queue->tasks); i++) 208 INIT_LIST_HEAD(&queue->tasks[i]); 209 queue->maxpriority = nr_queues - 1; --- 250 unchanged lines hidden (view full) --- 460 if (queue->owner == task->tk_owner) { 461 if (--queue->nr) 462 goto out; 463 list_move_tail(&task->u.tk_wait.list, q); 464 } 465 /* 466 * Check if we need to switch queues. 467 */ |
467 if (--queue->count) 468 goto new_owner; | 468 goto new_owner; |
469 } 470 471 /* 472 * Service the next queue. 473 */ 474 do { 475 if (q == &queue->tasks[0]) 476 q = &queue->tasks[queue->maxpriority]; --- 632 unchanged lines hidden --- | 469 } 470 471 /* 472 * Service the next queue. 473 */ 474 do { 475 if (q == &queue->tasks[0]) 476 q = &queue->tasks[queue->maxpriority]; --- 632 unchanged lines hidden --- |