block,md,nvme: correct handling of unsupported P2PDMA transfers - #26
Open
blktests-ci-block-trial[bot] wants to merge 8 commits into
Open
block,md,nvme: correct handling of unsupported P2PDMA transfers#26blktests-ci-block-trial[bot] wants to merge 8 commits into
blktests-ci-block-trial[bot] wants to merge 8 commits into
Conversation
Unsupported P2P transfers used to fail with BLK_STS_TARGET, chosen by commit 91fb2b6 ("nvme-pci: convert to using dma_map_sgtable()") for dma_map_sgtable()'s -EREMOTEIO: an I/O that can never succeed on this device must not be retried. The blk_rq_dma_map conversion changed it to BLK_STS_INVAL, which blk_path_error() treats as retryable and md deliberately ignores for member failures -- a P2P write to a member the peer cannot reach is counted as written and the mirrors silently diverge. Restore BLK_STS_TARGET. Hit e.g. with CMB memory of one NVMe device used as the data buffer for I/O to a second one behind a different host bridge. Fixes: 858299d ("block: add scatterlist-less DMA mapping helpers") Fixes: 7ce3c1d ("nvme-pci: convert the data mapping to blk_rq_dma_map") Cc: stable@vger.kernel.org # v6.17 Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
md_submit_bio() strips REQ_NOMERGE from every bio. For P2PDMA bios the flag is what keeps requests single-provider (see __bio_add_page()): merging a P2PDMA bio with one over a different pgmap, or over host memory, maps the merged request with the wrong bus address. Set the flag on P2PDMA bios -- bios built via bio_iov_bvec_set() arrive without it -- and keep stripping it otherwise. Fixes: 0266613 ("md: propagate BLK_FEAT_PCI_P2PDMA from member devices to RAID device") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
A write that skips write-behind (full behind queue, a waiting reader, failed behind-bio allocation) races the in-flight behind write it overlaps: nothing orders the two on the write-mostly member, and if the older behind data lands last the member keeps stale data for sectors already acknowledged as rewritten. Serialize on CollisionCheck, which marks exactly the rdevs owning a serial tree: serialize_policy rdevs plus write-mostly members when write-behind arms serialization -- the case the MD_SERIALIZE_POLICY test misses. remove_serial() under the same condition. This also avoids the old gate's latent NULL deref for rdevs hot-added under serialize_policy (they never get a serial tree). Fixes: d0d2d8b ("md/raid1: introduce wait_for_serialization") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-fable-5 Signed-off-by: Mykola Marzhan <mykola@meshstor.io>
alloc_behind_master_bio() copies the bio's data with bio_copy_data(), a CPU copy. P2PDMA pages are peer device (BAR) memory; generic code must not assume CPU load/store access to them is safe or fast on every architecture, and bouncing peer memory through the CPU defeats the point of a peer-to-peer transfer. Skip write-behind for P2PDMA bios: they are written directly to all members, including write-mostly ones. Ordering against write-behind I/O in flight to overlapping sectors is preserved: the non-behind clone path serializes on CollisionCheck rdevs (see the preceding fix), which covers these bios like any other write that bypasses write-behind. Fixes: 0266613 ("md: propagate BLK_FEAT_PCI_P2PDMA from member devices to RAID device") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
narrow_write_error() re-issues a failed write in badblock-granularity chunks, cloning from the master bio and resetting bi_opf to a bare REQ_OP_WRITE. For a P2PDMA bio that reset drops REQ_NOMERGE, which is the only request-level protection against the member queue merging P2PDMA segments across pgmaps or with host memory (see the preceding md_submit_bio() fix): the retry path would quietly reopen the hole the submission path closes. Restore the flag on P2PDMA retry clones. Fixes: 0266613 ("md: propagate BLK_FEAT_PCI_P2PDMA from member devices to RAID device") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
A member that cannot DMA-map peer memory fails the leg bio with BLK_STS_TARGET. The failure is a property of the peer/member pairing -- retrying the same pages against the same member cannot succeed, and there is nothing on the medium to repair -- but the error machinery treats it as a medium error: narrow_write_error() grinds through hundreds of doomed chunk retries per write, WantReplacement burns a spare and evicts the healthy member, fix_read_error()'s host-page probe "succeeds" so mixed host/P2P reads charge the read-error budget until a healthy member is kicked (~1s in testing), and FailFast evicts on the first unroutable I/O. Flag P2PDMA master bios with a new R1BIO_P2PDMA state bit at submission. On a BLK_STS_TARGET leg failure for a flagged bio: retry writes once as a single whole range, recording one bad range if that also fails (TARGET can be a transient device condition, e.g. NVME_SC_NS_NOT_READY, so the retry is not skipped outright); don't set WantReplacement; mark failed read legs IO_BLOCKED without charging the read-error budget; and don't treat the failure as FailFast evidence -- the request never reached the wire -- as commit f7b24c7 ("md/raid1,raid10: don't fail devices for invalid IO errors") did for BLK_STS_INVAL. Fixes: 0266613 ("md: propagate BLK_FEAT_PCI_P2PDMA from member devices to RAID device") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io>
Same handling as the preceding raid1 commit: flag P2PDMA master bios with R10BIO_P2PDMA at submission; on a BLK_STS_TARGET leg failure retry writes once as a whole range, don't set WantReplacement, block the leg for reads without charging the read-error budget, don't trip FailFast. Replacement legs keep the stock fail-on-write-error policy: badblocks are never recorded on a replacement, so failing it is the only outcome that cannot leave a silent hole in a rebuild. Fixes: 0266613 ("md: propagate BLK_FEAT_PCI_P2PDMA from member devices to RAID device") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Mykola Marzhan <mykola@meshstor.io>
ib_dma_map_sg() returns 0 on a P2P mapping failure, losing the DMA layer's -EREMOTEIO, so nvme-rdma reports a path error. Default multipath requeues the I/O forever, and without multipath it burns nvme_max_retries requeues, then completes as retryable BLK_STS_TRANSPORT. Map the data and metadata scatterlists with ib_dma_map_sgtable_attrs() and return BLK_STS_TARGET for -EREMOTEIO, matching nvme-pci (commit 91fb2b6 ("nvme-pci: convert to using dma_map_sgtable()")). Scatterlists stay: ib_map_mr_sg() consumes them, so blk_rq_dma_map does not apply. Start the request only after mapping succeeds so multipath accounting is never taken for an unmapped request, and ratelimit the map-failure message. Fixes: 23528aa ("nvme: enable PCI P2PDMA support for RDMA transport") Cc: stable@vger.kernel.org # v7.1 Assisted-by: Claude:claude-fable-5 Signed-off-by: Mykola Marzhan <mykola@meshstor.io>
Author
|
Upstream branch: 248951d |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull request for series with
subject: block,md,nvme: correct handling of unsupported P2PDMA transfers
version: 3
url: http://redsun45:8000/project/linux-block/list/?series=399