• Suzuki K Poulose's avatar
    coresight: Handle failures in enabling a trace path · b9866bb1
    Suzuki K Poulose authored
    coresight_enable_path() enables the components in a trace
    path from a given source to a sink, excluding the source.
    The operation is performed in the reverse order; the sink
    first and then backwards in the list. However, if we encounter
    an error in enabling any of the component, we simply disable
    all the components in the given path irrespective of whether
    we enabled some of the components in the enable iteration.
    This could interfere with another trace session if one of the
    link devices is turned off (e.g, TMC-ETF). So, we need to
    make sure that we only disable those components which were
    actually enabled from the iteration.
    
    This patch achieves the same by refactoring the coresight_disable_path
    to accept a "node" to start from in the forward order, which can
    then be used from the error path of coresight_enable_path().
    With this change, we don't issue a disable call back for a component
    which didn't get enabled. This change of behavior triggers
    a bug in coresight_enable_link(), where we leave the refcount
    on the device and will prevent the device from being enabled
    forever. So, we also drop the refcount in the coresight_enable_link()
    if the operation failed.
    
    Also, with the refactoring, we always start after the first node (which
    is the "SOURCE" device) for disabling the entire path. This implies,
    we must not find a "SOURCE" in the middle of the path. Hence, added
    a WARN_ON() to make sure the paths we get are sane, rather than
    simply ignoring them.
    
    Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b9866bb1
coresight.c 25.8 KB