• L
    markers: bit-field is not thread-safe nor smp-safe · 1b7ae37c
    Lai Jiangshan 提交于
    bit-field is not thread-safe nor smp-safe.
    
    struct marker_entry.rcu_pending is not protected by any lock
    in rcu-callback free_old_closure().
    so we must turn it into a safe type.
    
    detail:
    
    I suppose rcu_pending and ptype are store in struct marker_entry.tmp1
    
    free_old_closure() side:           change ptype side:
    
                                    |  load struct marker_entry.tmp1
    --------------------------------|--------------------------------
                                    |  change ptype bit in tmp1
    load struct marker_entry.tmp1   |
    change rcu_pending bit in tmp1  |
    store tmp1                      |
    --------------------------------|--------------------------------
                                    |  store tmp1
    
    now this result equals that free_old_closure() do not change rcu_pending
    bit, bug! This bug will cause redundant rcu_barrier_sched() called.
    not too harmful.
    
    ----- corresponding:
    
    free_old_closure() side:           change ptype side:
    
    load struct marker_entry.tmp1   |
    --------------------------------|--------------------------------
                                    |  load struct marker_entry.tmp1
    change rcu_pending bit in tmp1  |
                                    |  change ptype bit in tmp1
                                    |  store tmp1
    --------------------------------|--------------------------------
    store tmp1                      |
    
    now this result equals that change ptype side do not change ptype
    bit, bug! this bug cause marker_probe_cb() access to invalid memory.
    oops!
    
    see also: http://en.wikipedia.org/wiki/Bit_fieldSigned-off-by: NLai Jiangshan <laijs@cn.fujitsu.com>
    Acked-by: NMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    1b7ae37c
marker.c 23.9 KB