• Andreea-Cristina Bernat's avatar
    carl9170: tx: Replace rcu_assign_pointer() with RCU_INIT_POINTER() · 6a5d088a
    Andreea-Cristina Bernat authored
    According to RCU_INIT_POINTER()'s block comment 3.a, it can be used if
    "3.   The referenced data structure has already been exposed to readers either
    at compile time or via rcu_assign_pointer() -and-
     a.   You have not made -any- reader-visible changes to this structure since
    then".
    
    This case fulfills the conditions above because between the rcu_dereference()
    call (cvif = rcu_dereference(ar->beacon_iter);) and the rcu_assign_pointer()
    call there is no update of the "cvif" variable.
    Therefore, this patch makes the replacement.
    
    The following Coccinelle semantic patch was used:
    @@
    identifier v;
    @@
    
    v = rcu_dereference(...);
    ... when != rcu_dereference(...);
        when != v = ...;
        when != (<+...v...+>)++;
        when != \(memcpy\|memset\)(...);
    (
    - rcu_assign_pointer
    + RCU_INIT_POINTER
      (..., v);
    |
     if(...) {
    ... when != v = ...;
    - rcu_assign_pointer
    + RCU_INIT_POINTER
      (..., v);
    ... when any
     }
    )
    
    Because there are cases where between a “rcu_dereference()” call and a
    “rcu_assign_pointer()” call might be updates of the value that interests us,
    the Coccinelle semantic patch ignores them and replaces with
    "RCU_INIT_POINTER()" only when the update is not happening.
    Signed-off-by: default avatarAndreea-Cristina Bernat <bernat.ada@gmail.com>
    Acked-by: default avatarChristian Lamparter <chunkeey@googlemail.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    6a5d088a
tx.c 42.5 KB