Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.os.linux.embedded > #388 > unrolled thread

sock_create() in kernel

Started by"Mark" <mark_cruzNOTFORSPAM@hotmail.com>
First post2012-12-19 10:18 -0500
Last post2012-12-19 16:06 +0000
Articles 2 — 2 participants

Back to article view | Back to comp.os.linux.embedded


Contents

  sock_create() in kernel "Mark" <mark_cruzNOTFORSPAM@hotmail.com> - 2012-12-19 10:18 -0500
    Re: sock_create() in kernel Rainer Weikusat <rweikusat@mssgmbh.com> - 2012-12-19 16:06 +0000

#388 — sock_create() in kernel

From"Mark" <mark_cruzNOTFORSPAM@hotmail.com>
Date2012-12-19 10:18 -0500
Subjectsock_create() in kernel
Message-ID<kasls6$jdk$1@speranza.aioe.org>
Hello,

I was looking in to __sock_create() code to get better understanding of the 
kernel's internal machinery and found that the kernel calls try_module_get() 
twice; here is a snippet:

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

   ...
}

Essentially if socket relevant callbacks are in a module, then whenever 
every socket() from the user space will bump the module's reference count 
twice. What's the rationale for such behaviour ?

Thanks.

Mark 

[toc] | [next] | [standalone]


#389

FromRainer Weikusat <rweikusat@mssgmbh.com>
Date2012-12-19 16:06 +0000
Message-ID<878v8uyqjq.fsf@sapphire.mobileactivedefense.com>
In reply to#388
"Mark" <mark_cruzNOTFORSPAM@hotmail.com> writes:

[...]

> 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
>
>    ...
> }
>
> Essentially if socket relevant callbacks are in a module, then whenever 
> every socket() from the user space will bump the module's reference count 
> twice. What's the rationale for such behaviour ?

Have you considered reading the comments and looking at the
surrounding code?

        /*
         * We will call the ->create function, that possibly is in a loadable
         * module, so we have to bump that loadable module refcnt first.
         */
        if (!try_module_get(pf->owner))
                goto out_release;

        /* Now protected by module ref count */
        rcu_read_unlock();

        err = pf->create(net, sock, protocol, kern);
        if (err < 0)
                goto out_module_put;

        /*
         * Now to bump the refcnt of the [loadable] module that owns this
         * socket at sock_release time we decrement its refcnt.
         */
        if (!try_module_get(sock->ops->owner))
                goto out_module_busy;

        /*
         * Now that we're done with the ->create function, the [loadable]
         * module can have its refcnt decremented
         */
        module_put(pf->owner);
[net/socket.c]

[toc] | [prev] | [standalone]


Back to top | Article view | comp.os.linux.embedded


csiph-web