• Marco Elver's avatar
    debugobjects: Fix various data races · 35fd7a63
    Marco Elver authored
    The counters obj_pool_free, and obj_nr_tofree, and the flag obj_freeing are
    read locklessly outside the pool_lock critical sections. If read with plain
    accesses, this would result in data races.
    
    This is addressed as follows:
    
     * reads outside critical sections become READ_ONCE()s (pairing with
       WRITE_ONCE()s added);
    
     * writes become WRITE_ONCE()s (pairing with READ_ONCE()s added); since
       writes happen inside critical sections, only the write and not the read
       of RMWs needs to be atomic, thus WRITE_ONCE(var, var +/- X) is
       sufficient.
    
    The data races were reported by KCSAN:
    
      BUG: KCSAN: data-race in __free_object / fill_pool
    
      write to 0xffffffff8beb04f8 of 4 bytes by interrupt on cpu 1:
       __free_object+0x1ee/0x8e0 lib/debugobjects.c:404
       __debug_check_no_obj_freed+0x199/0x330 lib/debugobjects.c:969
       debug_check_no_obj_freed+0x3c/0x44 lib/debugobjects.c:994
       slab_free_hook mm/slub.c:1422 [inline]
    
      read to 0xffffffff8beb04f8 of 4 bytes by task 1 on cpu 2:
       fill_pool+0x3d/0x520 lib/debugobjects.c:135
       __debug_object_init+0x3c/0x810 lib/debugobjects.c:536
       debug_object_init lib/debugobjects.c:591 [inline]
       debug_object_activate+0x228/0x320 lib/debugobjects.c:677
       debug_rcu_head_queue kernel/rcu/rcu.h:176 [inline]
    
      BUG: KCSAN: data-race in __debug_object_init / fill_pool
    
      read to 0xffffffff8beb04f8 of 4 bytes by task 10 on cpu 6:
       fill_pool+0x3d/0x520 lib/debugobjects.c:135
       __debug_object_init+0x3c/0x810 lib/debugobjects.c:536
       debug_object_init_on_stack+0x39/0x50 lib/debugobjects.c:606
       init_timer_on_stack_key kernel/time/timer.c:742 [inline]
    
      write to 0xffffffff8beb04f8 of 4 bytes by task 1 on cpu 3:
       alloc_object lib/debugobjects.c:258 [inline]
       __debug_object_init+0x717/0x810 lib/debugobjects.c:544
       debug_object_init lib/debugobjects.c:591 [inline]
       debug_object_activate+0x228/0x320 lib/debugobjects.c:677
       debug_rcu_head_queue kernel/rcu/rcu.h:176 [inline]
    
      BUG: KCSAN: data-race in free_obj_work / free_object
    
      read to 0xffffffff9140c190 of 4 bytes by task 10 on cpu 6:
       free_object+0x4b/0xd0 lib/debugobjects.c:426
       debug_object_free+0x190/0x210 lib/debugobjects.c:824
       destroy_timer_on_stack kernel/time/timer.c:749 [inline]
    
      write to 0xffffffff9140c190 of 4 bytes by task 93 on cpu 1:
       free_obj_work+0x24f/0x480 lib/debugobjects.c:313
       process_one_work+0x454/0x8d0 kernel/workqueue.c:2264
       worker_thread+0x9a/0x780 kernel/workqueue.c:2410
    Reported-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarMarco Elver <elver@google.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20200116185529.11026-1-elver@google.com
    35fd7a63
debugobjects.c 34.8 KB