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

Linux Kernel Generic Netlink – 它是并发的吗?,第1张

概述假设我使用带有多个回调的genl_register_family_with_ops注册了一个通用的netlink接口. 我没有看到任何关于它的警告,我认为回调是连续调用的,但没有关于如何调用回调的信息. 是否有可能在我注册的同一个通用netlink接口上同时调用多个回调?我是否需要回调之间的任何同步? 为了使问题更简单: 可以在两个内核中抢占或同时运行单个netlink回调吗? 答案假设 Linu 假设我使用带有多个回调的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.

总结

以上是内存溢出为你收集整理的Linux Kernel Generic Netlink – 它是并发的吗?全部内容,希望文章能够帮你解决Linux Kernel Generic Netlink – 它是并发的吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/1032543.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存