On 2013-01-12 18:35, Gilles Chanteperdrix wrote: > On 01/11/2013 08:45 AM, Jan Kiszka wrote: > >> On 2013-01-11 08:37, Jan Kiszka wrote: >>>> From acc3c57390d275a1b28d66f1ec88c85e0f8c0890 Mon Sep 17 00:00:00 2001 >>>> From: Gilles Chanteperdrix <[email protected]> >>>> Date: Sat, 29 Dec 2012 17:48:20 +0100 >>>> Subject: [PATCH] x86/ipipe: restore warning with AMD erratum >>>> >>>> --- >>>> arch/x86/kernel/apic/apic.c | 16 ++++++++++------ >>>> 1 files changed, 10 insertions(+), 6 deletions(-) >>>> >>>> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c >>>> index 7f07610..91531bb 100644 >>>> --- a/arch/x86/kernel/apic/apic.c >>>> +++ b/arch/x86/kernel/apic/apic.c >>>> @@ -545,14 +545,18 @@ static void __cpuinit setup_APIC_timer(void) >>>> memcpy(levt, &lapic_clockevent, sizeof(*levt)); >>>> levt->cpumask = cpumask_of(smp_processor_id()); >>>> #ifdef CONFIG_IPIPE >>>> - if (!(lapic_clockevent.features & CLOCK_EVT_FEAT_DUMMY)) >>>> + if (!(lapic_clockevent.features & CLOCK_EVT_FEAT_DUMMY) >>>> + && !cpu_has_amd_erratum(amd_erratum_400)) >>>> levt->ipipe_timer = &__get_cpu_var(lapic_itimer); >>>> else { >>>> - printk(KERN_INFO >>>> - "I-pipe: cannot use LAPIC as a tick device\n"); >>>> - if (cpu_has_amd_erratum(amd_erratum_400)) >>>> - printk(KERN_INFO >>>> - "I-pipe: disable C1E power state in your BIOS\n"); >>>> + static atomic_t printed = ATOMIC_INIT(-1); >>>> + printk(KERN_INFO >>>> + "I-pipe: cannot use LAPIC on cpu #%d as a tick device\n", >>>> + smp_processor_id()); >>>> + if (cpu_has_amd_erratum(amd_erratum_400) >>>> + && atomic_inc_and_test(&printed)) >>>> + printk(KERN_INFO >>>> + "I-pipe: disable C1E power state in your >>>> BIOS\n"); >>> >>> printk_once should do the trick as well. >> >> In fact, it should actually do what you likely intended: print on first >> occurrence, not on second or later. ;) > > > Not quite, printk_once is not protected from the code running > concurrently on multiple cpus.
OK. > So, atomic_inc_and_test is better, except > the ATOMIC_INIT needs to be set to 0. Nope, -1 is correct. atomic_inc_and_test first increments, then tests. I missed that it checks against 0, not != 0. So the logic is fine, you should just include the first printk as well. Jan -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 261 bytes Desc: OpenPGP digital signature URL: <http://www.xenomai.org/pipermail/xenomai/attachments/20130112/9e2ee820/attachment.pgp> _______________________________________________ Xenomai mailing list [email protected] http://www.xenomai.org/mailman/listinfo/xenomai
