diff options
author | yalin wang <yalin.wang2010@gmail.com> | 2016-01-21 19:40:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-21 20:20:51 -0500 |
commit | 16fd0fe4aa92d0d621ecfe21de86f7fdcfa41947 (patch) | |
tree | d94d862bb32b160dcacb5467c099f52748f5f1dd /mm | |
parent | 7162a1e87b3e380133dadc7909081bb70d0a7041 (diff) |
mm: fix kernel crash in khugepaged thread
This crash is caused by NULL pointer deference, in page_to_pfn() marco,
when page == NULL :
Unable to handle kernel NULL pointer dereference at virtual address 00000000
Internal error: Oops: 94000006 [#1] SMP
Modules linked in:
CPU: 1 PID: 26 Comm: khugepaged Tainted: G W 4.3.0-rc6-next-20151022ajb-00001-g32f3386-dirty #3
PC is at khugepaged+0x378/0x1af8
LR is at khugepaged+0x418/0x1af8
Process khugepaged (pid: 26, stack limit = 0xffffffc079638020)
Call trace:
khugepaged+0x378/0x1af8
kthread+0xdc/0xf4
ret_from_fork+0xc/0x40
Code: 35001700 f0002c60 aa0703e3 f9009fa0 (f94000e0)
---[ end trace 637503d8e28ae69e ]---
Kernel panic - not syncing: Fatal exception
CPU2: stopping
CPU: 2 PID: 0 Comm: swapper/2 Tainted: G D W 4.3.0-rc6-next-20151022ajb-00001-g32f3386-dirty #3
Hardware name: linux,dummy-virt (DT)
[akpm@linux-foundation.org: fix fat-fingered merge resolution]
Signed-off-by: yalin wang <yalin.wang2010@gmail.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/huge_memory.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 2d1ffe9d0e26..fd3a07b3e6f4 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -2072,7 +2072,7 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, | |||
2072 | if (likely(writable)) { | 2072 | if (likely(writable)) { |
2073 | if (likely(referenced)) { | 2073 | if (likely(referenced)) { |
2074 | result = SCAN_SUCCEED; | 2074 | result = SCAN_SUCCEED; |
2075 | trace_mm_collapse_huge_page_isolate(page_to_pfn(page), none_or_zero, | 2075 | trace_mm_collapse_huge_page_isolate(page, none_or_zero, |
2076 | referenced, writable, result); | 2076 | referenced, writable, result); |
2077 | return 1; | 2077 | return 1; |
2078 | } | 2078 | } |
@@ -2082,7 +2082,7 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, | |||
2082 | 2082 | ||
2083 | out: | 2083 | out: |
2084 | release_pte_pages(pte, _pte); | 2084 | release_pte_pages(pte, _pte); |
2085 | trace_mm_collapse_huge_page_isolate(page_to_pfn(page), none_or_zero, | 2085 | trace_mm_collapse_huge_page_isolate(page, none_or_zero, |
2086 | referenced, writable, result); | 2086 | referenced, writable, result); |
2087 | return 0; | 2087 | return 0; |
2088 | } | 2088 | } |
@@ -2580,7 +2580,7 @@ out_unmap: | |||
2580 | collapse_huge_page(mm, address, hpage, vma, node); | 2580 | collapse_huge_page(mm, address, hpage, vma, node); |
2581 | } | 2581 | } |
2582 | out: | 2582 | out: |
2583 | trace_mm_khugepaged_scan_pmd(mm, page_to_pfn(page), writable, referenced, | 2583 | trace_mm_khugepaged_scan_pmd(mm, page, writable, referenced, |
2584 | none_or_zero, result); | 2584 | none_or_zero, result); |
2585 | return ret; | 2585 | return ret; |
2586 | } | 2586 | } |