diff options
author | Toshi Kani <toshi.kani@hpe.com> | 2016-04-12 20:10:52 -0400 |
---|---|---|
committer | Ross Zwisler <ross.zwisler@linux.intel.com> | 2016-04-14 11:01:47 -0400 |
commit | cba2e47abcbd80e3f46f460899290402f98090ec (patch) | |
tree | 023dc101fde300f6fddb72eae60a5017b643a4c9 | |
parent | bf16200689118d19de1b8d2a3c314fc21f5dc7bb (diff) |
pmem: fix BUG() error in pmem.h:48 on X86_32
After 'commit fc0c2028135c ("x86, pmem: use memcpy_mcsafe()
for memcpy_from_pmem()")', probing a PMEM device hits the BUG()
error below on X86_32 kernel.
kernel BUG at include/linux/pmem.h:48!
memcpy_from_pmem() calls arch_memcpy_from_pmem(), which is
unimplemented since CONFIG_ARCH_HAS_PMEM_API is undefined on
X86_32.
Fix the BUG() error by adding default_memcpy_from_pmem().
Acked-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
-rw-r--r-- | include/linux/pmem.h | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/include/linux/pmem.h b/include/linux/pmem.h index ac6d872ce067..57d146fe44dd 100644 --- a/include/linux/pmem.h +++ b/include/linux/pmem.h | |||
@@ -72,6 +72,18 @@ static inline void arch_invalidate_pmem(void __pmem *addr, size_t size) | |||
72 | } | 72 | } |
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | static inline bool arch_has_pmem_api(void) | ||
76 | { | ||
77 | return IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API); | ||
78 | } | ||
79 | |||
80 | static inline int default_memcpy_from_pmem(void *dst, void __pmem const *src, | ||
81 | size_t size) | ||
82 | { | ||
83 | memcpy(dst, (void __force *) src, size); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
75 | /* | 87 | /* |
76 | * memcpy_from_pmem - read from persistent memory with error handling | 88 | * memcpy_from_pmem - read from persistent memory with error handling |
77 | * @dst: destination buffer | 89 | * @dst: destination buffer |
@@ -83,12 +95,10 @@ static inline void arch_invalidate_pmem(void __pmem *addr, size_t size) | |||
83 | static inline int memcpy_from_pmem(void *dst, void __pmem const *src, | 95 | static inline int memcpy_from_pmem(void *dst, void __pmem const *src, |
84 | size_t size) | 96 | size_t size) |
85 | { | 97 | { |
86 | return arch_memcpy_from_pmem(dst, src, size); | 98 | if (arch_has_pmem_api()) |
87 | } | 99 | return arch_memcpy_from_pmem(dst, src, size); |
88 | 100 | else | |
89 | static inline bool arch_has_pmem_api(void) | 101 | return default_memcpy_from_pmem(dst, src, size); |
90 | { | ||
91 | return IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API); | ||
92 | } | 102 | } |
93 | 103 | ||
94 | /** | 104 | /** |