Merge branch 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / arch / x86 / kernel / irq.c
index 49bbb57da7f581666b06f8db4f5e5a6b6a2f307e..922d285810246aaf4382104d01be52cf6cf31767 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/idle.h>
 #include <asm/mce.h>
 #include <asm/hw_irq.h>
+#include <asm/desc.h>
 
 #define CREATE_TRACE_POINTS
 #include <asm/trace/irq_vectors.h>
@@ -334,10 +335,17 @@ int check_irq_vectors_for_cpu_disable(void)
        for_each_online_cpu(cpu) {
                if (cpu == this_cpu)
                        continue;
-               for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS;
-                    vector++) {
-                       if (per_cpu(vector_irq, cpu)[vector] < 0)
-                               count++;
+               /*
+                * We scan from FIRST_EXTERNAL_VECTOR to first system
+                * vector. If the vector is marked in the used vectors
+                * bitmap or an irq is assigned to it, we don't count
+                * it as available.
+                */
+               for (vector = FIRST_EXTERNAL_VECTOR;
+                    vector < first_system_vector; vector++) {
+                       if (!test_bit(vector, used_vectors) &&
+                           per_cpu(vector_irq, cpu)[vector] < 0)
+                                       count++;
                }
        }