Re: [PATCH v2] locking/rwsem: reduce spinlock contention in wakeup after up_read/up_write

From: Waiman Long
Date: Fri Apr 24 2015 - 10:56:25 EST


On 04/23/2015 05:31 PM, Davidlohr Bueso wrote:
It would be nice to not run into this by accident. Please CC all
relevant parties ;)

On Thu, 2015-04-23 at 14:24 -0400, Waiman Long wrote:
In up_read()/up_write(), rwsem_wake() will be called whenever it
detects that some writers/readers are waiting. The rwsem_wake()
function will take the wait_lock and call __rwsem_do_wake() to do
the real wakeup. This can be a problem especially for up_read()
where many readers can potentially call rwsem_wake() at more or less
the same time even though a single call should be enough. This will
cause contention in the wait_lock cacheline resulting in delay of
the up_read/up_write operations.
Ok.

This patch makes the wait_lock taking and the call to __rwsem_do_wake()
optional if at least one spinning writer is present.
But if the lock is taken by readers, like you suggest above, there
cannot be any active spinners. We always block in these cases.

Yes, you are right. Will fix the log message.

Cheers,
Longman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/