--- linux-2.4.22/drivers/md/dm-ioctl.c Wed Nov 19 13:59:45 2003 +++ linux/drivers/md/dm-ioctl.c Wed Nov 19 14:00:03 2003 @@ -1178,19 +1178,11 @@ } /* - * FIXME: I don't like this, we're trying to avoid low - * memory issues when a device is suspended. - */ - current->flags |= PF_MEMALLOC; - - /* * Copy the parameters into kernel space. */ r = copy_params(user, ¶m); - if (r) { - current->flags &= ~PF_MEMALLOC; + if (r) return r; - } r = validate_params(cmd, param); if (r) @@ -1208,7 +1200,6 @@ out: free_params(param); - current->flags &= ~PF_MEMALLOC; return r; } --- linux-2.4.22/include/asm-alpha/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-alpha/mman.h Wed Nov 19 14:00:03 2003 @@ -30,6 +30,7 @@ #define MCL_CURRENT 8192 /* lock all currently mapped pages */ #define MCL_FUTURE 16384 /* lock all additions to address space */ +#define MCL_MEMALLOC 32768 /* allow allocation of reserved memory */ #define MADV_NORMAL 0 /* no further special treatment */ #define MADV_RANDOM 1 /* expect random page references */ --- linux-2.4.22/include/asm-arm/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-arm/mman.h Wed Nov 19 14:00:03 2003 @@ -24,6 +24,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-cris/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-cris/mman.h Wed Nov 19 14:00:03 2003 @@ -26,6 +26,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-i386/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-i386/mman.h Wed Nov 19 14:00:03 2003 @@ -24,6 +24,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-ia64/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-ia64/mman.h Wed Nov 19 14:00:03 2003 @@ -32,6 +32,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-m68k/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-m68k/mman.h Wed Nov 19 14:00:03 2003 @@ -24,6 +24,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-mips/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-mips/mman.h Wed Nov 19 14:00:03 2003 @@ -55,6 +55,7 @@ */ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-mips64/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-mips64/mman.h Wed Nov 19 14:00:03 2003 @@ -53,6 +53,7 @@ */ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-parisc/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-parisc/mman.h Wed Nov 19 14:00:03 2003 @@ -24,6 +24,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0 /* no further special treatment */ #define MADV_RANDOM 1 /* expect random page references */ --- linux-2.4.22/include/asm-ppc/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-ppc/mman.h Wed Nov 19 14:00:03 2003 @@ -25,6 +25,7 @@ #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ +#define MCL_MEMALLOC 0x8000 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-ppc64/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-ppc64/mman.h Wed Nov 19 14:00:03 2003 @@ -31,6 +31,7 @@ #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ +#define MCL_MEMALLOC 0x8000 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-s390/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-s390/mman.h Wed Nov 19 14:00:03 2003 @@ -32,6 +32,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-s390x/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-s390x/mman.h Wed Nov 19 14:00:03 2003 @@ -32,6 +32,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-sh/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-sh/mman.h Wed Nov 19 14:00:03 2003 @@ -24,6 +24,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/include/asm-sparc/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-sparc/mman.h Wed Nov 19 14:00:03 2003 @@ -30,6 +30,7 @@ #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ +#define MCL_MEMALLOC 0x8000 /* allow allocation of reserved memory */ /* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system * XXX calls. --- linux-2.4.22/include/asm-sparc64/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-sparc64/mman.h Wed Nov 19 14:00:03 2003 @@ -30,6 +30,7 @@ #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ +#define MCL_MEMALLOC 0x8000 /* allow allocation of reserved memory */ /* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system * XXX calls. --- linux-2.4.22/include/asm-x86_64/mman.h Wed Nov 19 13:59:45 2003 +++ linux/include/asm-x86_64/mman.h Wed Nov 19 14:00:03 2003 @@ -25,6 +25,7 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MCL_MEMALLOC 4 /* allow allocation of reserved memory */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ --- linux-2.4.22/mm/mlock.c Wed Nov 19 13:59:45 2003 +++ linux/mm/mlock.c Wed Nov 19 14:00:03 2003 @@ -244,6 +244,11 @@ if (!capable(CAP_IPC_LOCK)) return -EPERM; + if (flags & MCL_MEMALLOC) + current->flags |= PF_MEMALLOC; + else + current->flags &= ~PF_MEMALLOC; + def_flags = 0; if (flags & MCL_FUTURE) def_flags = VM_LOCKED; @@ -269,7 +274,7 @@ int ret = -EINVAL; down_write(¤t->mm->mmap_sem); - if (!flags || (flags & ~(MCL_CURRENT | MCL_FUTURE))) + if (!flags || (flags & ~(MCL_CURRENT | MCL_FUTURE | MCL_MEMALLOC))) goto out; lock_limit = current->rlim[RLIMIT_MEMLOCK].rlim_cur; --- linux-2.4.22/mm/oom_kill.c Wed Nov 19 13:59:45 2003 +++ linux/mm/oom_kill.c Wed Nov 19 14:06:52 2003 @@ -65,6 +65,12 @@ if (p->flags & PF_MEMDIE) return 0; + /* + * The system's likely doomed if we have to kill a PF_MEMALLOC process. + */ + if (p->flags & PF_MEMALLOC) + return 1; + /* * The memory size of the process is the basis for the badness. */ --- linux-2.4.22/mm/page_alloc.c Wed Nov 19 13:59:45 2003 +++ linux/mm/page_alloc.c Wed Nov 19 14:00:03 2003 @@ -254,6 +254,7 @@ { struct page * page = NULL; int __freed = 0; + unsigned long pf_memalloc; if (!(gfp_mask & __GFP_WAIT)) goto out; @@ -261,11 +262,12 @@ BUG(); current->allocation_order = order; + pf_memalloc = current->flags & PF_MEMALLOC; current->flags |= PF_MEMALLOC | PF_FREE_PAGES; __freed = try_to_free_pages_zone(classzone, gfp_mask); - current->flags &= ~(PF_MEMALLOC | PF_FREE_PAGES); + current->flags &= ~(PF_MEMALLOC | PF_FREE_PAGES) | pf_memalloc; if (current->nr_local_pages) { struct list_head * entry, * local_pages;