x86 mmiotrace: fix race with release_kmmio_fault_page()
authorPekka Paalanen <pq@iki.fi>
Tue, 24 Feb 2009 19:44:15 +0000 (21:44 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 2 Mar 2009 09:20:37 +0000 (10:20 +0100)
commit340430c572f7b2b275d39965e88bafa71693cb23
tree4be609589171a4bd8c5744178625454c6e5efa3a
parent3e39aa156a24ce386da378784edd0f748c770087
x86 mmiotrace: fix race with release_kmmio_fault_page()

There was a theoretical possibility to a race between arming a page in
post_kmmio_handler() and disarming the page in
release_kmmio_fault_page():

cpu0                             cpu1
------------------------------------------------------------------
mmiotrace shutdown
enter release_kmmio_fault_page
                                 fault on the page
                                 disarm the page
disarm the page
                                 handle the MMIO access
                                 re-arm the page
put the page on release list
remove_kmmio_fault_pages()
                                 fault on the page
                                 page not known to mmiotrace
                                 fall back to do_page_fault()
                                 *KABOOM*

(This scenario also shows the double disarm case which is allowed.)

Fixed by acquiring kmmio_lock in post_kmmio_handler() and checking
if the page is being released from mmiotrace.

Signed-off-by: Pekka Paalanen <pq@iki.fi>
Cc: Stuart Bennett <stuart@freedesktop.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/kmmio.c