- 论坛徽章:
- 6
|
本帖最后由 瀚海书香 于 2013-01-10 14:32 编辑
回复 1# jiufei19
我举个例子,例如TCP正在处理收到的一个分段,发现此分段是一个ACK,于是更新tp->snd_una,此时在即将回收所有在此tp->snd_una序号之前的重传分段前,发生了RTO超时,那么,RTO的超时处理程序能否立刻中断对ACK的处理?即此时被重传的数据其实已经被刚才那个ACK所确认了,只是因为稍微晚了点点,现在RTO已经到时了,那么会怎样处理呢?
1. 软中断不会被软中断所打断。
2. 协议栈的处理有可能是在进程上下文中运行(比如用户态系统调用),有可能被软中断打断
3. 内核在处理一个可能被软中断处理的代码的时候,通过禁止软中断来实现。
所以你的描述的问题应该是:tcp在处理ingress的数据包流程
tcp_v4_rcv()
{
if(sock被用户进程锁定)
将skb放到sk_backlog,然后返回,等待release_sock的时候处理sk_backlog中的数据包
else(tcp_prequeue){
if(开启了tcp_low_lattency||tcp_prequeue队列满)
直接调用sk_backlog_rcv,tcp_v4_do_rcv,运行在软中断的环境中,不会被软中断打断。
else
放到prequeue队列,然后返回,等待tcp_prequeue_process处理
}
}
tcp_recvmsg的处理:
tcp_prequeue_process()--->sk_backlog_rcv-->backlog_rcv--->tcp_v4_do_rcv
tcp_prequeue_process函数代码可以看到,里面添加了禁止软中断的代码。- static void tcp_prequeue_process(struct sock *sk)
- {
- struct sk_buff *skb;
- struct tcp_sock *tp = tcp_sk(sk);
- NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPPREQUEUED);
- /* RX process wants to run with disabled BHs, though it is not
- * necessary */
- local_bh_disable();
- while ((skb = __skb_dequeue(&tp->ucopy.prequeue)) != NULL)
- sk_backlog_rcv(sk, skb);
- local_bh_enable();
- /* Clear memory counter. */
- tp->ucopy.memory = 0;
- }
复制代码 综合上述可见,tcp在处理接收队列数据包的时候,是不会被软中断打断的。
|
|