On 3/22/2022 10:45 PM, Christoph Hellwig wrote: > On Tue, Mar 22, 2022 at 11:05:09PM +0000, Jane Chu wrote: >>> This DAX_RECOVERY doesn't actually seem to be used anywhere here or >>> in the subsequent patches. Did I miss something? >> >> dax_iomap_iter() uses the flag in the same patch, >> + if ((map_len == -EIO) && (iov_iter_rw(iter) == WRITE)) { >> + flags |= DAX_RECOVERY; >> + map_len = dax_direct_access(dax_dev, pgoff, nrpg, >> + flags, &kaddr, NULL); > > Yes, it passes it on to dax_direct_access, and dax_direct_access passes > it onto ->direct_access. But nothing in this series actually checks > for it as far as I can tell. The flag is checked here, again, I'll spell out the flag rather than using it as a boolean. __weak long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff, - long nr_pages, void **kaddr, pfn_t *pfn) + long nr_pages, int flags, void **kaddr, pfn_t *pfn) { resource_size_t offset = PFN_PHYS(pgoff) + pmem->data_offset; - if (unlikely(is_bad_pmem(&pmem->bb, PFN_PHYS(pgoff) / 512, + if (!flags && unlikely(is_bad_pmem(&pmem->bb, PFN_PHYS(pgoff) / 512, PFN_PHYS(nr_pages)))) return -EIO; > >>>> Also introduce a new dev_pagemap_ops .recovery_write function. >>>> The function is applicable to FSDAX device only. The device >>>> page backend driver provides .recovery_write function if the >>>> device has underlying mechanism to clear the uncorrectable >>>> errors on the fly. >>> >>> Why is this not in struct dax_operations? >> >> Per Dan's comments to the v5 series, adding .recovery_write to >> dax_operations causes a number of trivial dm targets changes. >> Dan suggested that adding .recovery_write to pagemap_ops could >> cut short the logistics of figuring out whether the driver backing >> up a page is indeed capable of clearing poison. Please see >> https://lkml.org/lkml/2022/2/4/31 > > But at least in this series there is 1:1 association between the > pgmap and the dax_device so that scheme won't work. It would > have to lookup the pgmap based on the return physical address from > dax_direct_access. Which sounds more complicated than just adding > the (annoying) boilerplate code to DM. > Yes, good point! Let me look into this. >> include/linux/memremap.h doesn't know struct iov_iter which is defined >> in include/linux/uio.h, would you prefer to adding include/linux/uio.h >> to include/linux/memremap.h ? > > As it is not derefences just adding a > > struct iov_iter; > > line to memremap.h below the includes should be all that is needed. Sure, will do. Thanks! -jane