|
@@ -1412,7 +1412,8 @@ static void apic_pending_intr_clear(void)
|
|
{
|
|
{
|
|
long long max_loops = cpu_khz ? cpu_khz : 1000000;
|
|
long long max_loops = cpu_khz ? cpu_khz : 1000000;
|
|
unsigned long long tsc = 0, ntsc;
|
|
unsigned long long tsc = 0, ntsc;
|
|
- unsigned int value, queued;
|
|
|
|
|
|
+ unsigned int queued;
|
|
|
|
+ unsigned long value;
|
|
int i, j, acked = 0;
|
|
int i, j, acked = 0;
|
|
|
|
|
|
if (boot_cpu_has(X86_FEATURE_TSC))
|
|
if (boot_cpu_has(X86_FEATURE_TSC))
|
|
@@ -1435,24 +1436,22 @@ static void apic_pending_intr_clear(void)
|
|
|
|
|
|
for (i = APIC_ISR_NR - 1; i >= 0; i--) {
|
|
for (i = APIC_ISR_NR - 1; i >= 0; i--) {
|
|
value = apic_read(APIC_ISR + i*0x10);
|
|
value = apic_read(APIC_ISR + i*0x10);
|
|
- for (j = 31; j >= 0; j--) {
|
|
|
|
- if (value & (1<<j)) {
|
|
|
|
- ack_APIC_irq();
|
|
|
|
- acked++;
|
|
|
|
- }
|
|
|
|
|
|
+ for_each_set_bit(j, &value, 32) {
|
|
|
|
+ ack_APIC_irq();
|
|
|
|
+ acked++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (acked > 256) {
|
|
if (acked > 256) {
|
|
- printk(KERN_ERR "LAPIC pending interrupts after %d EOI\n",
|
|
|
|
- acked);
|
|
|
|
|
|
+ pr_err("LAPIC pending interrupts after %d EOI\n", acked);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
if (queued) {
|
|
if (queued) {
|
|
if (boot_cpu_has(X86_FEATURE_TSC) && cpu_khz) {
|
|
if (boot_cpu_has(X86_FEATURE_TSC) && cpu_khz) {
|
|
ntsc = rdtsc();
|
|
ntsc = rdtsc();
|
|
max_loops = (cpu_khz << 10) - (ntsc - tsc);
|
|
max_loops = (cpu_khz << 10) - (ntsc - tsc);
|
|
- } else
|
|
|
|
|
|
+ } else {
|
|
max_loops--;
|
|
max_loops--;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
} while (queued && max_loops > 0);
|
|
} while (queued && max_loops > 0);
|
|
WARN_ON(max_loops <= 0);
|
|
WARN_ON(max_loops <= 0);
|