From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763370AbXHFKox (ORCPT ); Mon, 6 Aug 2007 06:44:53 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932249AbXHFKod (ORCPT ); Mon, 6 Aug 2007 06:44:33 -0400 Received: from mx1.redhat.com ([66.187.233.31]:57491 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932203AbXHFKoc (ORCPT ); Mon, 6 Aug 2007 06:44:32 -0400 Message-Id: <20070806103659.119700000@chello.nl> References: <20070806102922.907530000@chello.nl> User-Agent: quilt/0.45-1 Date: Mon, 06 Aug 2007 12:29:29 +0200 From: Peter Zijlstra To: linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: Peter Zijlstra , David Miller , Andrew Morton , Daniel Phillips , Pekka Enberg , Christoph Lameter , Matt Mackall , Lee Schermerhorn , Steve Dickson Subject: [PATCH 07/10] mm: allow PF_MEMALLOC from softirq context Content-Disposition: inline; filename=mm-PF_MEMALLOC-softirq.patch Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Allow PF_MEMALLOC to be set in softirq context. When running softirqs from a borrowed context save current->flags, ksoftirqd will have its own task_struct. Signed-off-by: Peter Zijlstra --- include/linux/sched.h | 4 ++++ kernel/softirq.c | 3 +++ mm/page_alloc.c | 7 ++++--- 3 files changed, 11 insertions(+), 3 deletions(-) Index: linux-2.6-2/mm/page_alloc.c =================================================================== --- linux-2.6-2.orig/mm/page_alloc.c +++ linux-2.6-2/mm/page_alloc.c @@ -1239,9 +1239,10 @@ int gfp_to_alloc_flags(gfp_t gfp_mask) alloc_flags |= ALLOC_HARDER; if (likely(!(gfp_mask & __GFP_NOMEMALLOC))) { - if (!in_interrupt() && - ((p->flags & PF_MEMALLOC) || - unlikely(test_thread_flag(TIF_MEMDIE)))) + if (!in_irq() && (p->flags & PF_MEMALLOC)) + alloc_flags |= ALLOC_NO_WATERMARKS; + else if (!in_interrupt() && + unlikely(test_thread_flag(TIF_MEMDIE))) alloc_flags |= ALLOC_NO_WATERMARKS; } Index: linux-2.6-2/kernel/softirq.c =================================================================== --- linux-2.6-2.orig/kernel/softirq.c +++ linux-2.6-2/kernel/softirq.c @@ -211,6 +211,8 @@ asmlinkage void __do_softirq(void) __u32 pending; int max_restart = MAX_SOFTIRQ_RESTART; int cpu; + unsigned long pflags = current->flags; + current->flags &= ~PF_MEMALLOC; pending = local_softirq_pending(); account_system_vtime(current); @@ -249,6 +251,7 @@ restart: account_system_vtime(current); _local_bh_enable(); + tsk_restore_flags(current, pflags, PF_MEMALLOC); } #ifndef __ARCH_HAS_DO_SOFTIRQ Index: linux-2.6-2/include/linux/sched.h =================================================================== --- linux-2.6-2.orig/include/linux/sched.h +++ linux-2.6-2/include/linux/sched.h @@ -1336,6 +1336,10 @@ static inline void put_task_struct(struc #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) #define used_math() tsk_used_math(current) +#define tsk_restore_flags(p, pflags, mask) \ + do { (p)->flags &= ~(mask); \ + (p)->flags |= ((pflags) & (mask)); } while (0) + #ifdef CONFIG_SMP extern int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask); #else --