From: Thomas Graf <tgraf@suug.ch>
To: Richard MUSIL <richard.musil@st.com>
Cc: Patrick McHardy <kaber@trash.net>, netdev@vger.kernel.org
Subject: Re: [GENETLINK]: Question: global lock (genl_mutex) possible refinement?
Date: Thu, 16 Aug 2007 17:58:19 +0200 [thread overview]
Message-ID: <20070816155819.GE32236@postel.suug.ch> (raw)
In-Reply-To: <46A5DDDD.6070602@st.com>
* Richard MUSIL <richard.musil@st.com> 2007-07-24 13:09
> Thomas Graf wrote:
> > Please provide a new overall patch which is not based on your
> > initial patch so I can review your idea properly.
>
> Here it goes (merging two previous patches). I have diffed
> against v2.6.22, which I am using currently as my base:
Sorry for taking so long.
> @@ -150,9 +176,9 @@ int genl_register_ops(struct genl_family *family, struct genl_ops *ops)
> if (ops->policy)
> ops->flags |= GENL_CMD_CAP_HASPOL;
>
> - genl_lock();
> + genl_fam_lock(family);
> list_add_tail(&ops->ops_list, &family->ops_list);
> - genl_unlock();
> + genl_fam_unlock(family);
For registering operations, it is sufficient to just acquire the
family lock, the family itself can't disappear while holding it.
> @@ -216,8 +242,9 @@ int genl_register_family(struct genl_family *family)
> goto errout;
>
> INIT_LIST_HEAD(&family->ops_list);
> + mutex_init(&family->lock);
>
> - genl_lock();
> + genl_fam_lock(family);
>
> if (genl_family_find_byname(family->name)) {
> err = -EEXIST;
> @@ -251,14 +278,14 @@ int genl_register_family(struct genl_family *family)
> family->attrbuf = NULL;
>
> list_add_tail(&family->family_list, genl_family_chain(family->id));
> - genl_unlock();
> + genl_fam_unlock(family);
This looks good.
> @@ -303,38 +332,57 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
> struct genlmsghdr *hdr = nlmsg_data(nlh);
> int hdrlen, err;
>
> + genl_fam_lock(NULL);
> family = genl_family_find_byid(nlh->nlmsg_type);
> - if (family == NULL)
> + if (family == NULL) {
> + genl_fam_unlock(NULL);
> return -ENOENT;
> + }
> +
> + /* get particular family lock, but release global family lock
> + * so registering operations for other families are possible */
> + genl_onefam_lock(family);
> + genl_fam_unlock(NULL);
I don't like having two locks for something as trivial as this.
Basically the only reason the global lock is required here is to
protect from family removal which can be avoided otherwise by
using RCU list operations.
Therefore, I'd propose the following lock semantics:
Use own global mutex to protect writing to the family list, make
reading side lockless using rcu for use when looking up family
upon mesage processing. Use a family lock to protect writing to
operations list and serialize messae processing with unregister
operations.
next prev parent reply other threads:[~2007-08-16 15:57 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-20 12:52 [GENETLINK]: Question: global lock (genl_mutex) possible refinement? Richard MUSIL
2007-07-20 13:21 ` Patrick McHardy
2007-07-20 13:58 ` Richard MUSIL
2007-07-20 14:00 ` Patrick McHardy
2007-07-20 16:15 ` Richard MUSIL
2007-07-23 10:29 ` Thomas Graf
2007-07-23 16:45 ` Richard MUSIL
2007-07-24 9:35 ` Thomas Graf
2007-07-24 11:09 ` Richard MUSIL
2007-08-10 8:52 ` Richard MUSIL
2007-08-16 15:58 ` Thomas Graf [this message]
2007-08-17 8:38 ` Richard MUSIL
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070816155819.GE32236@postel.suug.ch \
--to=tgraf@suug.ch \
--cc=kaber@trash.net \
--cc=netdev@vger.kernel.org \
--cc=richard.musil@st.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).