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

!6199 writeback fix softlockup

Merge Pull Request from: @ci-robot 
 
PR sync from: Chen Ridong <chenridong@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/WUDDXN3IXZAN5BRLZ3YFDIWKAAKH3KRG/ 
*** BLURB HERE ***

Chen Ridong (1):
  cgroup_writeback: fix softlockup for blkcg->memcg_list


-- 
2.34.1
 
https://gitee.com/openeuler/kernel/issues/I99KM6 
 
Link:https://gitee.com/openeuler/kernel/pulls/6199

 

Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 2fa9d4e7 763aca82
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -438,8 +438,8 @@ static struct cgroup_subsys_state *cgwbv1_get_blkcss(struct mem_cgroup *memcg)
	struct cgroup_subsys_state *blkcg_css;

	rcu_read_lock();
	blkcg_css = memcg->wb_blk_css;
	if (!css_tryget_online(blkcg_css)) {
	blkcg_css = READ_ONCE(memcg->wb_blk_css);
	if (!blkcg_css || !css_tryget_online(blkcg_css)) {
		blkcg_css = blkcg_root_css;
		css_get(blkcg_css);
	}
@@ -1067,6 +1067,7 @@ EXPORT_SYMBOL(wait_iff_congested);
#include "../kernel/cgroup/cgroup-internal.h"

static bool cgroup1_writeback __read_mostly;
DEFINE_SPINLOCK(wb_blk_memlist_lock);

bool cgroup1_writeback_enabled(void)
{
@@ -1080,6 +1081,7 @@ static void wb_kill_memcg(struct cgroup_subsys_state *memcg_css)

	list_del_init(&memcg->memcg_node);
	css_put(memcg->wb_blk_css);
	memcg->wb_blk_css = NULL;
}

static void wb_kill_blkcg(struct cgroup_subsys_state *blkcg_css)
@@ -1103,24 +1105,26 @@ void wb_kill_memcg_blkcg(struct cgroup_subsys_state *css)
	if (!cgroup1_writeback)
		return;

	lockdep_assert_held(&cgroup_mutex);

	spin_lock(&wb_blk_memlist_lock);
	if (ss->id == io_cgrp_id)
		wb_kill_blkcg(css);
	else if (ss->id == memory_cgrp_id)
		wb_kill_memcg(css);
	spin_unlock(&wb_blk_memlist_lock);
}

void wb_attach_memcg_to_blkcg(struct cgroup_subsys_state *memcg_css,
			      struct cgroup_subsys_state *blkcg_css)
{
	struct mem_cgroup *memcg = mem_cgroup_from_css(memcg_css);
	struct cgroup_subsys_state *pre_blkcss = memcg->wb_blk_css;
	struct cgroup_subsys_state *pre_blkcss = NULL;
	struct blkcg *blkcg = css_to_blkcg(blkcg_css);

	if (!cgroup1_writeback)
		return;

	spin_lock(&wb_blk_memlist_lock);
	pre_blkcss = memcg->wb_blk_css;
	css_get(blkcg_css);
	memcg->wb_blk_css = blkcg_css;
	if (pre_blkcss == NULL)
@@ -1129,6 +1133,7 @@ void wb_attach_memcg_to_blkcg(struct cgroup_subsys_state *memcg_css,
		list_move(&memcg->memcg_node, &blkcg->memcg_list);
		css_put(pre_blkcss);
	}
	spin_unlock(&wb_blk_memlist_lock);
}

static int __init enable_cgroup1_writeback(char *s)
+2 −3
Original line number Diff line number Diff line
@@ -5862,11 +5862,10 @@ static int wb_blkio_show(struct seq_file *m, void *v)
		return -ENOMEM;

	rcu_read_lock();
	blkcg_css = memcg->wb_blk_css;
	if (!css_tryget_online(blkcg_css)) {
	blkcg_css = READ_ONCE(memcg->wb_blk_css);
	if (!blkcg_css || !css_tryget_online(blkcg_css)) {
		kfree(path);
		rcu_read_unlock();

		return -EINVAL;
	}
	blkcg_cgroup = blkcg_css->cgroup;