linux 为什么我们需要在调用函数conn_request()之前调用local_bh_disabled()?

r3i60tvu  于 2023-05-22  发布在  Linux
关注(0)|答案(1)|浏览(127)

我不明白在函数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的源代码

js81xvg6

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之后执行。这也是我的猜测。

相关问题