• Oliver Hartkopp's avatar
    can: bcm: use call_rcu() instead of costly synchronize_rcu() · f1b4e32a
    Oliver Hartkopp authored
    In commit d5f9023f ("can: bcm: delay release of struct bcm_op
    after synchronize_rcu()") Thadeu Lima de Souza Cascardo introduced two
    synchronize_rcu() calls in bcm_release() (only once at socket close)
    and in bcm_delete_rx_op() (called on removal of each single bcm_op).
    
    Unfortunately this slow removal of the bcm_op's affects user space
    applications like cansniffer where the modification of a filter
    removes 2048 bcm_op's which blocks the cansniffer application for
    40(!) seconds.
    
    In commit 181d4447 ("can: gw: use call_rcu() instead of costly
    synchronize_rcu()") Eric Dumazet replaced the synchronize_rcu() calls
    with several call_rcu()'s to safely remove the data structures after
    the removal of CAN ID subscriptions with can_rx_unregister() calls.
    
    This patch adopts Erics approach for the can-bcm which should be
    applicable since the removal of tasklet_kill() in bcm_remove_op() and
    the introduction of the HRTIMER_MODE_SOFT timer handling in Linux 5.4.
    
    Fixes: d5f9023f ("can: bcm: delay release of struct bcm_op after synchronize_rcu()") # >= 5.4
    Link: https://lore.kernel.org/all/20220520183239.19111-1-socketcan@hartkopp.net
    Cc: stable@vger.kernel.org
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Norbert Slusarek <nslusarek@gmx.net>
    Cc: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    f1b4e32a
bcm.c 42.6 KB