Commit 06c59d89 authored by Zheng Zengkai's avatar Zheng Zengkai Committed by openeuler-sync-bot
Browse files

Revert "locking/rwsem: Prevent potential lock starvation"

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7F5L7


CVE: NA

--------------------------------

2f06f702 ("locking/rwsem: Prevent potential lock starvation"):
This patch may have some impact on reader performance as it reduces
reader optimistic spinning especially if the lock critical sections
are short the number of contending readers are small.

This patch will lead to 30%+ performance degradation to fio write_iops_blocksize
4KB testcase, and we stress the system with mysql tpcc for 12 hours,
no hungtask occur, So revert this patchset temporarily.

This reverts commit f66f7f34.

Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
(cherry picked from commit d2f1b785)
parent 59bdc5d7
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -998,27 +998,16 @@ rwsem_spin_on_owner(struct rw_semaphore *sem, unsigned long nonspinnable)
static struct rw_semaphore __sched *
rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, int state)
{
	long owner, adjustment = -RWSEM_READER_BIAS;
	long rcnt = (count >> RWSEM_READER_SHIFT);
	long adjustment = -RWSEM_READER_BIAS;
	struct rwsem_waiter waiter;
	DEFINE_WAKE_Q(wake_q);
	bool wake = false;

	/*
	 * To prevent a constant stream of readers from starving a sleeping
	 * waiter, don't attempt optimistic spinning if the lock is currently
	 * owned by readers.
	 */
	owner = atomic_long_read(&sem->owner);
	if ((owner & RWSEM_READER_OWNED) && (rcnt > 1) &&
	   !(count & RWSEM_WRITER_LOCKED))
		goto queue;

	/*
	 * Save the current read-owner of rwsem, if available, and the
	 * reader nonspinnable bit.
	 */
	waiter.last_rowner = owner;
	waiter.last_rowner = atomic_long_read(&sem->owner);
	if (!(waiter.last_rowner & RWSEM_READER_OWNED))
		waiter.last_rowner &= RWSEM_RD_NONSPINNABLE;