On 12/1/2023 3:23 AM, Keith Busch wrote: > From: Keith Busch<kbusch@xxxxxxxxxx> This causes a regression (existed in previous version too). System freeze on issuing single read/write io that used to work fine earlier: fio -iodepth=1 -rw=randread -ioengine=io_uring_cmd -cmd_type=nvme -bs=4096 -numjobs=1 -size=4096 -filename=/dev/ng0n1 -md_per_io_size=8 -name=pt This is because we pin one bvec during submission, but unpin 4 on completion. bio_integrity_unpin_bvec() uses bip->bip_max_vcnt, which is set to 4 (equal to BIO_INLINE_VECS) in this case. To use bip_max_vcnt the way this series uses, we need below patch/fix: diff --git a/block/bio-integrity.c b/block/bio-integrity.c index 674a2c80454b..feef615e2c9c 100644 --- a/block/bio-integrity.c +++ b/block/bio-integrity.c @@ -69,15 +69,15 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, memset(bip, 0, sizeof(*bip)); + /* always report as many vecs as asked explicitly, not inline vecs */ + bip->bip_max_vcnt = nr_vecs; if (nr_vecs > inline_vecs) { - bip->bip_max_vcnt = nr_vecs; bip->bip_vec = bvec_alloc(&bs->bvec_integrity_pool, &bip->bip_max_vcnt, gfp_mask); if (!bip->bip_vec) goto err; } else { bip->bip_vec = bip->bip_inline_vecs; - bip->bip_max_vcnt = inline_vecs; } bip->bip_bio = bio;