1、发包流程(设置sk_lock.owned为1,但不占用spinlock锁)
tcp_sendmsg
lock_sock
lock_sock_nested
2、收包流程(占用spinlock锁)
1)、如果sk_lock.owned为1,说明当前sk正在发包,因此需要延迟收包,先将报文放到backlog里,等发包结束后,再去收包;
2)、如果sk_lock.owned为0,说明当前sk没有子在发包,可以正常收包,因此直接通过tcp_v4_do_rcv接收报文,整个接收过程占用spinlock锁,发包流程被阻塞。
3、backlog流程(不占用spinlock锁,sk_lock.owned为1)
当发包流程结束后,会通过release_sock去处理之前保存在backlog里的还没来的及处理的接收报文。
tcp_sendmsg
release_sock
__release_sock
sk_backlog_rcv
tcp_v4_do_rcv