On Tue, May 15, 2018 at 01:06:33PM +0200, Oleg Nesterov wrote: > On 05/15, Peter Zijlstra wrote: > > > > So what's wrong with adding: > > > > if (!read) > > sem->rw_sem.owner = current; > > Agreed, I have already suggested this change twice. Except we obviously > need to check CONFIG_RWSEM_SPIN_ON_OWNER (->owner doesn't exists otherwise) > or even CONFIG_DEBUG_RWSEMS to make the purpose more clear. Right, details ;-) > > Afaict the whole .owner=NULL thing in release already stops the spinners > > Not really, the new writer will spin in this case, afaics. > > But this is another problem and probably we do not care. The new writer is > almost impossible in this particular case, another freeze_super() should > notice frozen != SB_UNFROZEN and return EBUSY. rwsem_spin_on_owner() checks rwsem_owner_is_writer(), which does owner && owner != RWSEM_READER_OWNED, which will fail for !owner. Or am I completely confused again? > > and the above 'fixes' the debug splat. > > Yes. > > Waiman, can't we trivially fix the problem first? Then we can add the helpers > and think about other improvements. It is really simple; we're not going to add public (and EXPORT'ed to boot) interfaces to rwsem for this.