Re: [PATCH v2] locking/rwsem: Add reader-owned state to the owner field

From: Waiman Long
Date: Thu May 12 2016 - 19:14:03 EST


On 05/12/2016 05:27 PM, Peter Hurley wrote:
Arguably, this check should be bumped out to the optimistic spin and
reload/check the owner there?

Or better yet; don't pass the owner in as a parameter at all, but
instead snapshot the owner and check its ownership on entry.
That will make the main optimistic spinning loop more complex.
??

Simpler.

while (rwsem_spin_on_owner(sem)) {
if (rwsem_try_write_lock_unqueued(sem)) {
taken = true;
break;
}

if (!sem->owner&& (need_resched() || rt_task(current)))
break;

cpu_relax_lowlatency();
}




bool rwsem_spin_on_owner(struct rw_semaphore *sem)
{
struct task_struct *owner = READ_ONCE(sem->owner);

if (!rwsem_is_writer_owned(owner))
return false;

rcu_read_lock();
while (sem->owner == owner) {
....
}
rcu_read_unlock();

return !rwsem_is_reader_owned(sem->owner);
}


I have been thinking about something like that, but my inclination is to make as few changes as possible to the existing patch. I did add a new patch to streamline the code as suggested.

Cheers,
Longman