提交 f54ae69b 编写于 作者: A Andres Salomon 提交者: Thomas Gleixner

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: NAndres Salomon <dilinger@debian.org>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
上级 f087515c
...@@ -249,8 +249,9 @@ __setup("mfgpt_irq=", mfgpt_setup); ...@@ -249,8 +249,9 @@ __setup("mfgpt_irq=", mfgpt_setup);
static void mfgpt_disable_timer(u16 clock) static void mfgpt_disable_timer(u16 clock)
{ {
u16 val = geode_mfgpt_read(clock, MFGPT_REG_SETUP); /* avoid races by clearing CMP1 and CMP2 unconditionally */
geode_mfgpt_write(clock, MFGPT_REG_SETUP, val & ~MFGPT_SETUP_CNTEN); 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 *); static int mfgpt_next_event(unsigned long, struct clock_event_device *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册