• Yabin Cui's avatar
    coresight: Serialize enabling/disabling a link device. · edda32da
    Yabin Cui authored
    When tracing etm data of multiple threads on multiple cpus through perf
    interface, some link devices are shared between paths of different cpus.
    It creates race conditions when different cpus wants to enable/disable
    the same link device at the same time.
    
    Example 1:
    Two cpus want to enable different ports of a coresight funnel, thus
    calling the funnel enable operation at the same time. But the funnel
    enable operation isn't reentrantable.
    
    Example 2:
    For an enabled coresight dynamic replicator with refcnt=1, one cpu wants
    to disable it, while another cpu wants to enable it. Ideally we still have
    an enabled replicator with refcnt=1 at the end. But in reality the result
    is uncertain.
    
    Since coresight devices claim themselves when enabled for self-hosted
    usage, the race conditions above usually make the link devices not usable
    after many cycles.
    
    To fix the race conditions, this patch uses spinlocks to serialize
    enabling/disabling link devices.
    
    Fixes: a06ae860 ("coresight: add CoreSight core layer framework")
    Signed-off-by: default avatarYabin Cui <yabinc@google.com>
    Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
    Cc: stable <stable@vger.kernel.org> # 5.3
    Link: https://lore.kernel.org/r/20191104181251.26732-14-mathieu.poirier@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    edda32da
coresight-funnel.c 8.72 KB