• P
    mptcp: wake-up readers only for in sequence data · 99d1055c
    Paolo Abeni 提交于
    Currently we rely on the subflow->data_avail field, which is subject to
    races:
    
    	ssk1
    		skb len = 500 DSS(seq=1, len=1000, off=0)
    		# data_avail == MPTCP_SUBFLOW_DATA_AVAIL
    
    	ssk2
    		skb len = 500 DSS(seq = 501, len=1000)
    		# data_avail == MPTCP_SUBFLOW_DATA_AVAIL
    
    	ssk1
    		skb len = 500 DSS(seq = 1, len=1000, off =500)
    		# still data_avail == MPTCP_SUBFLOW_DATA_AVAIL,
    		# as the skb is covered by a pre-existing map,
    		# which was in-sequence at reception time.
    
    Instead we can explicitly check if some has been received in-sequence,
    propagating the info from __mptcp_move_skbs_from_subflow().
    
    Additionally add the 'ONCE' annotation to the 'data_avail' memory
    access, as msk will read it outside the subflow socket lock.
    
    Fixes: 648ef4b8 ("mptcp: Implement MPTCP receive path")
    Signed-off-by: NPaolo Abeni <pabeni@redhat.com>
    Signed-off-by: NMat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    99d1055c
protocol.c 86.8 KB