From: Simon Horman <horms@verge•net.au>
To: Pavel Emelyanov <xemul@openvz•org>
Cc: Herbert Xu <herbert@gondor•apana.org.au>,
David Miller <davem@davemloft•net>,
Linux Netdev List <netdev@vger•kernel.org>,
devel@openvz•org, Wensong Zhang <wensong@linux-vs•org>,
Julian Anastasov <ja@ssi•bg>
Subject: Re: [PATCH][IPVS] Fix sched registration race when checking for name collision
Date: Tue, 4 Dec 2007 10:41:43 +0900 [thread overview]
Message-ID: <20071204014142.GC28582@verge.net.au> (raw)
In-Reply-To: <4753D631.8040005@openvz.org>
On Mon, Dec 03, 2007 at 01:10:57PM +0300, Pavel Emelyanov wrote:
> The register_ip_vs_scheduler() checks for the scheduler with the
> same name under the read-locked __ip_vs_sched_lock, then drops,
> takes it for writing and puts the scheduler in list.
>
> This is racy, since we can have a race window between the lock
> being re-locked for writing.
>
> The fix is to search the scheduler with the given name right under
> the write-locked __ip_vs_sched_lock.
This looks correct to me.
> Signed-off-by: Pavel Emelyanov <xemul@openvz•org>
Acked-by: Simon Horman <horms@verge•net.au>
> ---
>
> diff --git a/net/ipv4/ipvs/ip_vs_sched.c b/net/ipv4/ipvs/ip_vs_sched.c
> index 1602304..4322358 100644
> --- a/net/ipv4/ipvs/ip_vs_sched.c
> +++ b/net/ipv4/ipvs/ip_vs_sched.c
> @@ -183,19 +183,6 @@ int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler)
> /* increase the module use count */
> ip_vs_use_count_inc();
>
> - /*
> - * Make sure that the scheduler with this name doesn't exist
> - * in the scheduler list.
> - */
> - sched = ip_vs_sched_getbyname(scheduler->name);
> - if (sched) {
> - ip_vs_scheduler_put(sched);
> - ip_vs_use_count_dec();
> - IP_VS_ERR("register_ip_vs_scheduler(): [%s] scheduler "
> - "already existed in the system\n", scheduler->name);
> - return -EINVAL;
> - }
> -
> write_lock_bh(&__ip_vs_sched_lock);
>
> if (scheduler->n_list.next != &scheduler->n_list) {
> @@ -207,6 +194,20 @@ int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler)
> }
>
> /*
> + * Make sure that the scheduler with this name doesn't exist
> + * in the scheduler list.
> + */
> + list_for_each_entry(sched, &ip_vs_schedulers, n_list) {
> + if (strcmp(scheduler->name, sched->name) == 0) {
> + write_unlock_bh(&__ip_vs_sched_lock);
> + ip_vs_use_count_dec();
> + IP_VS_ERR("register_ip_vs_scheduler(): [%s] scheduler "
> + "already existed in the system\n",
> + scheduler->name);
> + return -EINVAL;
> + }
> + }
> + /*
> * Add it into the d-linked scheduler list
> */
> list_add(&scheduler->n_list, &ip_vs_schedulers);
--
Horms
next prev parent reply other threads:[~2007-12-04 1:41 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-03 10:10 [PATCH][IPVS] Fix sched registration race when checking for name collision Pavel Emelyanov
2007-12-04 1:41 ` Simon Horman [this message]
2007-12-04 8:45 ` David Miller
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=20071204014142.GC28582@verge.net.au \
--to=horms@verge$(echo .)net.au \
--cc=davem@davemloft$(echo .)net \
--cc=devel@openvz$(echo .)org \
--cc=herbert@gondor$(echo .)apana.org.au \
--cc=ja@ssi$(echo .)bg \
--cc=netdev@vger$(echo .)kernel.org \
--cc=wensong@linux-vs$(echo .)org \
--cc=xemul@openvz$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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