|
@@ -1163,14 +1163,15 @@ u8 irq_vector[NR_IRQ_VECTORS] __read_mostly = { FIRST_DEVICE_VECTOR , 0 };
|
|
int assign_irq_vector(int irq)
|
|
int assign_irq_vector(int irq)
|
|
{
|
|
{
|
|
static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
|
|
static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
|
|
|
|
+ unsigned long flags;
|
|
int vector;
|
|
int vector;
|
|
|
|
|
|
BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
|
|
BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
|
|
|
|
|
|
- spin_lock(&vector_lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&vector_lock, flags);
|
|
|
|
|
|
if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
|
|
if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
|
|
- spin_unlock(&vector_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&vector_lock, flags);
|
|
return IO_APIC_VECTOR(irq);
|
|
return IO_APIC_VECTOR(irq);
|
|
}
|
|
}
|
|
next:
|
|
next:
|
|
@@ -1181,7 +1182,7 @@ next:
|
|
if (current_vector >= FIRST_SYSTEM_VECTOR) {
|
|
if (current_vector >= FIRST_SYSTEM_VECTOR) {
|
|
offset++;
|
|
offset++;
|
|
if (!(offset%8)) {
|
|
if (!(offset%8)) {
|
|
- spin_unlock(&vector_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&vector_lock, flags);
|
|
return -ENOSPC;
|
|
return -ENOSPC;
|
|
}
|
|
}
|
|
current_vector = FIRST_DEVICE_VECTOR + offset;
|
|
current_vector = FIRST_DEVICE_VECTOR + offset;
|
|
@@ -1192,7 +1193,7 @@ next:
|
|
if (irq != AUTO_ASSIGN)
|
|
if (irq != AUTO_ASSIGN)
|
|
IO_APIC_VECTOR(irq) = vector;
|
|
IO_APIC_VECTOR(irq) = vector;
|
|
|
|
|
|
- spin_unlock(&vector_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&vector_lock, flags);
|
|
|
|
|
|
return vector;
|
|
return vector;
|
|
}
|
|
}
|