Commit:     f54ae69bafa16434ce46bc2f1fe556bce4d23650
Parent:     f087515c658a68454d43909d482ea4b59e7d6d5c
Author:     Andres Salomon <[EMAIL PROTECTED]>
AuthorDate: Sat Feb 9 23:24:08 2008 +0100
Committer:  Thomas Gleixner <[EMAIL PROTECTED]>
CommitDate: Sat Feb 9 23:24:08 2008 +0100

    x86: GEODE: MFGPT: fix a potential race when disabling a timer
    We *really* don't want to be reading MFGPTx_SETUP and writing back those
    values.  What we want to be doing is clearing CMP1 and CMP2 unconditionally;
    otherwise, we have races where CMP1 and/or CMP2 fire after we've read
    MFGPTx_SETUP.  They can also fire between when we've written ~CNTEN to
    the register, and when the new register values get copied to the timer's
    version of the register.  By clearing both fields, we're okay.
    Signed-off-by: Andres Salomon <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
 arch/x86/kernel/mfgpt_32.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c
index abdb7c7..81aa9db 100644
--- a/arch/x86/kernel/mfgpt_32.c
+++ b/arch/x86/kernel/mfgpt_32.c
@@ -249,8 +249,9 @@ __setup("mfgpt_irq=", mfgpt_setup);
 static void mfgpt_disable_timer(u16 clock)
-       u16 val = geode_mfgpt_read(clock, MFGPT_REG_SETUP);
-       geode_mfgpt_write(clock, MFGPT_REG_SETUP, val & ~MFGPT_SETUP_CNTEN);
+       /* avoid races by clearing CMP1 and CMP2 unconditionally */
+       geode_mfgpt_write(clock, MFGPT_REG_SETUP, (u16) ~MFGPT_SETUP_CNTEN |
+                       MFGPT_SETUP_CMP1 | MFGPT_SETUP_CMP2);
 static int mfgpt_next_event(unsigned long, struct clock_event_device *);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to