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: Christoph Hellwig <hch@infradead.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
afd7de03c5
commit
013a7f9543
@ -404,17 +404,11 @@ __blk_mq_alloc_requests_batch(struct blk_mq_alloc_data *data,
|
||||
tag = tag_offset + i;
|
||||
tags &= ~(1UL << i);
|
||||
rq = blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
|
||||
rq->rq_next = *data->cached_rq;
|
||||
*data->cached_rq = rq;
|
||||
rq_list_add(data->cached_rq, rq);
|
||||
}
|
||||
data->nr_tags -= nr;
|
||||
|
||||
if (!data->cached_rq)
|
||||
return NULL;
|
||||
|
||||
rq = *data->cached_rq;
|
||||
*data->cached_rq = rq->rq_next;
|
||||
return rq;
|
||||
return rq_list_pop(data->cached_rq);
|
||||
}
|
||||
|
||||
static struct request *__blk_mq_alloc_requests(struct blk_mq_alloc_data *data)
|
||||
@ -622,11 +616,9 @@ EXPORT_SYMBOL_GPL(blk_mq_free_request);
|
||||
|
||||
void blk_mq_free_plug_rqs(struct blk_plug *plug)
|
||||
{
|
||||
while (plug->cached_rq) {
|
||||
struct request *rq;
|
||||
struct request *rq;
|
||||
|
||||
rq = plug->cached_rq;
|
||||
plug->cached_rq = rq->rq_next;
|
||||
while ((rq = rq_list_pop(&plug->cached_rq)) != NULL) {
|
||||
percpu_ref_get(&rq->q->q_usage_counter);
|
||||
blk_mq_free_request(rq);
|
||||
}
|
||||
@ -2418,8 +2410,7 @@ void blk_mq_submit_bio(struct bio *bio)
|
||||
|
||||
plug = blk_mq_plug(q, bio);
|
||||
if (plug && plug->cached_rq) {
|
||||
rq = plug->cached_rq;
|
||||
plug->cached_rq = rq->rq_next;
|
||||
rq = rq_list_pop(&plug->cached_rq);
|
||||
INIT_LIST_HEAD(&rq->queuelist);
|
||||
} else {
|
||||
struct blk_mq_alloc_data data = {
|
||||
|
@ -1298,4 +1298,33 @@ int fsync_bdev(struct block_device *bdev);
|
||||
int freeze_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 */
|
||||
|
Loading…
Reference in New Issue
Block a user