Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -465,7 +465,7 @@ static struct chan *parse_chan(char *str, int pri, int device,
	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,
+1 −1
Original line number Diff line number Diff line
@@ -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);