Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Davidlohr Bueso
On Mon, 05 Dec 2016, Oleg Nesterov wrote: Yes. But percpu_down_write() should not be used after exit_notify(), so we can rely on rcu_read_lock(), release_task()->call_rcu(delayed_put_task_struct) can't be called until an exiting task passes exit_notify(). But then we probably need

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Davidlohr Bueso
On Mon, 05 Dec 2016, Oleg Nesterov wrote: Yes. But percpu_down_write() should not be used after exit_notify(), so we can rely on rcu_read_lock(), release_task()->call_rcu(delayed_put_task_struct) can't be called until an exiting task passes exit_notify(). But then we probably need

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/05, Peter Zijlstra wrote: > > > + for (;;) { > > + set_current_state(TASK_UNINTERRUPTIBLE); > > + > > + if (readers_active_check(sem)) > > + break; > > + > > + schedule(); > > + } > > + > > + rcu_assign_pointer(sem->writer, NULL); > > And

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/05, Peter Zijlstra wrote: > > > + for (;;) { > > + set_current_state(TASK_UNINTERRUPTIBLE); > > + > > + if (readers_active_check(sem)) > > + break; > > + > > + schedule(); > > + } > > + > > + rcu_assign_pointer(sem->writer, NULL); > > And

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/02, Davidlohr Bueso wrote: > > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) >*/ > __this_cpu_dec(*sem->read_count); > > + rcu_read_lock(); > + writer = rcu_dereference(sem->writer); > + > /* Prod writer to recheck readers_active */ >

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/02, Davidlohr Bueso wrote: > > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) >*/ > __this_cpu_dec(*sem->read_count); > > + rcu_read_lock(); > + writer = rcu_dereference(sem->writer); > + > /* Prod writer to recheck readers_active */ >

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/05, Oleg Nesterov wrote: > > Yes, but on a second thought task_rcu_dereference() won't really help, I forgot to explain why, see below. > #define xxx_wait_event(xxx, event) { > // comment to explain why > WARN_ON(current->exit_state); Otherwise this

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
On 12/05, Oleg Nesterov wrote: > > Yes, but on a second thought task_rcu_dereference() won't really help, I forgot to explain why, see below. > #define xxx_wait_event(xxx, event) { > // comment to explain why > WARN_ON(current->exit_state); Otherwise this

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
Davidlohr, Peter, I'll try to read this patch later, just one note. On 12/05, Peter Zijlstra wrote: > > On Fri, Dec 02, 2016 at 06:18:39PM -0800, Davidlohr Bueso wrote: > > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) > > */ > >

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Oleg Nesterov
Davidlohr, Peter, I'll try to read this patch later, just one note. On 12/05, Peter Zijlstra wrote: > > On Fri, Dec 02, 2016 at 06:18:39PM -0800, Davidlohr Bueso wrote: > > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) > > */ > >

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Peter Zijlstra
On Fri, Dec 02, 2016 at 06:18:39PM -0800, Davidlohr Bueso wrote: > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) >*/ > __this_cpu_dec(*sem->read_count); > > + rcu_read_lock(); > + writer = rcu_dereference(sem->writer); Don't think this is

Re: [PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-05 Thread Peter Zijlstra
On Fri, Dec 02, 2016 at 06:18:39PM -0800, Davidlohr Bueso wrote: > @@ -102,8 +103,13 @@ void __percpu_up_read(struct percpu_rw_semaphore *sem) >*/ > __this_cpu_dec(*sem->read_count); > > + rcu_read_lock(); > + writer = rcu_dereference(sem->writer); Don't think this is

[PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-02 Thread Davidlohr Bueso
The use of any kind of wait queue is an overkill for pcpu-rwsems. While one option would be to use the less heavy simple (swait) flavor, this is still too much for what pcpu-rwsems needs. For one, we do not care about any sort of queuing in that the only (rare) time writers (and readers, for that

[PATCH v2 2/3] locking/percpu-rwsem: Rework writer block/wake to not use wait-queues

2016-12-02 Thread Davidlohr Bueso
The use of any kind of wait queue is an overkill for pcpu-rwsems. While one option would be to use the less heavy simple (swait) flavor, this is still too much for what pcpu-rwsems needs. For one, we do not care about any sort of queuing in that the only (rare) time writers (and readers, for that