aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/cfq-iosched.c36
-rw-r--r--include/linux/blkdev.h2
2 files changed, 27 insertions, 11 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 42f990f2763..63bfe4b494b 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -1219,11 +1219,20 @@ static void cfq_exit_single_io_context(struct cfq_io_context *cic)
1219 1219
1220 spin_lock(q->queue_lock); 1220 spin_lock(q->queue_lock);
1221 1221
1222 if (unlikely(cic->cfqq == cfqd->active_queue)) 1222 if (cic->cfqq[ASYNC]) {
1223 __cfq_slice_expired(cfqd, cic->cfqq, 0); 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 }
1224 1235
1225 cfq_put_queue(cic->cfqq);
1226 cic->cfqq = NULL;
1227 cic->key = NULL; 1236 cic->key = NULL;
1228 spin_unlock(q->queue_lock); 1237 spin_unlock(q->queue_lock);
1229} 1238}
@@ -1259,7 +1268,8 @@ cfq_alloc_io_context(struct cfq_data *cfqd, gfp_t gfp_mask)
1259 1268
1260 if (cic) { 1269 if (cic) {
1261 INIT_LIST_HEAD(&cic->list); 1270 INIT_LIST_HEAD(&cic->list);
1262 cic->cfqq = NULL; 1271 cic->cfqq[ASYNC] = NULL;
1272 cic->cfqq[SYNC] = NULL;
1263 cic->key = NULL; 1273 cic->key = NULL;
1264 cic->last_end_request = jiffies; 1274 cic->last_end_request = jiffies;
1265 cic->ttime_total = 0; 1275 cic->ttime_total = 0;
@@ -1325,7 +1335,12 @@ static inline void changed_ioprio(struct cfq_io_context *cic)
1325 struct cfq_queue *cfqq; 1335 struct cfq_queue *cfqq;
1326 if (cfqd) { 1336 if (cfqd) {
1327 spin_lock(cfqd->queue->queue_lock); 1337 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];
1329 if (cfqq) { 1344 if (cfqq) {
1330 cfq_mark_cfqq_prio_changed(cfqq); 1345 cfq_mark_cfqq_prio_changed(cfqq);
1331 cfq_init_prio_data(cfqq); 1346 cfq_init_prio_data(cfqq);
@@ -1892,6 +1907,7 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
1892 struct cfq_queue *cfqq; 1907 struct cfq_queue *cfqq;
1893 struct cfq_rq *crq; 1908 struct cfq_rq *crq;
1894 unsigned long flags; 1909 unsigned long flags;
1910 int is_sync = key != CFQ_KEY_ASYNC;
1895 1911
1896 might_sleep_if(gfp_mask & __GFP_WAIT); 1912 might_sleep_if(gfp_mask & __GFP_WAIT);
1897 1913
@@ -1902,14 +1918,14 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
1902 if (!cic) 1918 if (!cic)
1903 goto queue_fail; 1919 goto queue_fail;
1904 1920
1905 if (!cic->cfqq) { 1921 if (!cic->cfqq[is_sync]) {
1906 cfqq = cfq_get_queue(cfqd, key, tsk->ioprio, gfp_mask); 1922 cfqq = cfq_get_queue(cfqd, key, tsk->ioprio, gfp_mask);
1907 if (!cfqq) 1923 if (!cfqq)
1908 goto queue_fail; 1924 goto queue_fail;
1909 1925
1910 cic->cfqq = cfqq; 1926 cic->cfqq[is_sync] = cfqq;
1911 } else 1927 } else
1912 cfqq = cic->cfqq; 1928 cfqq = cic->cfqq[is_sync];
1913 1929
1914 cfqq->allocated[rw]++; 1930 cfqq->allocated[rw]++;
1915 cfq_clear_cfqq_must_alloc(cfqq); 1931 cfq_clear_cfqq_must_alloc(cfqq);
@@ -1926,7 +1942,7 @@ cfq_set_request(request_queue_t *q, struct request *rq, struct bio *bio,
1926 crq->cfq_queue = cfqq; 1942 crq->cfq_queue = cfqq;
1927 crq->io_context = cic; 1943 crq->io_context = cic;
1928 1944
1929 if (rw == READ || process_sync(tsk)) 1945 if (is_sync)
1930 cfq_mark_crq_is_sync(crq); 1946 cfq_mark_crq_is_sync(crq);
1931 else 1947 else
1932 cfq_clear_crq_is_sync(crq); 1948 cfq_clear_crq_is_sync(crq);
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 860e7a485a5..e19cb631084 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -58,7 +58,7 @@ struct cfq_io_context {
58 * circular list of cfq_io_contexts belonging to a process io context 58 * circular list of cfq_io_contexts belonging to a process io context
59 */ 59 */
60 struct list_head list; 60 struct list_head list;
61 struct cfq_queue *cfqq; 61 struct cfq_queue *cfqq[2];
62 void *key; 62 void *key;
63 63
64 struct io_context *ioc; 64 struct io_context *ioc;