From: Paolo 'Blaisorblade' Giarrusso setup_initial_poll is only called with sigio_lock() held, so use appropriate allocation. Also, parse_chan() can also be called when holding a spinlock (see line_open() -> parse_chan_pair()). I have sporadic problems (spinlock taken twice, with spinlock debugging on UP) which could be caused by a sequence like "take spinlock, alloc and go to sleep, take again the spinlock in the other thread". Signed-off-by: Paolo 'Blaisorblade' Giarrusso Cc: Jeff Dike Signed-off-by: Andrew Morton --- arch/um/drivers/chan_kern.c | 2 +- arch/um/kernel/sigio_user.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff -puN arch/um/drivers/chan_kern.c~uml-use-gfp_atomic-for-allocations-under-spinlocks arch/um/drivers/chan_kern.c --- devel/arch/um/drivers/chan_kern.c~uml-use-gfp_atomic-for-allocations-under-spinlocks 2005-09-21 12:53:02.000000000 -0700 +++ devel-akpm/arch/um/drivers/chan_kern.c 2005-09-21 12:53:02.000000000 -0700 @@ -465,7 +465,7 @@ static struct chan *parse_chan(char *str data = (*ops->init)(str, device, opts); if(data == NULL) return(NULL); - chan = kmalloc(sizeof(*chan), GFP_KERNEL); + chan = kmalloc(sizeof(*chan), GFP_ATOMIC); if(chan == NULL) return(NULL); *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), .primary = 1, diff -puN arch/um/kernel/sigio_user.c~uml-use-gfp_atomic-for-allocations-under-spinlocks arch/um/kernel/sigio_user.c --- devel/arch/um/kernel/sigio_user.c~uml-use-gfp_atomic-for-allocations-under-spinlocks 2005-09-21 12:53:02.000000000 -0700 +++ devel-akpm/arch/um/kernel/sigio_user.c 2005-09-21 12:53:02.000000000 -0700 @@ -340,7 +340,7 @@ static int setup_initial_poll(int fd) { struct pollfd *p; - p = um_kmalloc(sizeof(struct pollfd)); + p = um_kmalloc_atomic(sizeof(struct pollfd)); if(p == NULL){ printk("setup_initial_poll : failed to allocate poll\n"); return(-1); _