Commit 79ae2cb8 authored by Paolo 'Blaisorblade' Giarrusso's avatar Paolo 'Blaisorblade' Giarrusso Committed by Linus Torvalds

[PATCH] uml: use GFP_ATOMIC for allocations under spinlocks.

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: default avatarPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Jeff Dike <jdike@addtoit.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 46db4a42
...@@ -465,7 +465,7 @@ static struct chan *parse_chan(char *str, int pri, int device, ...@@ -465,7 +465,7 @@ static struct chan *parse_chan(char *str, int pri, int device,
data = (*ops->init)(str, device, opts); data = (*ops->init)(str, device, opts);
if(data == NULL) return(NULL); if(data == NULL) return(NULL);
chan = kmalloc(sizeof(*chan), GFP_KERNEL); chan = kmalloc(sizeof(*chan), GFP_ATOMIC);
if(chan == NULL) return(NULL); if(chan == NULL) return(NULL);
*chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list),
.primary = 1, .primary = 1,
......
...@@ -340,7 +340,7 @@ static int setup_initial_poll(int fd) ...@@ -340,7 +340,7 @@ static int setup_initial_poll(int fd)
{ {
struct pollfd *p; struct pollfd *p;
p = um_kmalloc(sizeof(struct pollfd)); p = um_kmalloc_atomic(sizeof(struct pollfd));
if(p == NULL){ if(p == NULL){
printk("setup_initial_poll : failed to allocate poll\n"); printk("setup_initial_poll : failed to allocate poll\n");
return(-1); return(-1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment