hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/uio/uio_dmem_genirq.c
....@@ -110,8 +110,10 @@
110110 * remember the state so we can allow user space to enable it later.
111111 */
112112
113
+ spin_lock(&priv->lock);
113114 if (!test_and_set_bit(0, &priv->flags))
114115 disable_irq_nosync(irq);
116
+ spin_unlock(&priv->lock);
115117
116118 return IRQ_HANDLED;
117119 }
....@@ -125,20 +127,19 @@
125127 * in the interrupt controller, but keep track of the
126128 * state to prevent per-irq depth damage.
127129 *
128
- * Serialize this operation to support multiple tasks.
130
+ * Serialize this operation to support multiple tasks and concurrency
131
+ * with irq handler on SMP systems.
129132 */
130133
131134 spin_lock_irqsave(&priv->lock, flags);
132135 if (irq_on) {
133136 if (test_and_clear_bit(0, &priv->flags))
134137 enable_irq(dev_info->irq);
135
- spin_unlock_irqrestore(&priv->lock, flags);
136138 } else {
137
- if (!test_and_set_bit(0, &priv->flags)) {
138
- spin_unlock_irqrestore(&priv->lock, flags);
139
- disable_irq(dev_info->irq);
140
- }
139
+ if (!test_and_set_bit(0, &priv->flags))
140
+ disable_irq_nosync(dev_info->irq);
141141 }
142
+ spin_unlock_irqrestore(&priv->lock, flags);
142143
143144 return 0;
144145 }