diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2022-01-10 15:35:41 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2022-01-10 15:35:41 -0300 |
commit | debe70e488968e82282db48fbbcf84b5080f742c (patch) | |
tree | 90f96f07c499bfc5bdbbeab3ca4a81a5a7672b61 /mm/memory-failure.c | |
parent | 65f8d08cf838df3c3d728cdef908090237931496 (diff) | |
parent | 133d9c53c9dcbb1b8f317e402e79c44d9eb725c9 (diff) |
Merge remote-tracking branch 'torvalds/master' into perf/core
To pick up fixes.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 3a274468f193..f1c389f7e669 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1646,21 +1646,28 @@ int memory_failure(unsigned long pfn, int flags) if (!sysctl_memory_failure_recovery) panic("Memory failure on page %lx", pfn); + mutex_lock(&mf_mutex); + p = pfn_to_online_page(pfn); if (!p) { + res = arch_memory_failure(pfn, flags); + if (res == 0) + goto unlock_mutex; + if (pfn_valid(pfn)) { pgmap = get_dev_pagemap(pfn, NULL); - if (pgmap) - return memory_failure_dev_pagemap(pfn, flags, - pgmap); + if (pgmap) { + res = memory_failure_dev_pagemap(pfn, flags, + pgmap); + goto unlock_mutex; + } } pr_err("Memory failure: %#lx: memory outside kernel control\n", pfn); - return -ENXIO; + res = -ENXIO; + goto unlock_mutex; } - mutex_lock(&mf_mutex); - try_again: if (PageHuge(p)) { res = memory_failure_hugetlb(pfn, flags); |