diff -urN atomic-alloc-ref/fs/buffer.c atomic-alloc/fs/buffer.c --- atomic-alloc-ref/fs/buffer.c Wed Aug 29 14:48:50 2001 +++ atomic-alloc/fs/buffer.c Wed Aug 29 14:49:41 2001 @@ -2612,7 +2612,7 @@ spin_unlock(&free_list[index].lock); write_unlock(&hash_table_lock); spin_unlock(&lru_list_lock); - if (gfp_mask & __GFP_IO) { + if (gfp_mask & __GFP_IO && !(current->flags & PF_ATOMICALLOC)) { if (!(gfp_mask & __GFP_HIGHIO) && PageHighMem(page)) return 0; sync_page_buffers(bh, gfp_mask); diff -urN atomic-alloc-ref/include/linux/sched.h atomic-alloc/include/linux/sched.h --- atomic-alloc-ref/include/linux/sched.h Wed Aug 29 14:48:50 2001 +++ atomic-alloc/include/linux/sched.h Wed Aug 29 14:49:06 2001 @@ -409,17 +409,14 @@ /* * 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_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 */ /* * Ptrace flags diff -urN atomic-alloc-ref/mm/page_alloc.c atomic-alloc/mm/page_alloc.c --- atomic-alloc-ref/mm/page_alloc.c Wed Aug 29 14:48:49 2001 +++ atomic-alloc/mm/page_alloc.c Wed Aug 29 14:49:06 2001 @@ -372,7 +372,7 @@ * able to free some memory we can't free ourselves */ wakeup_kswapd(); - if (gfp_mask & __GFP_WAIT) { + if (gfp_mask & __GFP_WAIT && !(current->flags & PF_ATOMICALLOC)) { __set_current_state(TASK_RUNNING); current->policy |= SCHED_YIELD; schedule(); diff -urN atomic-alloc-ref/mm/slab.c atomic-alloc/mm/slab.c --- atomic-alloc-ref/mm/slab.c Wed Aug 29 14:48:49 2001 +++ atomic-alloc/mm/slab.c Wed Aug 29 14:49:06 2001 @@ -1683,7 +1683,7 @@ unsigned int best_len; unsigned int scan; - 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))