From: Andrew Morton prep_zero_page() uses KM_USER0 and hence may not be used from IRQ context, at least for highmem pages. Cc: Nick Piggin Cc: Christoph Lameter Signed-off-by: Andrew Morton --- mm/page_alloc.c | 5 +++++ 1 files changed, 5 insertions(+) diff -puN mm/page_alloc.c~mm-prep_zero_page-in-irq-is-a-bug mm/page_alloc.c --- devel/mm/page_alloc.c~mm-prep_zero_page-in-irq-is-a-bug 2006-02-19 20:23:00.000000000 -0800 +++ devel-akpm/mm/page_alloc.c 2006-02-19 20:24:48.000000000 -0800 @@ -217,6 +217,11 @@ static inline void prep_zero_page(struct int i; BUG_ON((gfp_flags & (__GFP_WAIT | __GFP_HIGHMEM)) == __GFP_HIGHMEM); + /* + * clear_highpage() will use KM_USER0, so it's a bug to use __GFP_ZERO + * and __GFP_HIGHMEM from hard or soft interrupt context. + */ + BUG_ON((gfp_flags & __GFP_HIGHMEM) && in_interrupt()); for (i = 0; i < (1 << order); i++) clear_highpage(page + i); } _