net/smc: Send directly when TCP_CORK is cleared
mainline inclusion from mainline-v5.18-rc1 commit ea785a1a category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I78OQ2 CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/net/smc?id=ea785a1a573b390a150010b3c5b81e1ccd8c98a8 -------------------------------- According to the man page of TCP_CORK [1], if set, don't send out partial frames. All queued partial frames are sent when option is cleared again. When applications call setsockopt to disable TCP_CORK, this call is protected by lock_sock(), and tries to mod_delayed_work() to 0, in order to send pending data right now. However, the delayed work smc_tx_work is also protected by lock_sock(). There introduces lock contention for sending data. To fix it, send pending data directly which acts like TCP, without lock_sock() protected in the context of setsockopt (already lock_sock()ed), and cancel unnecessary dealyed work, which is protected by lock. [1] https://linux.die.net/man/7/tcp Signed-off-by:Tony Lu <tonylu@linux.alibaba.com> Signed-off-by:
David S. Miller <davem@davemloft.net> Signed-off-by:
Litao Jiao <jiaolitao@sangfor.com.cn>
Loading
Please sign in to comment