[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20161121122343.GA635@redhat.com>
Date: Mon, 21 Nov 2016 13:23:44 +0100
From: Oleg Nesterov <oleg@...hat.com>
To: Davidlohr Bueso <dave@...olabs.net>
Cc: mingo@...nel.org, peterz@...radead.org, john.stultz@...aro.org,
dimitrysh@...gle.com, linux-kernel@...r.kernel.org,
Davidlohr Bueso <dbueso@...e.de>
Subject: Re: [PATCH 3/3] locking/percpu-rwsem: Avoid unnecessary writer
wakeups
On 11/18, Davidlohr Bueso wrote:
>
> +static bool __readers_active_check(struct percpu_rw_semaphore *sem)
> +{
> + return !(per_cpu_sum(*sem->read_count) !=0);
> +}
Hmm,
return per_cpu_sum(*sem->read_count) == 0;
looks more clear, but this is minor,
> int __percpu_init_rwsem(struct percpu_rw_semaphore *sem,
> const char *name, struct lock_class_key *rwsem_key)
> {
> @@ -103,41 +141,11 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem)
> __this_cpu_dec(*sem->read_count);
>
> /* Prod writer to recheck readers_active */
> - swake_up(&sem->writer);
> + if (__readers_active_check(sem))
> + swake_up(&sem->writer);
Suppose we have 2 active readers which call __percpu_up_read() at the same
time and the pending writer sleeps.
What guarantees that one of these readers will observe per_cpu_sum() == 0 ?
They both can read the old value of the remote per-cpu counter, no?
Oleg.
Powered by blists - more mailing lists