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 ---