All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jinyoung CHOI <j-young.choi@samsung.com>
To: Jinyoung CHOI <j-young.choi@samsung.com>,
	"axboe@kernel.dk" <axboe@kernel.dk>,
	"kbusch@kernel.org" <kbusch@kernel.org>,
	"hch@lst.de" <hch@lst.de>, "sagi@grimberg.me" <sagi@grimberg.me>,
	"martin.petersen@oracle.com" <martin.petersen@oracle.com>,
	"kch@nvidia.com" <kch@nvidia.com>,
	"linux-block@vger.kernel.org" <linux-block@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [PATCH 03/15] block: bio-integrity: modify bio_integrity_add_page()
Date: Wed, 03 May 2023 19:06:39 +0900	[thread overview]
Message-ID: <20230503100639epcms2p5069df7346cfce6db9718b9adf7cc3718@epcms2p5> (raw)
In-Reply-To: <20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p4>

Considering the constraints of hardware, the physically continuous pages
were to be composed of one bio_vec.

Previously, bio_vec was created separately for each page entering the
parameter.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Martin K. Petersen <martin.petersen@oracle.com>

Fixes: 783b94bd9250 ("nvme-pci: do not build a scatterlist to map metadata")
Signed-off-by: Jinyoung Choi <j-young.choi@samsung.com>
---
 block/bio-integrity.c | 41 +++++++++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/block/bio-integrity.c b/block/bio-integrity.c
index 06b6a2c178d2..74cf9933c285 100644
--- a/block/bio-integrity.c
+++ b/block/bio-integrity.c
@@ -176,25 +176,45 @@ static bool bip_try_merge_hw_seg(struct request_queue *q,
  * @len:	number of bytes of integrity metadata in page
  * @offset:	start offset within page
  *
- * Description: Attach a page containing integrity metadata to bio.
+ * Add a page containing integrity metadata to a bio while respecting
+ * the hardware max_sectors, max_segment and gap limitations.
  */
 int bio_integrity_add_page(struct bio *bio, struct page *page,
 			   unsigned int len, unsigned int offset)
 {
+	struct request_queue *q = bdev_get_queue(bio->bi_bdev);
 	struct bio_integrity_payload *bip = bio_integrity(bio);
 
-	if (bip->bip_vcnt >= bip->bip_max_vcnt) {
+	if (((bip->bip_iter.bi_size + len) >> 9) > queue_max_hw_sectors(q))
+		return 0;
+
+	if (bip->bip_vcnt > 0) {
+		struct bio_vec *bv;
+		bool same_page = false;
+
+		if (bip_try_merge_hw_seg(q, bip, page, len, offset, &same_page))
+			return len;
+
+		/*
+		 * If the queue doesn't support SG gaps and adding this segment
+		 * would create a gap, disallow it.
+		 */
+		bv = &bip->bip_vec[bip->bip_vcnt - 1];
+		if (bvec_gap_to_prev(&q->limits, bv, offset))
+			return 0;
+	}
+
+	if (bip_full(bip, len)) {
 		printk(KERN_ERR "%s: bip_vec full\n", __func__);
 		return 0;
 	}
 
-	if (bip->bip_vcnt &&
-	    bvec_gap_to_prev(&bdev_get_queue(bio->bi_bdev)->limits,
-			     &bip->bip_vec[bip->bip_vcnt - 1], offset))
+	if (bip->bip_vcnt >= queue_max_integrity_segments(q))
 		return 0;
 
 	bvec_set_page(&bip->bip_vec[bip->bip_vcnt], page, len, offset);
 	bip->bip_vcnt++;
+	bip->bip_iter.bi_size += len;
 
 	return len;
 }
@@ -307,7 +327,6 @@ bool bio_integrity_prep(struct bio *bio)
 	}
 
 	bip->bip_flags |= BIP_BLOCK_INTEGRITY;
-	bip->bip_iter.bi_size = len;
 	bip_set_seed(bip, bio->bi_iter.bi_sector);
 
 	if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM)
@@ -316,7 +335,6 @@ bool bio_integrity_prep(struct bio *bio)
 	/* Map it */
 	offset = offset_in_page(buf);
 	for (i = 0 ; i < nr_pages ; i++) {
-		int ret;
 		bytes = PAGE_SIZE - offset;
 
 		if (len <= 0)
@@ -325,18 +343,13 @@ bool bio_integrity_prep(struct bio *bio)
 		if (bytes > len)
 			bytes = len;
 
-		ret = bio_integrity_add_page(bio, virt_to_page(buf),
-					     bytes, offset);
-
-		if (ret == 0) {
+		if (bio_integrity_add_page(bio, virt_to_page(buf),
+					   bytes, offset) < bytes) {
 			printk(KERN_ERR "could not attach integrity payload\n");
 			status = BLK_STS_RESOURCE;
 			goto err_end_io;
 		}
 
-		if (ret < bytes)
-			break;
-
 		buf += bytes;
 		len -= bytes;
 		offset = 0;
-- 
2.34.1

  parent reply	other threads:[~2023-05-03 10:06 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p4>
2023-05-03  9:49 ` [PATCH 00/15] Change the integrity configuration method in block Jinyoung CHOI
     [not found]   ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p3>
2023-05-03 10:02     ` [PATCH 02/15] block: blk-integiry: add helper functions for bio_integrity_add_page Jinyoung CHOI
2023-05-03 15:55       ` hch
     [not found]       ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p7>
2023-05-04  6:46         ` Jinyoung CHOI
2023-05-03 10:09     ` [PATCH 04/15] block: bio-integiry: cleanup bio_integrity_prep Jinyoung CHOI
2023-05-03 15:55       ` hch
2023-05-03 10:18     ` [PATCH 09/15] scsi: add scsi_alloc_integrity_sgtables() for integrity process Jinyoung CHOI
2023-05-03 10:25     ` [PATCH 13/15] block: add helper function for iteration of bip's bvec Jinyoung CHOI
     [not found]   ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p2>
2023-05-03 10:00     ` [PATCH 01/15] block: bio: rename page_is_mergeable to bio_page_is_mergeable and make non-static Jinyoung CHOI
2023-05-03 15:52       ` hch
2023-05-03 10:12     ` [PATCH 06/15] block: blk-merge: fix to add the number of integrity segments to the request twice Jinyoung CHOI
2023-05-04  6:24     ` RE:(2) [PATCH 01/15] block: bio: rename page_is_mergeable to bio_page_is_mergeable and make non-static Jinyoung CHOI
     [not found]   ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p6>
2023-05-03 10:10     ` [PATCH 05/15] block: fix not to apply bip information in blk_rq_bio_prep() Jinyoung CHOI
2023-05-03 12:56       ` kernel test robot
2023-05-03 15:57       ` hch
2023-05-03 17:23       ` kernel test robot
2023-05-03 19:06       ` kernel test robot
     [not found]       ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p1>
2023-05-04  6:10         ` Jinyoung CHOI
2023-05-03 10:13     ` [PATCH 07/15] block: blk-merge: fix merging two requests in ll_merge_requests_fn Jinyoung CHOI
     [not found]   ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p5>
2023-05-03 10:06     ` Jinyoung CHOI [this message]
2023-05-03 10:16     ` [PATCH 08/15] block: add helper function to get the number of integrity segments Jinyoung CHOI
2023-05-03 10:20     ` [PATCH 10/15] scsi: change to use blk_rq_nr_integrity_segments() instead of blk_rq_count_integrity_sg() Jinyoung CHOI
2023-05-03 10:21     ` [PATCH 11/15] block: blk-integrity: change how to find the number of integrity of bio Jinyoung CHOI
2023-05-03 10:23     ` [PATCH 12/15] nvme: rdma: change how to find the number of integrity of request Jinyoung CHOI
     [not found]   ` <CGME20230503094912epcms2p4bef206eab1c41a92eba2583a69c74323@epcms2p8>
2023-05-03 10:28     ` [PATCH 15/15] block: blk-integrity: remove blk_rq_count_integrity_sg() Jinyoung CHOI
2023-05-03 10:27 ` [PATCH 14/15] block: blk-integrity: change sg-table configuration method for integrity Jinyoung CHOI
2023-05-03 14:29   ` kernel test robot
2023-05-03 20:07   ` kernel test robot

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=20230503100639epcms2p5069df7346cfce6db9718b9adf7cc3718@epcms2p5 \
    --to=j-young.choi@samsung.com \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=kbusch@kernel.org \
    --cc=kch@nvidia.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=sagi@grimberg.me \
    /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.