diff -urN atomic-alloc-ref/fs/buffer.c atomic-alloc/fs/buffer.c --- atomic-alloc-ref/fs/buffer.c Thu Sep 20 01:44:06 2001 +++ atomic-alloc/fs/buffer.c Thu Sep 20 20:00:42 2001 @@ -2613,7 +2613,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)) { if (sync_page_buffers(bh, gfp_mask)) { /* 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 Thu Sep 20 20:00:21 2001 +++ atomic-alloc/include/linux/sched.h Thu Sep 20 20:01:06 2001 @@ -408,18 +408,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_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_USEDFPU 0x00100000 /* task used FPU this quantum (SMP) */ /* * Ptrace flags diff -urN atomic-alloc-ref/mm/slab.c atomic-alloc/mm/slab.c --- atomic-alloc-ref/mm/slab.c Thu Sep 20 01:44:20 2001 +++ atomic-alloc/mm/slab.c Thu Sep 20 20:00:42 2001 @@ -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))