History

[PATCH] keep sync and async cfq_queue separate

Al Viro committed 20 years ago

Commit 12a05731 parent 478a82b2 files · +27 −11Browse files

Unified · Split

2 files
  1. block/cfq-iosched.c +26 −10
  2. include/linux/blkdev.h +1 −1
block/cfq-iosched.c+26−10
@@ -1219,11 +1219,20 @@ static void cfq_exit_single_io_context(struct cfq_io_context *cic) · 1218 unmodified lines
12191219
12201220 spin_lock(q->queue_lock);
12211221
1222− if (unlikely(cic->cfqq == cfqd->active_queue))
1223− __cfq_slice_expired(cfqd, cic->cfqq, 0);
1222+ if (cic->cfqq[ASYNC]) {
1223+ if (unlikely(cic->cfqq[ASYNC] == cfqd->active_queue))
1224+ __cfq_slice_expired(cfqd, cic->cfqq[ASYNC], 0);
1225+ cfq_put_queue(cic->cfqq[ASYNC]);
1226+ cic->cfqq[ASYNC] = NULL;
1227+ }
1228+
1229+ if (cic->cfqq[SYNC]) {
1230+ if (unlikely(cic->cfqq[SYNC] == cfqd->active_queue))
1231+ __cfq_slice_expired(cfqd, cic->cfqq[SYNC], 0);
1232+ cfq_put_queue(cic->cfqq[SYNC]);
1233+ cic->cfqq[SYNC] = NULL;
1234+ }
12241235
1225− cfq_put_queue(cic->cfqq);
1226− cic->cfqq = NULL;
12271236 cic->key = NULL;
12281237 spin_unlock(q->queue_lock);
12291238 }
@@ -1259,7 +1268,8 @@ cfq_alloc_io_context(struct cfq_data *cfqd, gfp_t gfp_mask) · 29 unmodified lines
12591268
12601269 if (cic) {
12611270 INIT_LIST_HEAD(&cic->list);
1262− cic->cfqq = NULL;
1271+ cic->cfqq[ASYNC] = NULL;
1272+ cic->cfqq[SYNC] = NULL;
12631273 cic->key = NULL;
12641274 cic->last_end_request = jiffies;
12651275 cic->ttime_total = 0;
@@ -1325,7 +1335,12 @@ static inline void changed_ioprio(struct cfq_io_context *cic) · 59 unmodified lines
13251335 struct cfq_queue *cfqq;
13261336 if (cfqd) {
13271337 spin_lock(cfqd->queue->queue_lock);
1328− cfqq = cic->cfqq;
1338+ cfqq = cic->cfqq[ASYNC];
1339+ if (cfqq) {
1340+ cfq_mark_cfqq_prio_changed(cfqq);
1341+ cfq_init_prio_data(cfqq);
1342+ }
1343+ cfqq = cic->cfqq[SYNC];
13291344 if (cfqq) {
13301345 cfq_mark_cfqq_prio_changed(cfqq);
13311346 cfq_init_prio_data(cfqq);
@@ -1892,6 +1907,7 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio, · 560 unmodified lines
18921907 struct cfq_queue *cfqq;
18931908 struct cfq_rq *crq;
18941909 unsigned long flags;
1910+ int is_sync = key != CFQ_KEY_ASYNC;
18951911
18961912 might_sleep_if(gfp_mask & __GFP_WAIT);
18971913
@@ -1902,14 +1918,14 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio, · 4 unmodified lines
19021918 if (!cic)
19031919 goto queue_fail;
19041920
1905− if (!cic->cfqq) {
1921+ if (!cic->cfqq[is_sync]) {
19061922 cfqq = cfq_get_queue(cfqd, key, tsk->ioprio, gfp_mask);
19071923 if (!cfqq)
19081924 goto queue_fail;
19091925
1910− cic->cfqq = cfqq;
1926+ cic->cfqq[is_sync] = cfqq;
19111927 } else
1912− cfqq = cic->cfqq;
1928+ cfqq = cic->cfqq[is_sync];
19131929
19141930 cfqq->allocated[rw]++;
19151931 cfq_clear_cfqq_must_alloc(cfqq);
@@ -1926,7 +1942,7 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio, · 10 unmodified lines
19261942 crq->cfq_queue = cfqq;
19271943 crq->io_context = cic;
19281944
1929− if (rw == READ || process_sync(tsk))
1945+ if (is_sync)
19301946 cfq_mark_crq_is_sync(crq);
19311947 else
19321948 cfq_clear_crq_is_sync(crq);
include/linux/blkdev.h+1−1
@@ -58,7 +58,7 @@ struct cfq_io_context { · 57 unmodified lines
5858 * circular list of cfq_io_contexts belonging to a process io context
5959 */
6060 struct list_head list;
61− struct cfq_queue *cfqq;
61+ struct cfq_queue *cfqq[2];
6262 void *key;
6363
6464 struct io_context *ioc;