block: provide helpers for rq_list manipulation
authorJens Axboe <axboe@kernel.dk>
Wed, 13 Oct 2021 13:58:52 +0000 (07:58 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 18 Oct 2021 20:40:39 +0000 (14:40 -0600)
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>
block/blk-mq.c
include/linux/blkdev.h

index bd241fd..74505b5 100644 (file)
@@ -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 = {
index d5b21fc..b0a3221 100644 (file)
@@ -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 */