我正在寻找__sock_create()
代码以更好地了解内核的内部机制,并发现内核调用try_module_get()
了两次;这是一个片段:
static int __sock_create(struct net *net, int family, int type, int protocol, struct socket **res, int kern)
{
sock = sock_alloc();
...
if (!try_module_get(pf->owner))
goto out_release;
err = pf->create(net, sock, protocol);
...
if (!try_module_get(sock->ops->owner))
goto out_module_busy
...
}
本质上,如果与套接字相关的回调在模块中,那么每当socket()
来自用户空间的每个回调都会增加模块的引用计数两次。这种行为的理由是什么?