public inbox for netdev@vger.kernel.org 
 help / color / mirror / Atom feed
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


  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