Skip to contentSkip to conversation

linux 2.6.18: kill unneeded vector_lock

PATCH In review Jan Beulich 2 participants 2 messages Mar 5, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 5/10 linux 2.6.18: kill unneeded vector_lock

Slim down again the implementation on assign_irq_vector, as under Xen all serialization is done in the hypervisor.

arch/i386/kernel/io_apic-xen.c +5 -17
Index: head-2007-02-27/arch/i386/kernel/io_apic-xen.c
===================================================================
@@ -90,7 +90,6 @@ atomic_t irq_mis_count;
 static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
 
 static DEFINE_SPINLOCK(ioapic_lock);
-static DEFINE_SPINLOCK(vector_lock);
 
 int timer_over_8254 __initdata = 1;
 
@@ -1209,33 +1208,22 @@ u8 irq_vector[NR_IRQ_VECTORS] __read_mos
 
 int assign_irq_vector(int irq)
 {
-	unsigned long flags;
-	int vector;
 	struct physdev_irq irq_op;
 
 	BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
 
-	spin_lock_irqsave(&vector_lock, flags);
-
-	if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-		spin_unlock_irqrestore(&vector_lock, flags);
+	if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
 		return IO_APIC_VECTOR(irq);
-	}
 
 	irq_op.irq = irq;
-	if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-		spin_unlock_irqrestore(&vector_lock, flags);
+	if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
 		return -ENOSPC;
-	}
 
-	vector = irq_op.vector;
-	vector_irq[vector] = irq;
+	vector_irq[irq_op.vector] = irq;
 	if (irq != AUTO_ASSIGN)
-		IO_APIC_VECTOR(irq) = vector;
-
-	spin_unlock_irqrestore(&vector_lock, flags);
+		IO_APIC_VECTOR(irq) = irq_op.vector;
 
-	return vector;
+	return irq_op.vector;
 }
 
 #ifndef CONFIG_XEN
arch/x86_64/kernel/io_apic-xen.c +5 -17
Index: head-2007-02-27/arch/x86_64/kernel/io_apic-xen.c
===================================================================
@@ -58,7 +58,6 @@ static struct { int pin, apic; } ioapic_
 #endif
 
 static DEFINE_SPINLOCK(ioapic_lock);
-static DEFINE_SPINLOCK(vector_lock);
 
 /*
  * # of IRQ routing registers
@@ -888,33 +887,22 @@ u8 irq_vector[NR_IRQ_VECTORS] __read_mos
 
 int assign_irq_vector(int irq)
 {
-	unsigned long flags;
-	int vector;
 	struct physdev_irq irq_op;
   
   	BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
 
-	spin_lock_irqsave(&vector_lock, flags);
-
-  	if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-		spin_unlock_irqrestore(&vector_lock, flags);
+  	if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
   		return IO_APIC_VECTOR(irq);
-	}
 
 	irq_op.irq = irq;
-	if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-		spin_unlock_irqrestore(&vector_lock, flags);
+	if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
 		return -ENOSPC;
-	}
 
-	vector = irq_op.vector;
-	vector_irq[vector] = irq;
+	vector_irq[irq_op.vector] = irq;
 	if (irq != AUTO_ASSIGN)
-		IO_APIC_VECTOR(irq) = vector;
-
-	spin_unlock_irqrestore(&vector_lock, flags);
+		IO_APIC_VECTOR(irq) = irq_op.vector;
 
-	return vector;
+	return irq_op.vector;
 }
 
 extern void (*interrupt[NR_IRQS])(void);
#1 lore raw
Quoted 4 lines · Jan Beulich

Slim down again the implementation on assign_irq_vector, as under Xen all serialization is done in the hypervisor.

Takes us further from native for no benefit (not a hot path).

-- Keir