加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux Kernel Generic Netlink – 它是并发的吗?

发布时间:2020-12-14 02:14:20 所属栏目:Linux 来源:网络整理
导读:假设我使用带有多个回调的genl_register_family_with_ops注册了一个通用的netlink接口. 我没有看到任何关于它的警告,我认为回调是连续调用的,但没有关于如何调用回调的信息. 是否有可能在我注册的同一个通用netlink接口上同时调用多个回调?我是否需要回调之
假设我使用带有多个回调的genl_register_family_with_ops注册了一个通用的netlink接口.

我没有看到任何关于它的警告,我认为回调是连续调用的,但没有关于如何调用回调的信息.

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

为了使问题更简单:

可以在两个内核中抢占或同时运行单个netlink回调吗?

解决方法

答案假设 Linux内核版本3.11或4.2,可能对许多其他人有效.回答截至2015年9月的当前情况.

回调是否可以并发是注册时struct genl_family的可配置属性,但如果没有明确指定,则可能默认为关闭.这是由于1)struct genl_family中存在bool parallel_ops成员,以及2)在C中默认为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()(受互斥锁保护或不受保护),就会调用实际的回调here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读