我不明白在函数conn_request()
之前调用的函数local_bh_disable()
的作用是什么。这是否意味着此时只有一个进程可以访问此部分(某种锁)?我这样问是因为我想在调用conn_request
后从ehash
表中删除一些条目,但我不知道是否必须在此节中执行此操作。
if (th->syn) {
if (th->fin)
goto discard;
/* It is possible that we process SYN packets from backlog,
* so we need to make sure to disable BH right there.
*/
local_bh_disable();
acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0;
local_bh_enable();
if (!acceptable)
return 1;
consume_skb(skb);
return 0;
}
PS:来自Linux内核4.15的源代码
1条答案
按热度按时间js81xvg61#
你明白这个问题了吗?根据代码注解,如果SYN数据包来自backlog,则应该调用local_bh_disable,我认为这是因为backlog处理在用户空间,softirq的tcp_v4_rcv会在sk->sk_lock.owned为用户空间所有时将skb推送到backlog,它还可以确保用户空间的backlog不与softirq中的tcp_v4_rcv冲突,而无需local_bh_disable。但是conn_request会创建synack timer,只有local_bh_disable才能保证synack timer在conn_request之后执行。这也是我的猜测。