On Mon, Mar 28, 2016 at 5:28 PM, Dan Williams <dan.j.willi...@intel.com> wrote: > Update the definition of memcpy_from_pmem() to return 0 or a negative > error code. Implement x86/arch_memcpy_from_pmem() with memcpy_mcsafe(). > > Cc: Borislav Petkov <b...@alien8.de> > Cc: Ingo Molnar <mi...@kernel.org> > Cc: Tony Luck <tony.l...@intel.com> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Andy Lutomirski <l...@amacapital.net> > Cc: Peter Zijlstra <pet...@infradead.org> > Cc: Andrew Morton <a...@linux-foundation.org> > Cc: Linus Torvalds <torva...@linux-foundation.org> > Reviewed-by: Ross Zwisler <ross.zwis...@linux.intel.com> > Signed-off-by: Dan Williams <dan.j.willi...@intel.com> > --- > arch/x86/include/asm/pmem.h | 9 +++++++++ > drivers/nvdimm/pmem.c | 4 ++-- > include/linux/pmem.h | 21 +++++++++++++++------ > 3 files changed, 26 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/include/asm/pmem.h b/arch/x86/include/asm/pmem.h > index bf8b35d2035a..fbc5e92e1ecc 100644 > --- a/arch/x86/include/asm/pmem.h > +++ b/arch/x86/include/asm/pmem.h > @@ -47,6 +47,15 @@ static inline void arch_memcpy_to_pmem(void __pmem *dst, > const void *src, > BUG(); > } > > +static inline int arch_memcpy_from_pmem(void *dst, const void __pmem *src, > + size_t n) > +{ > + if (static_cpu_has(X86_FEATURE_MCE_RECOVERY)) > + return memcpy_mcsafe(dst, (void __force *) src, n); > + memcpy(dst, (void __force *) src, n); > + return 0; > +} > + > /** > * arch_wmb_pmem - synchronize writes to persistent memory > * > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index ca5721c306bb..cc31c6f1f88e 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -99,7 +99,7 @@ static int pmem_do_bvec(struct pmem_device *pmem, struct > page *page, > if (unlikely(bad_pmem)) > rc = -EIO; > else { > - memcpy_from_pmem(mem + off, pmem_addr, len); > + rc = memcpy_from_pmem(mem + off, pmem_addr, len); > flush_dcache_page(page); > } > } else { > @@ -295,7 +295,7 @@ static int pmem_rw_bytes(struct nd_namespace_common *ndns, > > if (unlikely(is_bad_pmem(&pmem->bb, offset / 512, sz_align))) > return -EIO; > - memcpy_from_pmem(buf, pmem->virt_addr + offset, size); > + return memcpy_from_pmem(buf, pmem->virt_addr + offset, size); > } else { > memcpy_to_pmem(pmem->virt_addr + offset, buf, size); > wmb_pmem(); > diff --git a/include/linux/pmem.h b/include/linux/pmem.h > index 3ec5309e29f3..cc948191a653 100644 > --- a/include/linux/pmem.h > +++ b/include/linux/pmem.h > @@ -42,6 +42,12 @@ static inline void arch_memcpy_to_pmem(void __pmem *dst, > const void *src, > BUG(); > } > > +static inline int arch_memcpy_from_pmem(void *dst, const void __pmem *src, > + size_t n) > +{ > + BUG(); > +}
Note, the change in v3 was the addition of this stub to fix a build error on !CONFIG_ARCH_HAS_PMEM_API archs.