lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 8 Mar 2010 14:34:52 +0300 From: Cyrill Gorcunov <gorcunov@...il.com> To: Thomas Renninger <trenn@...e.de> Cc: linux-kernel@...r.kernel.org, Kerstin Jonsson <kerstin.jonsson@...csson.com>, jbohac@...ell.com, Yinghai Lu <yinghai@...nel.org>, akpm@...ux-foundation.org, mingo@...e.hu, Avi Kivity <avi@...hat.com> Subject: Re: [PATCH] x86 apic: Ack all pending irqs when crashed/on kexec On Mon, Mar 08, 2010 at 12:17:10PM +0100, Thomas Renninger wrote: ... > diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c > index 3987e44..93cdb2a 100644 > --- a/arch/x86/kernel/apic/apic.c > +++ b/arch/x86/kernel/apic/apic.c > @@ -51,6 +51,7 @@ > #include <asm/smp.h> > #include <asm/mce.h> > #include <asm/kvm_para.h> > +#include <asm/tsc.h> > > unsigned int num_processors; > > @@ -1151,8 +1152,12 @@ static void __cpuinit lapic_setup_esr(void) > */ > void __cpuinit setup_local_APIC(void) > { > - unsigned int value; > - int i, j; > + unsigned int value, queued; > + int i, j, acked = 0; > + unsigned long long tsc = 0, ntsc, max_loops = cpu_khz; > + > + if (cpu_has_tsc) > + rdtscll(ntsc); Perhaps rdtscll(tsc)? > > if (disable_apic) { > arch_disable_smp_support(); > @@ -1204,13 +1209,32 @@ void __cpuinit setup_local_APIC(void) > * the interrupt. Hence a vector might get locked. It was noticed > * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. > */ > - for (i = APIC_ISR_NR - 1; i >= 0; i--) { > - value = apic_read(APIC_ISR + i*0x10); > - for (j = 31; j >= 0; j--) { > - if (value & (1<<j)) > - ack_APIC_irq(); > - } > - } > + do { > + queued = 0; > + for (i = APIC_ISR_NR - 1; i >= 0; i--) > + queued |= apic_read(APIC_IRR + i*0x10); > + > + for (i = APIC_ISR_NR - 1; i >= 0; i--) { > + value = apic_read(APIC_ISR + i*0x10); > + for (j = 31; j >= 0; j--) { > + if (value & (1<<j)) { > + ack_APIC_irq(); > + acked++; > + } > + } > + } > + if (acked > 256) { > + printk(KERN_ERR "LAPIC pending interrupts after %d EOI\n", > + acked); > + break; > + } > + if (cpu_has_tsc) { > + rdtscll(ntsc); > + max_loops = (cpu_khz << 10) - (ntsc - tsc); Where is tsc modified? It remains tsc = 0 all the time? Or I miss the snippet where it is set? > + } else > + max_loops--; > + } while (queued && max_loops > 0); > + WARN_ON(!max_loops); > > /* > * Now that we are all set up, enable the APIC > -- > 1.6.3 > -- Cyrill -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists