diff -urN atomic-alloc-ref/fs/buffer.c atomic-alloc/fs/buffer.c --- atomic-alloc-ref/fs/buffer.c Wed Jan 2 02:30:43 2002 +++ atomic-alloc/fs/buffer.c Wed Jan 2 02:31:21 2002 @@ -2548,7 +2548,7 @@ write_unlock(&hash_table_lock); spin_unlock(&lru_list_lock); gfp_mask = pf_gfp_mask(gfp_mask); - if (gfp_mask & __GFP_IO) { + if (gfp_mask & __GFP_IO && !(current->flags & PF_ATOMICALLOC)) { if ((gfp_mask & __GFP_HIGHIO) || !PageHighMem(page)) { if (sync_page_buffers(bh)) { /* no IO or waiting next time */ diff -urN atomic-alloc-ref/include/linux/sched.h atomic-alloc/include/linux/sched.h --- atomic-alloc-ref/include/linux/sched.h Wed Jan 2 02:30:43 2002 +++ atomic-alloc/include/linux/sched.h Wed Jan 2 02:31:42 2002 @@ -427,19 +427,16 @@ /* * Per process flags */ -#define PF_ALIGNWARN 0x00000001 /* Print alignment warning msgs */ - /* Not implemented yet, only for 486*/ -#define PF_STARTING 0x00000002 /* being created */ -#define PF_EXITING 0x00000004 /* getting shut down */ -#define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */ -#define PF_SUPERPRIV 0x00000100 /* used super-user privileges */ -#define PF_DUMPCORE 0x00000200 /* dumped core */ -#define PF_SIGNALED 0x00000400 /* killed by a signal */ -#define PF_MEMALLOC 0x00000800 /* Allocating memory */ -#define PF_FREE_PAGES 0x00002000 /* per process page freeing */ -#define PF_NOIO 0x00004000 /* avoid generating further I/O */ - -#define PF_USEDFPU 0x00100000 /* task used FPU this quantum (SMP) */ +#define PF_EXITING (1UL<<0) /* getting shut down */ +#define PF_FORKNOEXEC (1UL<<1) /* forked but didn't exec */ +#define PF_SUPERPRIV (1UL<<2) /* used super-user privileges */ +#define PF_DUMPCORE (1UL<<3) /* dumped core */ +#define PF_SIGNALED (1UL<<4) /* killed by a signal */ +#define PF_MEMALLOC (1UL<<5) /* Allocating memory */ +#define PF_USEDFPU (1UL<<6) /* task used FPU this quantum (SMP) */ +#define PF_ATOMICALLOC (1UL<<7) /* do not block during memalloc */ +#define PF_FREE_PAGES (1UL<<8) /* per process page freeing */ +#define PF_NOIO (1UL<<9) /* avoid generating further I/O */ /* * Ptrace flags diff -urN atomic-alloc-ref/mm/slab.c atomic-alloc/mm/slab.c --- atomic-alloc-ref/mm/slab.c Wed Jan 2 02:30:43 2002 +++ atomic-alloc/mm/slab.c Wed Jan 2 02:31:21 2002 @@ -1715,7 +1715,7 @@ unsigned int scan; int ret = 0; - if (gfp_mask & __GFP_WAIT) + if (gfp_mask & __GFP_WAIT && !(current->flags & PF_ATOMICALLOC)) down(&cache_chain_sem); else if (down_trylock(&cache_chain_sem))