[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: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Cc: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
46db4a42dd
commit
79ae2cb856
@@ -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)
|
|||||||
{
|
{
|
||||||
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);
|
||||||
|
Reference in New Issue
Block a user