lkml.org 
[lkml]   [2020]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 02/10] x86/mm/pat: Mark an intentional data race
    Date
    From: Qian Cai <cai@lca.pw>

    cpa_4k_install could be accessed concurrently as noticed by KCSAN,

    read to 0xffffffffaa59a000 of 8 bytes by interrupt on cpu 7:
    cpa_inc_4k_install arch/x86/mm/pat/set_memory.c:131 [inline]
    __change_page_attr+0x10cf/0x1840 arch/x86/mm/pat/set_memory.c:1514
    __change_page_attr_set_clr+0xce/0x490 arch/x86/mm/pat/set_memory.c:1636
    __set_pages_np+0xc4/0xf0 arch/x86/mm/pat/set_memory.c:2148
    __kernel_map_pages+0xb0/0xc8 arch/x86/mm/pat/set_memory.c:2178
    kernel_map_pages include/linux/mm.h:2719 [inline] <snip>

    write to 0xffffffffaa59a000 of 8 bytes by task 1 on cpu 6:
    cpa_inc_4k_install arch/x86/mm/pat/set_memory.c:131 [inline]
    __change_page_attr+0x10ea/0x1840 arch/x86/mm/pat/set_memory.c:1514
    __change_page_attr_set_clr+0xce/0x490 arch/x86/mm/pat/set_memory.c:1636
    __set_pages_p+0xc4/0xf0 arch/x86/mm/pat/set_memory.c:2129
    __kernel_map_pages+0x2e/0xc8 arch/x86/mm/pat/set_memory.c:2176
    kernel_map_pages include/linux/mm.h:2719 [inline] <snip>

    Both accesses are due to the same "cpa_4k_install++" in
    cpa_inc_4k_install. A data race here could be potentially undesirable:
    depending on compiler optimizations or how x86 executes a non-LOCK'd
    increment, it may lose increments, corrupt the counter, etc. Since this
    counter only seems to be used for printing some stats, this data race
    itself is unlikely to cause harm to the system though. Thus, mark this
    intentional data race using the data_race() marco.

    Suggested-by: Macro Elver <elver@google.com>
    Signed-off-by: Qian Cai <cai@lca.pw>
    Acked-by: Borislav Petkov <bp@suse.de>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    ---
    arch/x86/mm/pat/set_memory.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
    index 77e0430..d1b2a88 100644
    --- a/arch/x86/mm/pat/set_memory.c
    +++ b/arch/x86/mm/pat/set_memory.c
    @@ -135,7 +135,7 @@ static inline void cpa_inc_2m_checked(void)

    static inline void cpa_inc_4k_install(void)
    {
    - cpa_4k_install++;
    + data_race(cpa_4k_install++);
    }

    static inline void cpa_inc_lp_sameprot(int level)
    --
    2.9.5
    \
     
     \ /
      Last update: 2020-06-23 02:44    [W:2.993 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site