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

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
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -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;

		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 = {
+29 −0
Original line number Diff line number Diff line
@@ -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 */