Skip to content

Commit dc72ef4

Browse files
Jens AxboeJens Axboe
authored andcommitted
[PATCH] Add blk_start_queueing() helper
CFQ implements this on its own now, but it's really block layer knowledge. Tells a device queue to start dispatching requests to the driver, taking care to unplug if needed. Also fixes the issue where as/cfq will invoke a stopped queue, which we really don't want. Signed-off-by: Jens Axboe <axboe@suse.de>
1 parent 981a797 commit dc72ef4

File tree

4 files changed

+26
-25
lines changed

4 files changed

+26
-25
lines changed

block/as-iosched.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,8 +1280,7 @@ static void as_work_handler(void *data)
12801280
unsigned long flags;
12811281

12821282
spin_lock_irqsave(q->queue_lock, flags);
1283-
if (!as_queue_empty(q))
1284-
q->request_fn(q);
1283+
blk_start_queueing(q);
12851284
spin_unlock_irqrestore(q->queue_lock, flags);
12861285
}
12871286

block/cfq-iosched.c

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,19 +1552,6 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
15521552
__cfq_set_active_queue(cfqd, cfqq);
15531553
}
15541554

1555-
/*
1556-
* should really be a ll_rw_blk.c helper
1557-
*/
1558-
static void cfq_start_queueing(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1559-
{
1560-
request_queue_t *q = cfqd->queue;
1561-
1562-
if (!blk_queue_plugged(q))
1563-
q->request_fn(q);
1564-
else
1565-
__generic_unplug_device(q);
1566-
}
1567-
15681555
/*
15691556
* Called when a new fs request (rq) is added (to cfqq). Check if there's
15701557
* something we should do about it
@@ -1593,7 +1580,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
15931580
if (cic == cfqd->active_cic &&
15941581
del_timer(&cfqd->idle_slice_timer)) {
15951582
cfq_slice_expired(cfqd, 0);
1596-
cfq_start_queueing(cfqd, cfqq);
1583+
blk_start_queueing(cfqd->queue);
15971584
}
15981585
return;
15991586
}
@@ -1614,7 +1601,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
16141601
if (cfq_cfqq_wait_request(cfqq)) {
16151602
cfq_mark_cfqq_must_dispatch(cfqq);
16161603
del_timer(&cfqd->idle_slice_timer);
1617-
cfq_start_queueing(cfqd, cfqq);
1604+
blk_start_queueing(cfqd->queue);
16181605
}
16191606
} else if (cfq_should_preempt(cfqd, cfqq, rq)) {
16201607
/*
@@ -1624,7 +1611,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
16241611
*/
16251612
cfq_preempt_queue(cfqd, cfqq);
16261613
cfq_mark_cfqq_must_dispatch(cfqq);
1627-
cfq_start_queueing(cfqd, cfqq);
1614+
blk_start_queueing(cfqd->queue);
16281615
}
16291616
}
16301617

@@ -1832,8 +1819,7 @@ static void cfq_kick_queue(void *data)
18321819
unsigned long flags;
18331820

18341821
spin_lock_irqsave(q->queue_lock, flags);
1835-
blk_remove_plug(q);
1836-
q->request_fn(q);
1822+
blk_start_queueing(q);
18371823
spin_unlock_irqrestore(q->queue_lock, flags);
18381824
}
18391825

block/ll_rw_blk.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,6 +2266,25 @@ struct request *blk_get_request(request_queue_t *q, int rw, gfp_t gfp_mask)
22662266
}
22672267
EXPORT_SYMBOL(blk_get_request);
22682268

2269+
/**
2270+
* blk_start_queueing - initiate dispatch of requests to device
2271+
* @q: request queue to kick into gear
2272+
*
2273+
* This is basically a helper to remove the need to know whether a queue
2274+
* is plugged or not if someone just wants to initiate dispatch of requests
2275+
* for this queue.
2276+
*
2277+
* The queue lock must be held with interrupts disabled.
2278+
*/
2279+
void blk_start_queueing(request_queue_t *q)
2280+
{
2281+
if (!blk_queue_plugged(q))
2282+
q->request_fn(q);
2283+
else
2284+
__generic_unplug_device(q);
2285+
}
2286+
EXPORT_SYMBOL(blk_start_queueing);
2287+
22692288
/**
22702289
* blk_requeue_request - put a request back on queue
22712290
* @q: request queue where request should be inserted
@@ -2333,11 +2352,7 @@ void blk_insert_request(request_queue_t *q, struct request *rq,
23332352

23342353
drive_stat_acct(rq, rq->nr_sectors, 1);
23352354
__elv_add_request(q, rq, where, 0);
2336-
2337-
if (blk_queue_plugged(q))
2338-
__generic_unplug_device(q);
2339-
else
2340-
q->request_fn(q);
2355+
blk_start_queueing(q);
23412356
spin_unlock_irqrestore(q->queue_lock, flags);
23422357
}
23432358

include/linux/blkdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ extern void blk_stop_queue(request_queue_t *q);
635635
extern void blk_sync_queue(struct request_queue *q);
636636
extern void __blk_stop_queue(request_queue_t *q);
637637
extern void blk_run_queue(request_queue_t *);
638+
extern void blk_start_queueing(request_queue_t *);
638639
extern void blk_queue_activity_fn(request_queue_t *, activity_fn *, void *);
639640
extern int blk_rq_map_user(request_queue_t *, struct request *, void __user *, unsigned int);
640641
extern int blk_rq_unmap_user(struct bio *, unsigned int);

0 commit comments

Comments
 (0)