Commit 10eabeca authored by Johannes Berg's avatar Johannes Berg
Browse files

um: chan_kern: use raw spinlock for irqs_to_free_lock

Since this is called deep in the ARCH=um IRQ infrastructure
it must use a raw spinlock. It's not really part of the
driver, but rather the core UML IRQ code.

Link: https://patch.msgid.link/20250505103358.ae7dc659f8b4.I64ca7aece30e0b4b0b5b35ad89cdd63db197c0ce@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent bb13e79c
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ int enable_chan(struct line *line)
 * be permanently disabled.  This is discovered in IRQ context, but
 * the freeing of the IRQ must be done later.
 */
static DEFINE_SPINLOCK(irqs_to_free_lock);
static DEFINE_RAW_SPINLOCK(irqs_to_free_lock);
static LIST_HEAD(irqs_to_free);

void free_irqs(void)
@@ -222,9 +222,9 @@ void free_irqs(void)
	struct list_head *ele;
	unsigned long flags;

	spin_lock_irqsave(&irqs_to_free_lock, flags);
	raw_spin_lock_irqsave(&irqs_to_free_lock, flags);
	list_splice_init(&irqs_to_free, &list);
	spin_unlock_irqrestore(&irqs_to_free_lock, flags);
	raw_spin_unlock_irqrestore(&irqs_to_free_lock, flags);

	list_for_each(ele, &list) {
		chan = list_entry(ele, struct chan, free_list);
@@ -246,9 +246,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
		return;

	if (delay_free_irq) {
		spin_lock_irqsave(&irqs_to_free_lock, flags);
		raw_spin_lock_irqsave(&irqs_to_free_lock, flags);
		list_add(&chan->free_list, &irqs_to_free);
		spin_unlock_irqrestore(&irqs_to_free_lock, flags);
		raw_spin_unlock_irqrestore(&irqs_to_free_lock, flags);
	} else {
		if (chan->input && chan->enabled)
			um_free_irq(chan->line->read_irq, chan);