From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5ADF8340A52 for ; Sat, 1 Aug 2026 15:49:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785599343; cv=none; b=OxGUciMpt/E7aPGE//4oaE/PAvVmgzisTbVxIiIWcnno1VpE/0NFZNGcYFOqwXteQ3vvOW3rPO+y8hl5frYM5lszCk5T+y6En/nnlRwJKMDw7lOTxaAgU1khZPbvfRXZoO6SCbcvbn85puTMm6/Aops3fuRdU5Swlkd1twK3/Yw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785599343; c=relaxed/simple; bh=l/ge8TugHemWMqrNxxHjTUj8j/KX2qzLG7MG78we1Ss=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oKYOes2HBRKtJqI2WFG6yEFL2R0YZsrx4YupQE/T5yMJlcXMt4T91xWtwUu55TPuyRCqP32Tdjtls5LmfCr92uS4jpnyof1mpibZSoJEKcaQIKuKofzmXfcx/xZfX/Kpge6hAdvsH2BGSHxxnjF5DrI/eAuFd36kR9pjwssbldk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XM9ktqES; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XM9ktqES" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2cab973140bso24785115ad.3 for ; Sat, 01 Aug 2026 08:48:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785599339; x=1786204139; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7ojEbSoOEAjcpRPJZN1aYCrlxFzJ3/XljVJRrzaFsbs=; b=XM9ktqESqb3mFRQ8X89TnKjm0U7zRTnOGXTc9kenfXUtbDBAOuxVkoNQ6LpqJV+JQ2 UXuqk0Et+vWNhoXqeM6M/Ghna75QUy9aAW4TRs9LY6h1Mm0PC7lCqdpGUC/NmU0pNPZZ XDLnZo0nkIRsQ5Ymu6DGVDuRswfY3hXN3V1PkxQPPRJ4/o2cYRR43v1ARr7wJCKrh4PB e167VzWtGagxJ2ANl37Ea4YSb0TF1jbtLX/qFICqFKHShJru9NNateuhe2WkrBfQUSwV kuH0mYfGVs0GkyZoRTeFn/iPvD3y93ETWhFzy8C4wTS5q8vfdm49Jh+j9caT7z/+A8+5 a0kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785599339; x=1786204139; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=7ojEbSoOEAjcpRPJZN1aYCrlxFzJ3/XljVJRrzaFsbs=; b=QeQGHrVyGi+DtFDzKjg7sBHjbrEd4VniA0vmTgjK1b/bcjlVGGAbtIzIBt5/KvKbee JblQJt/7AFw3Gt0vK/dbkE15XK+hg/c1L63JHLCFUB/TpicR/caGMsC5Xn3iqnbb4q8O w7UPVyo6U6dH7CAYCnl/Nw4d9Iqny0gMIwQZxovFvd1r4hvhdnNqT581DhmSHf6em376 CHps+Y9C4QsMNoJo/1gqaiTrCr86F+OiliCS5gfLHIEbNEReQQ1mjC9EyMkyvCqby7Md 1rk251dRaRP9yjT+Dg6MCev4RjbcjHrB8+IYwH4irJXTsQAcjLMgMAeNmysZPdIztGTY 35nQ== X-Forwarded-Encrypted: i=1; AHgh+RpVcmMeoGiXsVAF1Osme2uveqxOFpG4BnKaWBOmk+qoedZ5dM3+hiA8uGkM0V1CnWXenyI8P9lPcd/kXXE=@vger.kernel.org X-Gm-Message-State: AOJu0YyvSHd9LscDpIc6fxQBPvtJgH+RrpjcT/Z91Qnng66WYmGqDngD +2SAh6IcwTS/saEVy5a85SYvn55qOAWH+dKRV8nDwekJKOW2VHddtWJS X-Gm-Gg: AR+sD12dulkPVq0muQgV0zroq+oVRiIYl3STozQPAqApm2cX6FxNISghVpLjfPtkCqR cEH3CJqKsP7OAL+WAdNeAMw0AQ2Cto6/sSBpQv5nzZcWA+eYcjlfayvRdTky5rKsIc5r2T0MPar cc9KOU17F4r+7ksFDOMUqmg5c5dOTXiK9bb+Fjow0v6mXwEffh7uhbXchKn9YXQzaieSGaC09mQ ua0hZ3LFJ7hy+EoXnu2YNJjwn9eZcMgjkNin7a8Qi2kCYGg9mhi1hVS7RWJabaU6j7yR+P2/pQJ iepN+Jwx9532TCFzHJJkErlOgGD2s5T+Z9r/sYCUWzlFUV+BumeU+8oNhifRlCGyv1kEJizWxjs fvpXvYvN/+u/rtejvcfc4hR+p8UtyOO5r58EPUFMNOWU0ByUAPKGzQWCiibZTVMQX1EvAOZimdG m38KehS3hcukHOI4YS8icpZ9sBJ/T1NsKLqseNw7EZrk3lbpTS0sQyQnLcDtRP05H5ZEfbiJYvK tV3xgJt5h/tmtNZNZeXzOtQ0kjU9KtfLM7fbrTAYjAi7NU= X-Received: by 2002:a17:903:19c7:b0:2d0:4021:bb6b with SMTP id d9443c01a7336-2d0520362cdmr40118035ad.0.1785599339056; Sat, 01 Aug 2026 08:48:59 -0700 (PDT) Received: from 127.net ([2620:10d:c092:600::1:61d0]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d04b12202bsm18287605ad.66.2026.08.01.08.48.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2026 08:48:58 -0700 (PDT) From: Pavel Begunkov To: Jens Axboe , Keith Busch , Christoph Hellwig , Sagi Grimberg , linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, io-uring@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org Cc: asml.silence@gmail.com, Alexander Viro , Christian Brauner , Andrew Morton , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= , Nitesh Shetty , Kanchan Joshi , Anuj Gupta , Tushar Gohad , William Power , Phil Cayton , Jason Gunthorpe , Damien Le Moal , Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski , Vishal Verma , David Sterba , Ilya Dryomov , dm-devel@lists.linux.dev, nvdimm@lists.linux.dev, linux-btrfs@vger.kernel.org, ceph-devel@vger.kernel.org Subject: [PATCH v5 06/16] block: introduce bio_iov_iter_set() Date: Sat, 1 Aug 2026 16:46:18 +0100 Message-ID: <4686a0e47fc14f3f888967a80d45a6f66044f1e0.1785596451.git.asml.silence@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit In preparation to supporting dma-buf backed iterators and bios, introduce bio_iov_iter_set() which attempts to set up the bio directly from the given iterator. For now, it only supports bvec and expects users to check the result and fall back to other means if fails, but later we'll add more types. Suggested-by: Christoph Hellwig Signed-off-by: Pavel Begunkov --- block/bio.c | 13 ++++++++----- block/blk-map.c | 2 +- block/fops.c | 16 +++++++--------- include/linux/bio.h | 2 +- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/block/bio.c b/block/bio.c index 00f99d03ac91..898b2f5ef8c8 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1181,8 +1181,11 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty) } EXPORT_SYMBOL_GPL(__bio_release_pages); -void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter) +bool bio_iov_iter_set(struct bio *bio, const struct iov_iter *iter) { + if (!iov_iter_is_bvec(iter)) + return false; + WARN_ON_ONCE(bio->bi_max_vecs); bio->bi_io_vec = (struct bio_vec *)iter->bvec; @@ -1190,6 +1193,7 @@ void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter) bio->bi_iter.bi_offset = iter->iov_offset; bio->bi_iter.bi_size = iov_iter_count(iter); bio_set_flag(bio, BIO_CLONED); + return true; } /* @@ -1284,10 +1288,9 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter, if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) return -EIO; - if (iov_iter_is_bvec(iter)) { - bio_iov_bvec_set(bio, iter); - - if (!bio_iov_bvec_aligned(bio, mem_align_mask)) + if (bio_iov_iter_set(bio, iter)) { + if (iov_iter_is_bvec(iter) && + !bio_iov_bvec_aligned(bio, mem_align_mask)) return -EINVAL; iov_iter_advance(iter, bio->bi_iter.bi_size); diff --git a/block/blk-map.c b/block/blk-map.c index 615d29bb840e..9cb9605d1f62 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -473,7 +473,7 @@ static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter) bio = blk_rq_map_bio_alloc(rq, 0, GFP_KERNEL); if (!bio) return -ENOMEM; - bio_iov_bvec_set(bio, iter); + bio_iov_iter_set(bio, iter); ret = blk_rq_append_bio(rq, bio); if (ret) diff --git a/block/fops.c b/block/fops.c index 3c2099dfef1d..d11923053afe 100644 --- a/block/fops.c +++ b/block/fops.c @@ -342,15 +342,13 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb, bio->bi_end_io = blkdev_bio_end_io_async; bio->bi_ioprio = iocb->ki_ioprio; - if (iov_iter_is_bvec(iter)) { - /* - * Users don't rely on the iterator being in any particular - * state for async I/O returning -EIOCBQUEUED, hence we can - * avoid expensive iov_iter_advance(). Bypass - * bio_iov_iter_get_pages() and set the bvec directly. - */ - bio_iov_bvec_set(bio, iter); - } else { + /* + * Users don't rely on the iterator being in any particular + * state for async I/O returning -EIOCBQUEUED, hence we can + * avoid expensive iov_iter_advance(). Bypass + * bio_iov_iter_get_pages() and set the bvec directly. + */ + if (!bio_iov_iter_set(bio, iter)) { ret = blkdev_iov_iter_get_pages(bio, iter, bdev); if (unlikely(ret)) goto out_bio_put; diff --git a/include/linux/bio.h b/include/linux/bio.h index f9b8903c6a87..0d27e0c72905 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -522,7 +522,7 @@ int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data, int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter, unsigned mem_align_mask, unsigned len_align_mask); -void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter); +bool bio_iov_iter_set(struct bio *bio, const struct iov_iter *iter); void __bio_release_pages(struct bio *bio, bool mark_dirty); extern void bio_set_pages_dirty(struct bio *bio); extern void bio_check_pages_dirty(struct bio *bio); -- 2.54.0