• Ondrej Mosnacek's avatar
    selinux: mark selinux_xfrm_refcount as __read_mostly · e0de8a9a
    Ondrej Mosnacek authored
    This is motivated by a perfomance regression of selinux_xfrm_enabled()
    that happened on a RHEL kernel due to false sharing between
    selinux_xfrm_refcount and (the late) selinux_ss.policy_rwlock (i.e. the
    .bss section memory layout changed such that they happened to share the
    same cacheline). Since the policy rwlock's memory region was modified
    upon each read-side critical section, the readers of
    selinux_xfrm_refcount had frequent cache misses, eventually leading to a
    significant performance degradation under a TCP SYN flood on a system
    with many cores (32 in this case, but it's detectable on less cores as
    well).
    
    While upstream has since switched to RCU locking, so the same can no
    longer happen here, selinux_xfrm_refcount could still share a cacheline
    with another frequently written region, thus marking it __read_mostly
    still makes sense. __read_mostly helps, because it will put the symbol
    in a separate section along with other read-mostly variables, so there
    should never be a clash with frequently written data.
    
    Since selinux_xfrm_refcount is modified only in case of an explicit
    action, it should be safe to do this (i.e. it shouldn't disrupt other
    read-mostly variables too much).
    Signed-off-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
    Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
    e0de8a9a
xfrm.c 11.3 KB