Unverified Commit 377fe983 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!7593 memcg_swap_qos: Backport two bugfix

Merge Pull Request from: @ci-robot 
 
PR sync from: Liu Shixin <liushixin2@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/J6OQ4JCAU2EXTCEUH7XF3QOQRD63Q2UJ/ 
Backport two bugfix for memcg_swap_qos feature.

Liu Shixin (2):
  memcg: fix incorrect value of sysctl_memcg_swap_qos_stat
  mm/swapfile: fix infinite loop in get_swap_pages after set
    memory.swapfile


-- 
2.25.1
 
https://gitee.com/openeuler/kernel/issues/I9QRYN 
 
Link:https://gitee.com/openeuler/kernel/pulls/7593

 

Reviewed-by: default avatarZhang Peng <zhangpeng362@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 35332812 e426a342
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -4415,21 +4415,21 @@ static int sysctl_memcg_swap_qos_handler(struct ctl_table *table, int write,
			void __user *buffer, size_t *length, loff_t *ppos)
{
	int ret;
	int qos_stat_old = sysctl_memcg_swap_qos_stat;
	int qos_stat_old;
	int swap_type;
	static DEFINE_MUTEX(sysctl_mutex);

	mutex_lock(&sysctl_mutex);
	qos_stat_old = sysctl_memcg_swap_qos_stat;
	ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
	if (ret)
		return ret;

	if (write) {
	if (write && !ret) {
		if (qos_stat_old == sysctl_memcg_swap_qos_stat)
			return 0;
			goto unlock;

		switch (sysctl_memcg_swap_qos_stat) {
		case MEMCG_SWAP_STAT_DISABLE:
			static_branch_disable(&memcg_swap_qos_key);
			return 0;
			goto unlock;
		case MEMCG_SWAP_STAT_ALL:
			swap_type = SWAP_TYPE_ALL;
			break;
@@ -4438,16 +4438,26 @@ static int sysctl_memcg_swap_qos_handler(struct ctl_table *table, int write,
			break;
		}

		/*
		 * Enable the feature when it is in disabled state.
		 * If it is already in enabled state, don't allowed
		 * to switch it to other state directly since it is
		 * dangerous that will impact all memory cgroups.
		 */
		if (qos_stat_old == MEMCG_SWAP_STAT_DISABLE) {
			memcg_swap_qos_reset(swap_type);
			static_branch_enable(&memcg_swap_qos_key);
			enable_swap_slots_cache_max();
		} else {
			return -EINVAL;
			sysctl_memcg_swap_qos_stat = qos_stat_old;
			ret = -EINVAL;
		}
	}

	return 0;
unlock:
	mutex_unlock(&sysctl_mutex);

	return ret;
}
#endif

+3 −5
Original line number Diff line number Diff line
@@ -1171,15 +1171,13 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_order,
start_over:
	node = numa_node_id();
	plist_for_each_entry_safe(si, next, &swap_avail_heads[node], avail_lists[node]) {
		if (should_skip_swap_type(si->type, type))
			goto nextsi;

		/* requeue si to after same-priority siblings */
		plist_requeue(&si->avail_lists[node], &swap_avail_heads[node]);
		spin_unlock(&swap_avail_lock);
		spin_lock(&si->lock);
		if (should_skip_swap_type(si->type, type)) {
			spin_unlock(&si->lock);
			spin_lock(&swap_avail_lock);
			goto nextsi;
		}
		if (!si->highest_bit || !(si->flags & SWP_WRITEOK)) {
			spin_lock(&swap_avail_lock);
			if (plist_node_empty(&si->avail_lists[node])) {