假设我已经使用带有多个回调的genl_register_family_with_ops
注册了一个通用的netlink接口。
我没有看到任何关于它的警告,我认为回调是连续调用的,但是没有关于如何调用回调的信息。
是否有可能在我注册的同一个通用netlink接口上同时调用多个回调?我是否需要回调之间的任何同步?
使问题更简单:
是否可以在两个核心中抢占或同时运行单个netlink回调?
答案 0 :(得分:2)
答案假设Linux内核版本为3.11或4.2,可能对许多其他人有效。回答截至2015年9月的当前情况。
回调是否可以并发是注册时struct genl_family
的可配置属性,但如果没有明确指定,可能默认为 off 。这是由于1)bool parallel_ops
中存在struct genl_family
成员,以及2)静态持续时间struct
的未初始化成员默认为C中的0
< / p>
收到Netlink消息后,最终调用函数genl_rcv_msg()
,该函数确定消息的GeNetlink系列和parallel_ops
上的条件,以决定是否锁定全局genl_mutex
{1}}。
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。