假设我已经使用带有多个回调的genl_register_family_with_ops注册了通用netlink接口(interface)。

我没有看到任何警告,我假设回调被串行调用,但是没有有关如何都不调用回调的信息。

是否有可能在我注册的同一个通用netlink接口(interface)上同时调用多个回调?回调之间是否需要任何同步?

使问题更简单:

一个netlink回调可以被抢占还是可以同时在两个内核中运行?

最佳答案

答案假设Linux内核版本为3.11或4.2,可能对许多其他版本都有效。截至2015年9月的最新答案。

回调是否可以并发是注册时 struct genl_family 的可配置属性,但如果未明确指定,则可能默认为关闭。这是由于1)bool parallel_ops中存在struct genl_family成员,以及2)C中默认将静态持续时间struct的未初始化成员默认为0

接收到Netlink消息后,最终会调用函数 genl_rcv_msg() ,该函数确定消息的GeNetlink系列以及parallel_ops的条件,以决定是否锁定全局genl_mutex

static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
        struct genl_family *family;
        int err;

        family = genl_family_find_byid(nlh->nlmsg_type);
        if (family == NULL)
                return -ENOENT;

        if (!family->parallel_ops)
                genl_lock();

        err = genl_family_rcv_msg(family, skb, nlh);

        if (!family->parallel_ops)
                genl_unlock();

        return err;
}

一旦 genl_family_rcv_msg() 被调用(由互斥锁保护或不 protected ),实际的回调就会被调用here

关于c - Linux内核通用Netlink-是否并发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32523639/

10-13 04:34