Commit 48813c1e authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] blk: move threshold unplugging

The 'unplug on queued exceeding unplug threshold' logic only works for file
system requests currently, since it's in __make_request().  Move it where
it belongs, in elv_add_request().  This way it works for queued block sg
requests as well.
Signed-Off-By: default avatarJens Axboe <axboe@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2c257a5a
......@@ -181,6 +181,14 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
rq->q = q;
q->elevator.elevator_add_req_fn(q, rq, where);
if (blk_queue_plugged(q)) {
int nrq = q->rq.count[READ] + q->rq.count[WRITE] - q->in_flight;
if (nrq == q->unplug_thresh)
__generic_unplug_device(q);
}
}
void elv_add_request(request_queue_t *q, struct request *rq, int where,
......
......@@ -1123,7 +1123,7 @@ EXPORT_SYMBOL(blk_remove_plug);
/*
* remove the plug and let it rip..
*/
static inline void __generic_unplug_device(request_queue_t *q)
inline void __generic_unplug_device(request_queue_t *q)
{
if (test_bit(QUEUE_FLAG_STOPPED, &q->queue_flags))
return;
......@@ -1137,6 +1137,7 @@ static inline void __generic_unplug_device(request_queue_t *q)
if (elv_next_request(q))
q->request_fn(q);
}
EXPORT_SYMBOL(__generic_unplug_device);
/**
* generic_unplug_device - fire a request queue
......@@ -2280,13 +2281,9 @@ static int __make_request(request_queue_t *q, struct bio *bio)
out:
if (freereq)
__blk_put_request(q, freereq);
if (bio_sync(bio))
__generic_unplug_device(q);
if (blk_queue_plugged(q)) {
int nrq = q->rq.count[READ] + q->rq.count[WRITE] - q->in_flight;
if (nrq == q->unplug_thresh || bio_sync(bio))
__generic_unplug_device(q);
}
spin_unlock_irq(q->queue_lock);
return 0;
......
......@@ -592,6 +592,7 @@ extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bd
extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *);
extern void blk_dump_rq_flags(struct request *, char *);
extern void generic_unplug_device(request_queue_t *);
extern inline void __generic_unplug_device(request_queue_t *);
extern long nr_blockdev_pages(void);
int blk_get_queue(request_queue_t *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment