假设我已经使用带有多个回调的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/