Re: [dm-devel] [PATCH 0/6] dax poison recovery with RWF_RECOVERY_DATA flag
From: Dan Williams <hidden>
Date: 2021-11-03 20:34:13
Also in:
dm-devel, linux-fsdevel, lkml, nvdimm
On Wed, Nov 3, 2021 at 9:58 AM Christoph Hellwig [off-list ref] wrote:
On Tue, Nov 02, 2021 at 12:57:10PM -0700, Dan Williams wrote:quoted
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.
Ok.
quoted
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.
Is the exception table requirement not already fulfilled by:
sigaction(SIGBUS, &act, 0);
...
if (sigsetjmp(sj_env, 1)) {
...
...but yes, that's awkward when all you want is an error return from a
copy operation.
For _nofault I'll note that on the kernel side Linus was explicit
about not mixing fault handling and memory error exception handling in
the same accessor. That's why copy_mc_to_kernel() and
copy_{to,from}_kernel_nofault() are distinct. I only say that to probe
deeper about what a "copy_mc()" looks like in userspace? Perhaps an
interface to suppress SIGBUS generation and register a ring buffer
that gets filled with error-event records encountered over a given
MMAP I/O code sequence?
quoted
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.
Ah, ok, yes, I agree with you there that needing to redirect writes to a platform firmware call to clear errors, and notify the device that its error-list has changed is exceedingly awkward. That said, even if the device-side error-list auto-updated on write (like the promise of MOVDIR64B) there's still the question about when to do management on the software error lists in the driver and/or filesytem. I.e. given that XFS at least wants to be aware of the error lists for block allocation and "list errors" type features. More below...
quoted
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?
Hasn't this been a perennial topic at LSF/MM, i.e. how to get an interface for the filesystem to request "try harder" to return data? If the device has a recovery slow-path, or error tracking granularity is smaller than the I/O size, then RWF_RECOVER_DATA gives the device/driver leeway to do better than the typical fast path. For writes though, I can only come up with the use case of this being a signal to the driver to take the opportunity to do error-list management relative to the incoming write data. However, if signaling that "now is the time to update error-lists" is the requirement, I imagine the @kaddr returned from dax_direct_access() could be made to point to an unmapped address representing the poisoned page. Then, arrange for a pmem-driver fault handler to emulate the copy operation and do the slow path updates that would otherwise have been gated by RWF_RECOVER_DATA. Although, I'm not excited about teaching every PMEM arch's fault handler about this new source of kernel faults. Other ideas? RWF_RECOVER_DATA still seems the most viable / cleanest option, but I'm willing to do what it takes to move this error management capability forward.