[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC][PATCH] xen/apic: refactor error_interrupt
On 05/05/2015 05:46, Chen, Tiejun wrote: > >> A better approach might be: >> >> printk(KERN_DEBUG "APIC error on CPU%u: %02lx(%02lx)", ...) >> for ( i = (1<<7); i; i >>= 1 ) >> if ( v1 & i ) >> printk(", %s", apic_fault_reasons[i]); > > I guess this should be apic_fault_reasons[ffs(i) - 1]. Indeed. > >> printk("\n"); >> >> Which will decode all set bits, and guarantee not to access outside the >> bounds of apic_fault_reasons. >> > > Thanks you for all comments. So overall, what about this? Much better. A few further comments. > > diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c > index 3217bdf..87684a2 100644 > --- a/xen/arch/x86/apic.c > +++ b/xen/arch/x86/apic.c > @@ -1319,9 +1319,21 @@ out: ; > * This interrupt should never happen with our APIC/SMP architecture > */ > > +static const char * const fault_reasons_from_esr[] = It is not too important, but I was thinking of something rather shorter as a name. "esr_fields[]" perhaps ? > +{ > + "Send CS error", > + "Receive CS error", > + "Send accept error", > + "Receive accept error", > + "Redirectable IPI", > + "Send illegal vector", > + "Received illegal vector", > + "Illegal register address", > +}; > + > void error_interrupt(struct cpu_user_regs *regs) > { > - unsigned long v, v1; > + unsigned int v, v1, i; > > /* First tickle the hardware, only then report what went on. -- > REW */ > v = apic_read(APIC_ESR); > @@ -1329,18 +1341,12 @@ void error_interrupt(struct cpu_user_regs *regs) > v1 = apic_read(APIC_ESR); > ack_APIC_irq(); > > - /* Here is what the APIC error bits mean: > - 0: Send CS error > - 1: Receive CS error > - 2: Send accept error > - 3: Receive accept error > - 4: Reserved > - 5: Send illegal vector > - 6: Received illegal vector > - 7: Illegal register address > - */ > - printk (KERN_DEBUG "APIC error on CPU%d: %02lx(%02lx)\n", > + printk (KERN_DEBUG "APIC error on CPU%u: %02x(%02x)", While at this, please apply Xen style to all changed lines. In particular, drop the space between printk and its opening bracket. Swap KERN_ for XENLOG_ > smp_processor_id(), v , v1); > + for (i = (1<<7); i; i >>= 1) Spaces inside the brackets. > + if(v1 & i) And here. > + printk (KERN_DEBUG ", %s", fault_reasons_from_esr[ffs(i) > - 1]); The code here now looks correct, but it is unlikely that the compiler would be able to simplify the ffs() call. An alternate approach would be: int i; for ( i = 7; i >= 0; --i ) if ( v1 & (1 << i) ) printk(... , fault_reasons_from_esr[i]) > + printk (KERN_DEBUG ".\n"); Please do not put full stops on messages like this. It serves no useful purpose, but wasted space in the console ring and wasted time when pushed over a serial console. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |