Skip to content

Commit 65d3440

Browse files
djbwakpm00
authored andcommitted
mm/memory-failure: fix detection of memory_failure() handlers
Some pagemap types, like MEMORY_DEVICE_GENERIC (device-dax) do not even have pagemap ops which results in crash signatures like this: BUG: kernel NULL pointer dereference, address: 0000000000000010 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 8000000205073067 P4D 8000000205073067 PUD 2062b3067 PMD 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 22 PID: 4535 Comm: device-dax Tainted: G OE N 6.0.0-rc2+ #59 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 RIP: 0010:memory_failure+0x667/0xba0 [..] Call Trace: <TASK> ? _printk+0x58/0x73 do_madvise.part.0.cold+0xaf/0xc5 Check for ops before checking if the ops have a memory_failure() handler. Link: https://lkml.kernel.org/r/166153428781.2758201.1990616683438224741.stgit@dwillia2-xfh.jf.intel.com Fixes: 33a8f7f ("pagemap,pmem: introduce ->memory_failure()") Signed-off-by: Dan Williams <[email protected]> Acked-by: Naoya Horiguchi <[email protected]> Reviewed-by: Miaohe Lin <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Cc: Shiyang Ruan <[email protected]> Cc: Darrick J. Wong <[email protected]> Cc: Al Viro <[email protected]> Cc: Dave Chinner <[email protected]> Cc: Goldwyn Rodrigues <[email protected]> Cc: Jane Chu <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Ritesh Harjani <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent fd63612 commit 65d3440

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

include/linux/memremap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ struct dev_pagemap {
139139
};
140140
};
141141

142+
static inline bool pgmap_has_memory_failure(struct dev_pagemap *pgmap)
143+
{
144+
return pgmap->ops && pgmap->ops->memory_failure;
145+
}
146+
142147
static inline struct vmem_altmap *pgmap_altmap(struct dev_pagemap *pgmap)
143148
{
144149
if (pgmap->flags & PGMAP_ALTMAP_VALID)

mm/memory-failure.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags,
19281928
* Call driver's implementation to handle the memory failure, otherwise
19291929
* fall back to generic handler.
19301930
*/
1931-
if (pgmap->ops->memory_failure) {
1931+
if (pgmap_has_memory_failure(pgmap)) {
19321932
rc = pgmap->ops->memory_failure(pgmap, pfn, 1, flags);
19331933
/*
19341934
* Fall back to generic handler too if operation is not

0 commit comments

Comments
 (0)