Re: [dm-devel] [PATCH 0/6] dax poison recovery with RWF_RECOVERY_DATA flag
From: Christoph Hellwig <hch@infradead.org>
Date: 2021-11-03 16:58:41
Also in:
dm-devel, linux-fsdevel, lkml, nvdimm
On Tue, Nov 02, 2021 at 12:57:10PM -0700, Dan Williams wrote:
This goes back to one of the original DAX concerns of wanting a kernel library for coordinating PMEM mmap I/O vs leaving userspace to wrap PMEM semantics on top of a DAX mapping. The problem is that mmap-I/O has this error-handling-API issue whether it is a DAX mapping or not.
Semantics of writes through shared mmaps are a nightmare. Agreed, including agreeing that this is neither new nor pmem specific. But it also has absolutely nothing to do with the new RWF_ flag.
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE implies that processes will
receive SIGBUS + BUS_MCEERR_A{R,O} when memory failure is signalled
and then rely on readv(2)/writev(2) to recover. Do you see a readily
available way to improve upon that model without CPU instruction
changes? Even with CPU instructions changes, do you think it could
improve much upon the model of interrupting the process when a load
instruction aborts?The "only" think we need is something like the exception table we use in the kernel for the uaccess helpers (and the new _nofault kernel access helper). But I suspect refitting that into userspace environments is probably non-trivial.
I do agree with you that DAX needs to separate itself from block, but I don't think it follows that DAX also needs to separate itself from readv/writev for when a kernel slow-path needs to get involved because mmap I/O (just CPU instructions) does not have the proper semantics. Even if you got one of the ARCH_SUPPORTS_MEMORY_FAILURE to implement those semantics in new / augmented CPU instructions you will likely not get all of them to move and certainly not in any near term timeframe, so the kernel path will be around indefinitely.
I think you misunderstood me. I don't think pmem needs to be decoupled from the read/write path. But I'm very skeptical of adding a new flag to the common read/write path for the special workaround that a plain old write will not actually clear errors unlike every other store interfac.
Meanwhile, I think RWF_RECOVER_DATA is generically useful for other storage besides PMEM and helps storage-drivers do better than large blast radius "I/O error" completions with no other recourse.
How?