__sock_create()
カーネルの内部機構をよりよく理解するためにコードを調べていたところ、カーネルがtry_module_get()
2 回呼び出していることがわかりました。ここにスニペットがあります:
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()
、ユーザー空間からのすべてのコールバックがモジュールの参照カウントを 2 回増加させます。そのような行動の根拠は何ですか?