aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
Diffstat (limited to 'block')
-rw-r--r--block/cfq-iosched.c58
1 files changed, 16 insertions, 42 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 5e4bae7f4158..86f0f4796fdb 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -182,8 +182,6 @@ struct cfq_rq {
182 182
183 struct cfq_queue *cfq_queue; 183 struct cfq_queue *cfq_queue;
184 struct cfq_io_context *io_context; 184 struct cfq_io_context *io_context;
185
186 unsigned int crq_flags;
187}; 185};
188 186
189enum cfqq_state_flags { 187enum cfqq_state_flags {
@@ -221,27 +219,6 @@ CFQ_CFQQ_FNS(idle_window);
221CFQ_CFQQ_FNS(prio_changed); 219CFQ_CFQQ_FNS(prio_changed);
222#undef CFQ_CFQQ_FNS 220#undef CFQ_CFQQ_FNS
223 221
224enum cfq_rq_state_flags {
225 CFQ_CRQ_FLAG_is_sync = 0,
226};
227
228#define CFQ_CRQ_FNS(name) \
229static inline void cfq_mark_crq_##name(struct cfq_rq *crq) \
230{ \
231 crq->crq_flags |= (1 << CFQ_CRQ_FLAG_##name); \
232} \
233static inline void cfq_clear_crq_##name(struct cfq_rq *crq) \
234{ \
235 crq->crq_flags &= ~(1 << CFQ_CRQ_FLAG_##name); \
236} \
237static inline int cfq_crq_##name(const struct cfq_rq *crq) \
238{ \
239 return (crq->crq_flags & (1 << CFQ_CRQ_FLAG_##name)) != 0; \
240}
241
242CFQ_CRQ_FNS(is_sync);
243#undef CFQ_CRQ_FNS
244
245static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *, unsigned int, unsigned short); 222static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *, unsigned int, unsigned short);
246static void cfq_dispatch_insert(request_queue_t *, struct cfq_rq *); 223static void cfq_dispatch_insert(request_queue_t *, struct cfq_rq *);
247static struct cfq_queue *cfq_get_queue(struct cfq_data *cfqd, unsigned int key, struct task_struct *tsk, gfp_t gfp_mask); 224static struct cfq_queue *cfq_get_queue(struct cfq_data *cfqd, unsigned int key, struct task_struct *tsk, gfp_t gfp_mask);
@@ -290,9 +267,9 @@ cfq_choose_req(struct cfq_data *cfqd, struct cfq_rq *crq1, struct cfq_rq *crq2)
290 if (crq2 == NULL) 267 if (crq2 == NULL)
291 return crq1; 268 return crq1;
292 269
293 if (cfq_crq_is_sync(crq1) && !cfq_crq_is_sync(crq2)) 270 if (rq_is_sync(crq1->request) && !rq_is_sync(crq2->request))
294 return crq1; 271 return crq1;
295 else if (cfq_crq_is_sync(crq2) && !cfq_crq_is_sync(crq1)) 272 else if (rq_is_sync(crq2->request) && !rq_is_sync(crq1->request))
296 return crq2; 273 return crq2;
297 274
298 s1 = crq1->request->sector; 275 s1 = crq1->request->sector;
@@ -477,7 +454,7 @@ static inline void cfq_del_crq_rb(struct cfq_rq *crq)
477{ 454{
478 struct cfq_queue *cfqq = crq->cfq_queue; 455 struct cfq_queue *cfqq = crq->cfq_queue;
479 struct cfq_data *cfqd = cfqq->cfqd; 456 struct cfq_data *cfqd = cfqq->cfqd;
480 const int sync = cfq_crq_is_sync(crq); 457 const int sync = rq_is_sync(crq->request);
481 458
482 BUG_ON(!cfqq->queued[sync]); 459 BUG_ON(!cfqq->queued[sync]);
483 cfqq->queued[sync]--; 460 cfqq->queued[sync]--;
@@ -495,7 +472,7 @@ static void cfq_add_crq_rb(struct cfq_rq *crq)
495 struct request *rq = crq->request; 472 struct request *rq = crq->request;
496 struct request *__alias; 473 struct request *__alias;
497 474
498 cfqq->queued[cfq_crq_is_sync(crq)]++; 475 cfqq->queued[rq_is_sync(rq)]++;
499 476
500 /* 477 /*
501 * looks a little odd, but the first insert might return an alias. 478 * looks a little odd, but the first insert might return an alias.
@@ -508,8 +485,10 @@ static void cfq_add_crq_rb(struct cfq_rq *crq)
508static inline void 485static inline void
509cfq_reposition_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq) 486cfq_reposition_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq)
510{ 487{
511 elv_rb_del(&cfqq->sort_list, crq->request); 488 struct request *rq = crq->request;
512 cfqq->queued[cfq_crq_is_sync(crq)]--; 489
490 elv_rb_del(&cfqq->sort_list, rq);
491 cfqq->queued[rq_is_sync(rq)]--;
513 cfq_add_crq_rb(crq); 492 cfq_add_crq_rb(crq);
514} 493}
515 494
@@ -814,11 +793,11 @@ static void cfq_dispatch_insert(request_queue_t *q, struct cfq_rq *crq)
814{ 793{
815 struct cfq_data *cfqd = q->elevator->elevator_data; 794 struct cfq_data *cfqd = q->elevator->elevator_data;
816 struct cfq_queue *cfqq = crq->cfq_queue; 795 struct cfq_queue *cfqq = crq->cfq_queue;
817 struct request *rq; 796 struct request *rq = crq->request;
818 797
819 cfq_remove_request(crq->request); 798 cfq_remove_request(rq);
820 cfqq->on_dispatch[cfq_crq_is_sync(crq)]++; 799 cfqq->on_dispatch[rq_is_sync(rq)]++;
821 elv_dispatch_sort(q, crq->request); 800 elv_dispatch_sort(q, rq);
822 801
823 rq = list_entry(q->queue_head.prev, struct request, queuelist); 802 rq = list_entry(q->queue_head.prev, struct request, queuelist);
824 cfqd->last_sector = rq->sector + rq->nr_sectors; 803 cfqd->last_sector = rq->sector + rq->nr_sectors;
@@ -1585,7 +1564,7 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
1585 */ 1564 */
1586 if (new_cfqq->slice_left < cfqd->cfq_slice_idle) 1565 if (new_cfqq->slice_left < cfqd->cfq_slice_idle)
1587 return 0; 1566 return 0;
1588 if (cfq_crq_is_sync(crq) && !cfq_cfqq_sync(cfqq)) 1567 if (rq_is_sync(crq->request) && !cfq_cfqq_sync(cfqq))
1589 return 1; 1568 return 1;
1590 1569
1591 return 0; 1570 return 0;
@@ -1634,7 +1613,7 @@ cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
1634 struct cfq_io_context *cic = crq->io_context; 1613 struct cfq_io_context *cic = crq->io_context;
1635 1614
1636 /* 1615 /*
1637 * check if this request is a better next-serve candidate 1616 * check if this request is a better next-serve candidate)) {
1638 */ 1617 */
1639 cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq); 1618 cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
1640 BUG_ON(!cfqq->next_crq); 1619 BUG_ON(!cfqq->next_crq);
@@ -1643,7 +1622,7 @@ cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
1643 * we never wait for an async request and we don't allow preemption 1622 * we never wait for an async request and we don't allow preemption
1644 * of an async request. so just return early 1623 * of an async request. so just return early
1645 */ 1624 */
1646 if (!cfq_crq_is_sync(crq)) { 1625 if (!rq_is_sync(crq->request)) {
1647 /* 1626 /*
1648 * sync process issued an async request, if it's waiting 1627 * sync process issued an async request, if it's waiting
1649 * then expire it and kick rq handling. 1628 * then expire it and kick rq handling.
@@ -1709,7 +1688,7 @@ static void cfq_completed_request(request_queue_t *q, struct request *rq)
1709 struct cfq_rq *crq = RQ_DATA(rq); 1688 struct cfq_rq *crq = RQ_DATA(rq);
1710 struct cfq_queue *cfqq = crq->cfq_queue; 1689 struct cfq_queue *cfqq = crq->cfq_queue;
1711 struct cfq_data *cfqd = cfqq->cfqd; 1690 struct cfq_data *cfqd = cfqq->cfqd;
1712 const int sync = cfq_crq_is_sync(crq); 1691 const int sync = rq_is_sync(rq);
1713 unsigned long now; 1692 unsigned long now;
1714 1693
1715 now = jiffies; 1694 now = jiffies;
@@ -1905,11 +1884,6 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
1905 crq->cfq_queue = cfqq; 1884 crq->cfq_queue = cfqq;
1906 crq->io_context = cic; 1885 crq->io_context = cic;
1907 1886
1908 if (is_sync)
1909 cfq_mark_crq_is_sync(crq);
1910 else
1911 cfq_clear_crq_is_sync(crq);
1912
1913 rq->elevator_private = crq; 1887 rq->elevator_private = crq;
1914 return 0; 1888 return 0;
1915 } 1889 }