All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: Jeffle Xu <jefflexu@linux.alibaba.com>,
	Ming Lei <ming.lei@redhat.com>,
	Damien Le Moal <Damien.LeMoal@wdc.com>,
	linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH 10/12] block: RCU free polled bios
Date: Mon, 26 Apr 2021 15:48:19 +0200	[thread overview]
Message-ID: <20210426134821.2191160-11-hch@lst.de> (raw)
In-Reply-To: <20210426134821.2191160-1-hch@lst.de>

Free the actual memory used for the bio using RCU for polled bios.
This will allow to store all the polling information in the bio and
thus simplify passing the cookie and allow for polling stacked devices.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c               | 28 +++++++++++++++++++---------
 include/linux/blk_types.h |  6 +++++-
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 303298996afe..7296abe293de 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -215,25 +215,35 @@ void bio_uninit(struct bio *bio)
 }
 EXPORT_SYMBOL(bio_uninit);
 
+static inline void bio_mempool_free(struct bio *bio)
+{
+	struct bio_set *bs = bio->bi_pool;
+	void *p = bio;
+
+	p -= bs->front_pad;
+	mempool_free(p, &bs->bio_pool);
+}
+
+static void bio_free_rcu(struct rcu_head *head)
+{
+	bio_mempool_free(container_of(head, struct bio, bi_rcu_free));
+}
+
 static void bio_free(struct bio *bio)
 {
 	struct bio_set *bs = bio->bi_pool;
-	void *p;
 
 	bio_uninit(bio);
 
 	if (bs) {
 		bvec_free(&bs->bvec_pool, bio->bi_io_vec, bio->bi_max_vecs);
-
-		/*
-		 * If we have front padding, adjust the bio pointer before freeing
-		 */
-		p = bio;
-		p -= bs->front_pad;
-
-		mempool_free(p, &bs->bio_pool);
+		if (bio->bi_opf & REQ_POLLED)
+			call_rcu(&bio->bi_rcu_free, bio_free_rcu);
+		else
+			bio_mempool_free(bio);
 	} else {
 		/* Bio was allocated by bio_kmalloc() */
+		WARN_ON_ONCE(bio->bi_opf & REQ_POLLED);
 		kfree(bio);
 	}
 }
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index ac60432752e3..183a76bf24b7 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -10,6 +10,7 @@
 #include <linux/bvec.h>
 #include <linux/device.h>
 #include <linux/ktime.h>
+#include <linux/rcupdate.h>
 
 struct bio_set;
 struct bio;
@@ -233,7 +234,10 @@ struct bio {
 	blk_status_t		bi_status;
 	atomic_t		__bi_remaining;
 
-	struct bvec_iter	bi_iter;
+	union {
+		struct bvec_iter	bi_iter;
+		struct rcu_head		bi_rcu_free;
+	};
 
 	bio_end_io_t		*bi_end_io;
 
-- 
2.30.1


  parent reply	other threads:[~2021-04-26 13:55 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-26 13:48 switch block layer polling to a bio based model Christoph Hellwig
2021-04-26 13:48 ` [PATCH 01/12] direct-io: remove blk_poll support Christoph Hellwig
2021-04-26 13:48 ` [PATCH 02/12] block: don't try to poll multi-bio I/Os in __blkdev_direct_IO Christoph Hellwig
2021-04-26 13:48 ` [PATCH 03/12] iomap: don't try to poll multi-bio I/Os in __iomap_dio_rw Christoph Hellwig
2021-04-26 13:48 ` [PATCH 04/12] blk-mq: factor out a "classic" poll helper Christoph Hellwig
2021-04-26 13:48 ` [PATCH 05/12] blk-mq: factor out a blk_qc_to_hctx helper Christoph Hellwig
2021-04-26 13:48 ` [PATCH 06/12] blk-mq: refactor hybrid polling Christoph Hellwig
2021-04-26 13:48 ` [PATCH 07/12] blk-mq: remove blk_qc_t_to_tag and blk_qc_t_is_internal Christoph Hellwig
2021-04-26 13:48 ` [PATCH 08/12] blk-mq: remove blk_qc_t_valid Christoph Hellwig
2021-04-26 13:48 ` [PATCH 09/12] block: rename REQ_HIPRI to REQ_POLLED Christoph Hellwig
2021-04-26 13:48 ` Christoph Hellwig [this message]
2021-04-26 13:48 ` [PATCH 11/12] block: define 'struct bvec_iter' as packed Christoph Hellwig
2021-04-26 13:48 ` [PATCH 12/12] block: switch polling to be bio based Christoph Hellwig
2021-04-26 15:27   ` Ming Lei
2021-04-26 14:57 ` switch block layer polling to a bio based model Jens Axboe
2021-04-26 15:06   ` Christoph Hellwig
2021-04-26 15:12     ` Jens Axboe
2021-04-26 16:15       ` Christoph Hellwig
2021-04-26 16:48         ` Jens Axboe
2021-04-26 17:05   ` Christoph Hellwig
2021-04-26 17:18     ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210426134821.2191160-11-hch@lst.de \
    --to=hch@lst.de \
    --cc=Damien.LeMoal@wdc.com \
    --cc=axboe@kernel.dk \
    --cc=jefflexu@linux.alibaba.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=ming.lei@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.