Skip to content

Commit

Permalink
[PATCH] uml: irq locking fixes
Browse files Browse the repository at this point in the history
As the comment immediately preceding this points out, this list is changed in
irq context, so it needs to be protected with spin_lock_irqsave in process
context when it is processed.

Sometimes, gcc should just compile the comments and forget the code.

The IRQ side of this was better, in the sense that it blocked and unblocked
interrupts, but it still should have saved and restored them.

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Mar 29, 2007
1 parent 602ed87 commit 3076212
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions arch/um/drivers/chan_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,11 @@ void free_irqs(void)
struct chan *chan;
LIST_HEAD(list);
struct list_head *ele;
unsigned long flags;

spin_lock_irq(&irqs_to_free_lock);
spin_lock_irqsave(&irqs_to_free_lock, flags);
list_splice_init(&irqs_to_free, &list);
INIT_LIST_HEAD(&irqs_to_free);
spin_unlock_irq(&irqs_to_free_lock);
spin_unlock_irqrestore(&irqs_to_free_lock, flags);

list_for_each(ele, &list){
chan = list_entry(ele, struct chan, free_list);
Expand All @@ -255,13 +255,15 @@ void free_irqs(void)

static void close_one_chan(struct chan *chan, int delay_free_irq)
{
unsigned long flags;

if(!chan->opened)
return;

if(delay_free_irq){
spin_lock_irq(&irqs_to_free_lock);
spin_lock_irqsave(&irqs_to_free_lock, flags);
list_add(&chan->free_list, &irqs_to_free);
spin_unlock_irq(&irqs_to_free_lock);
spin_unlock_irqrestore(&irqs_to_free_lock, flags);
}
else {
if(chan->input)
Expand Down

0 comments on commit 3076212

Please sign in to comment.