Commit 013a7f95 authored by Jens Axboe's avatar Jens Axboe

block: provide helpers for rq_list manipulation

Instead of open-coding the list additions, traversal, and removal,
provide a basic set of helpers.
Suggested-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent afd7de03
...@@ -404,17 +404,11 @@ __blk_mq_alloc_requests_batch(struct blk_mq_alloc_data *data, ...@@ -404,17 +404,11 @@ __blk_mq_alloc_requests_batch(struct blk_mq_alloc_data *data,
tag = tag_offset + i; tag = tag_offset + i;
tags &= ~(1UL << i); tags &= ~(1UL << i);
rq = blk_mq_rq_ctx_init(data, tag, alloc_time_ns); rq = blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
rq->rq_next = *data->cached_rq; rq_list_add(data->cached_rq, rq);
*data->cached_rq = rq;
} }
data->nr_tags -= nr; data->nr_tags -= nr;
if (!data->cached_rq) return rq_list_pop(data->cached_rq);
return NULL;
rq = *data->cached_rq;
*data->cached_rq = rq->rq_next;
return rq;
} }
static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data) static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data)
...@@ -622,11 +616,9 @@ EXPORT_SYMBOL_GPL(blk_mq_free_request); ...@@ -622,11 +616,9 @@ EXPORT_SYMBOL_GPL(blk_mq_free_request);
void blk_mq_free_plug_rqs(struct blk_plug *plug) void blk_mq_free_plug_rqs(struct blk_plug *plug)
{ {
while (plug->cached_rq) {
struct request *rq; struct request *rq;
rq = plug->cached_rq; while ((rq = rq_list_pop(&plug->cached_rq)) != NULL) {
plug->cached_rq = rq->rq_next;
percpu_ref_get(&rq->q->q_usage_counter); percpu_ref_get(&rq->q->q_usage_counter);
blk_mq_free_request(rq); blk_mq_free_request(rq);
} }
...@@ -2418,8 +2410,7 @@ void blk_mq_submit_bio(struct bio *bio) ...@@ -2418,8 +2410,7 @@ void blk_mq_submit_bio(struct bio *bio)
plug = blk_mq_plug(q, bio); plug = blk_mq_plug(q, bio);
if (plug && plug->cached_rq) { if (plug && plug->cached_rq) {
rq = plug->cached_rq; rq = rq_list_pop(&plug->cached_rq);
plug->cached_rq = rq->rq_next;
INIT_LIST_HEAD(&rq->queuelist); INIT_LIST_HEAD(&rq->queuelist);
} else { } else {
struct blk_mq_alloc_data data = { struct blk_mq_alloc_data data = {
......
...@@ -1298,4 +1298,33 @@ int fsync_bdev(struct block_device *bdev); ...@@ -1298,4 +1298,33 @@ int fsync_bdev(struct block_device *bdev);
int freeze_bdev(struct block_device *bdev); int freeze_bdev(struct block_device *bdev);
int thaw_bdev(struct block_device *bdev); int thaw_bdev(struct block_device *bdev);
#define rq_list_add(listptr, rq) do { \
(rq)->rq_next = *(listptr); \
*(listptr) = rq; \
} while (0)
#define rq_list_pop(listptr) \
({ \
struct request *__req = NULL; \
if ((listptr) && *(listptr)) { \
__req = *(listptr); \
*(listptr) = __req->rq_next; \
} \
__req; \
})
#define rq_list_peek(listptr) \
({ \
struct request *__req = NULL; \
if ((listptr) && *(listptr)) \
__req = *(listptr); \
__req; \
})
#define rq_list_for_each(listptr, pos) \
for (pos = rq_list_peek((listptr)); pos; pos = rq_list_next(pos)) \
#define rq_list_next(rq) (rq)->rq_next
#define rq_list_empty(list) ((list) == (struct request *) NULL)
#endif /* _LINUX_BLKDEV_H */ #endif /* _LINUX_BLKDEV_H */
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