Uses of RCU for dynamically changeable NMI handlers need to use the new rcu_dereference() and rcu_assign_pointer() facilities. This change makes it clear that these uses are safe from a memory-barrier viewpoint, but the main purpose is to document exactly what operations are being protected by RCU. This has been tested on x86 and x86-64, which are the only architectures affected by this change.
Signed-off-by: <[EMAIL PROTECTED]> --- i386/kernel/traps.c | 4 ++-- x86_64/kernel/nmi.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff -urpN -X dontdiff linux-2.6.12-rc6/arch/i386/kernel/traps.c linux-2.6.12-rc6-NMIRCUfix/arch/i386/kernel/traps.c --- linux-2.6.12-rc6/arch/i386/kernel/traps.c 2005-06-17 16:34:17.000000000 -0700 +++ linux-2.6.12-rc6-NMIRCUfix/arch/i386/kernel/traps.c 2005-07-01 15:16:24.000000000 -0700 @@ -626,7 +626,7 @@ fastcall void do_nmi(struct pt_regs * re cpu = smp_processor_id(); ++nmi_count(cpu); - if (!nmi_callback(regs, cpu)) + if (!rcu_dereference(nmi_callback)(regs, cpu)) default_do_nmi(regs); nmi_exit(); @@ -634,7 +634,7 @@ fastcall void do_nmi(struct pt_regs * re void set_nmi_callback(nmi_callback_t callback) { - nmi_callback = callback; + rcu_assign_pointer(nmi_callback, callback); } void unset_nmi_callback(void) diff -urpN -X dontdiff linux-2.6.12-rc6/arch/x86_64/kernel/nmi.c linux-2.6.12-rc6-NMIRCUfix/arch/x86_64/kernel/nmi.c --- linux-2.6.12-rc6/arch/x86_64/kernel/nmi.c 2005-06-17 16:34:24.000000000 -0700 +++ linux-2.6.12-rc6-NMIRCUfix/arch/x86_64/kernel/nmi.c 2005-07-01 15:15:21.000000000 -0700 @@ -522,14 +522,14 @@ asmlinkage void do_nmi(struct pt_regs * nmi_enter(); add_pda(__nmi_count,1); - if (!nmi_callback(regs, cpu)) + if (!rcu_dereference(nmi_callback)(regs, cpu)) default_do_nmi(regs); nmi_exit(); } void set_nmi_callback(nmi_callback_t callback) { - nmi_callback = callback; + rcu_assign_pointer(nmi_callback, callback); } void unset_nmi_callback(void) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/