• Paolo Abeni's avatar
    mptcp: fix delegated action races · a5efdbce
    Paolo Abeni authored
    The delegated action infrastructure is prone to the following
    race: different CPUs can try to schedule different delegated
    actions on the same subflow at the same time.
    
    Each of them will check different bits via mptcp_subflow_delegate(),
    and will try to schedule the action on the related per-cpu napi
    instance.
    
    Depending on the timing, both can observe an empty delegated list
    node, causing the same entry to be added simultaneously on two different
    lists.
    
    The root cause is that the delegated actions infra does not provide
    a single synchronization point. Address the issue reserving an additional
    bit to mark the subflow as scheduled for delegation. Acquiring such bit
    guarantee the caller to own the delegated list node, and being able to
    safely schedule the subflow.
    
    Clear such bit only when the subflow scheduling is completed, ensuring
    proper barrier in place.
    
    Additionally swap the meaning of the delegated_action bitmask, to allow
    the usage of the existing helper to set multiple bit at once.
    
    Fixes: bcd97734 ("mptcp: use delegate action to schedule 3rd ack retrans")
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarMat Martineau <martineau@kernel.org>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
    Link: https://lore.kernel.org/r/20231004-send-net-20231004-v1-1-28de4ac663ae@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    a5efdbce
protocol.c 103 KB