diff options
authorKan Liang <>2017-08-02 13:32:27 -0700
committerLinus Torvalds <>2017-08-02 17:16:13 -0700
commit1ee1c3f5b5cff959e0ac95a125bd15eaf88cc638 (patch)
parent5a18b64e3f02125be1c0ef777501ae38aafe2a24 (diff)
mm: allow page_cache_get_speculative in interrupt context
Kernel panic when calling the IRQ-safe __get_user_pages_fast in NMI handler. The bug was introduced by commit 2947ba054a4d ("x86/mm/gup: Switch GUP to the generic get_user_page_fast() implementation"). The original x86 __get_user_page_fast used plain get_page() or page_ref_add(). However, the generic __get_user_page_fast uses page_cache_get_speculative(), which has VM_BUG_ON(in_interrupt()). There is no reason to prevent page_cache_get_speculative from using in interrupt context. According to the author, putting a BUG_ON there is just because the code is not verifying correctness of interrupt races. I did some tests in interrupt context. There is no issue found. Removing VM_BUG_ON(in_interrupt()) for page_cache_get_speculative(). Link: Fixes: 2947ba054a4d ("x86/mm/gup: Switch GUP to the generic get_user_page_fast() implementation") Signed-off-by: Kan Liang <> Cc: Jens Axboe <> Cc: Al Viro <> Cc: Kirill A. Shutemov <> Cc: Ying Huang <> Cc: Nicholas Piggin <> Cc: Ingo Molnar <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
1 files changed, 0 insertions, 2 deletions
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index baa9344dcd10..79b36f57c3ba 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -163,8 +163,6 @@ void release_pages(struct page **pages, int nr, bool cold);
static inline int page_cache_get_speculative(struct page *page)
- VM_BUG_ON(in_interrupt());
VM_BUG_ON(!in_atomic() && !irqs_disabled());