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

!8783 v2 arm64 mpam fix patch

Merge Pull Request from: @ci-robot 
 
PR sync from: Yu Liao <liaoyu15@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/REHZRWITWU6P3JYW3AHWEEFBTKNW5I2B/ 
Some bugfix patches to address mpam issues.

Yu Liao (7):
  mpam/resctrl: Fix a deadlock due to inaccurate reference
  mpam/resctrl: Clean up unused function parameter in mkdir path
  mpam/resctrl: Clean up resctrl_group_rmdir_[ctrl/mon]()
  mpam/resctrl: Fix use-after-free due to inaccurate refcount of
    rdtgroup
  arm64/mpam: Fix wrong seconds to jiffies conversion
  arm64/mpam: Fix softlockup when reading mondata


-- 
2.33.0
 
https://gitee.com/openeuler/kernel/issues/I9PVOZ
https://gitee.com/openeuler/kernel/issues/I9NZ3E
https://gitee.com/openeuler/kernel/issues/I9SXQ8
https://gitee.com/openeuler/kernel/issues/I9RXHK 
 
Link:https://gitee.com/openeuler/kernel/pulls/8783

 

Reviewed-by: default avatarWei Li <liwei391@huawei.com>
Reviewed-by: default avatarLiu YongQiang <liuyongqiang13@huawei.com>
Signed-off-by: default avatarZhang Changzhong <zhangchangzhong@huawei.com>
parents 8e8fd59e ce54788e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -289,6 +289,7 @@ static void resctrl_group_update_domain_ctrls(struct rdtgroup *rdtgrp,
			resctrl_cdp_mpamid_map_val(entry->closid.reqpartid,
					cfg[i].conf_type, closid.reqpartid);
			resctrl_dom_ctrl_config(cdp_both_ctrl, r, dom, &para);
			cond_resched();
		}
	}
}
@@ -662,6 +663,8 @@ int resctrl_group_mondata_show(struct seq_file *m, void *arg)
				r->rid), type, md.u.mon);

			usage += resctrl_dom_mon_data(r, d, md.priv);

			cond_resched();
		}
	}

+3 −3
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ static u64 cache_rdmon(struct rdt_domain *d, void *md_priv)
	 * We should judge if return is OK, it is possible affected
	 * by NRDY bit.
	 */
	timeout = READ_ONCE(jiffies) + (1*SEC_CONVERSION);
	timeout = READ_ONCE(jiffies) + msecs_to_jiffies(1000);
	do {
		if (time_after(READ_ONCE(jiffies), timeout)) {
			err = -ETIMEDOUT;
@@ -508,7 +508,7 @@ static u64 mbw_rdmon(struct rdt_domain *d, void *md_priv)
	 * We should judge if return is OK, it is possible affected
	 * by NRDY bit.
	 */
	timeout = READ_ONCE(jiffies) + (1*SEC_CONVERSION);
	timeout = READ_ONCE(jiffies) + msecs_to_jiffies(1000);
	do {
		if (time_after(READ_ONCE(jiffies), timeout)) {
			err = -ETIMEDOUT;
@@ -1401,7 +1401,7 @@ int __resctrl_group_move_task(struct task_struct *tsk,
	struct task_move_callback *callback;
	int ret;

	callback = kzalloc(sizeof(*callback), GFP_KERNEL);
	callback = kzalloc(sizeof(*callback), GFP_NOWAIT);
	if (!callback)
		return -ENOMEM;
	callback->work.func = move_myself;
+21 −36
Original line number Diff line number Diff line
@@ -360,7 +360,7 @@ static struct dentry *resctrl_mount(struct file_system_type *fs_type,

	if (resctrl_mon_capable) {
		ret = mongroup_create_dir(resctrl_group_default.kn,
					  NULL, "mon_groups",
					  &resctrl_group_default, "mon_groups",
					  &kn_mongrp);
		if (ret) {
			dentry = ERR_PTR(ret);
@@ -585,7 +585,6 @@ static int find_rdtgrp_allocable_rmid(struct resctrl_group *rdtgrp)
}

static int mkdir_resctrl_prepare(struct kernfs_node *parent_kn,
			     struct kernfs_node *prgrp_kn,
			     const char *name, umode_t mode,
			     enum rdt_group_type rtype, struct resctrl_group **r)
{
@@ -594,7 +593,7 @@ static int mkdir_resctrl_prepare(struct kernfs_node *parent_kn,
	uint files = 0;
	int ret;

	prdtgrp = resctrl_group_kn_lock_live(prgrp_kn);
	prdtgrp = resctrl_group_kn_lock_live(parent_kn);
	rdt_last_cmd_clear();
	if (!prdtgrp) {
		ret = -ENODEV;
@@ -683,7 +682,7 @@ static int mkdir_resctrl_prepare(struct kernfs_node *parent_kn,
	kernfs_activate(kn);

	/*
	 * The caller unlocks the prgrp_kn upon success.
	 * The caller unlocks the parent_kn upon success.
	 */
	return 0;

@@ -700,7 +699,7 @@ static int mkdir_resctrl_prepare(struct kernfs_node *parent_kn,
out_free_rdtgrp:
	kfree(rdtgrp);
out_unlock:
	resctrl_group_kn_unlock(prgrp_kn);
	resctrl_group_kn_unlock(parent_kn);
	return ret;
}

@@ -716,14 +715,12 @@ static void mkdir_resctrl_prepare_clean(struct resctrl_group *rgrp)
 * to monitor a subset of tasks and cpus in its parent ctrl_mon group.
 */
static int resctrl_group_mkdir_mon(struct kernfs_node *parent_kn,
			      struct kernfs_node *prgrp_kn,
			      const char *name,
			      umode_t mode)
			      const char *name, umode_t mode)
{
	struct resctrl_group *rdtgrp, *prgrp;
	int ret;

	ret = mkdir_resctrl_prepare(parent_kn, prgrp_kn, name, mode, RDTMON_GROUP,
	ret = mkdir_resctrl_prepare(parent_kn, name, mode, RDTMON_GROUP,
				&rdtgrp);
	if (ret)
		return ret;
@@ -741,7 +738,7 @@ static int resctrl_group_mkdir_mon(struct kernfs_node *parent_kn,
	 */
	ret = resctrl_update_groups_config(prgrp);

	resctrl_group_kn_unlock(prgrp_kn);
	resctrl_group_kn_unlock(parent_kn);
	return ret;
}

@@ -750,14 +747,13 @@ static int resctrl_group_mkdir_mon(struct kernfs_node *parent_kn,
 * to allocate and monitor resources.
 */
static int resctrl_group_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
				   struct kernfs_node *prgrp_kn,
				   const char *name, umode_t mode)
{
	struct resctrl_group *rdtgrp;
	struct kernfs_node *kn;
	int ret;

	ret = mkdir_resctrl_prepare(parent_kn, prgrp_kn, name, mode, RDTCTRL_GROUP,
	ret = mkdir_resctrl_prepare(parent_kn, name, mode, RDTCTRL_GROUP,
				&rdtgrp);
	if (ret)
		return ret;
@@ -775,7 +771,7 @@ static int resctrl_group_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
		 * Create an empty mon_groups directory to hold the subset
		 * of tasks and cpus to monitor.
		 */
		ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL);
		ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL);
		if (ret) {
			rdt_last_cmd_puts("kernfs subdir error\n");
			goto out_list_del;
@@ -789,7 +785,7 @@ static int resctrl_group_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
out_common_fail:
	mkdir_resctrl_prepare_clean(rdtgrp);
out_unlock:
	resctrl_group_kn_unlock(prgrp_kn);
	resctrl_group_kn_unlock(parent_kn);
	return ret;
}

@@ -822,19 +818,19 @@ static int resctrl_group_mkdir(struct kernfs_node *parent_kn, const char *name,
	 * subdirectory
	 */
	if (resctrl_alloc_capable && parent_kn == resctrl_group_default.kn)
		return resctrl_group_mkdir_ctrl_mon(parent_kn, parent_kn, name, mode);
		return resctrl_group_mkdir_ctrl_mon(parent_kn, name, mode);

	/*
	 * If RDT monitoring is supported and the parent directory is a valid
	 * "mon_groups" directory, add a monitoring subdirectory.
	 */
	if (resctrl_mon_capable && is_mon_groups(parent_kn, name))
		return resctrl_group_mkdir_mon(parent_kn, parent_kn->parent, name, mode);
		return resctrl_group_mkdir_mon(parent_kn, name, mode);

	return -EPERM;
}

static void resctrl_group_rm_mon(struct resctrl_group *rdtgrp,
static int resctrl_group_rmdir_mon(struct kernfs_node *kn, struct resctrl_group *rdtgrp,
			      cpumask_var_t tmpmask)
{
	struct resctrl_group *prdtgrp = rdtgrp->mon.parent;
@@ -865,19 +861,14 @@ static void resctrl_group_rm_mon(struct resctrl_group *rdtgrp,
	 */
	WARN_ON(list_empty(&prdtgrp->mon.crdtgrp_list));
	list_del(&rdtgrp->mon.crdtgrp_list);
}

static int resctrl_group_rmdir_mon(struct kernfs_node *kn, struct resctrl_group *rdtgrp,
			      cpumask_var_t tmpmask)
{
	resctrl_group_rm_mon(rdtgrp, tmpmask);

	kernfs_remove(rdtgrp->kn);

	return 0;
}

static void resctrl_group_rm_ctrl(struct resctrl_group *rdtgrp, cpumask_var_t tmpmask)
static int resctrl_group_rmdir_ctrl(struct kernfs_node *kn, struct resctrl_group *rdtgrp,
			       cpumask_var_t tmpmask)
{
	int cpu;

@@ -903,25 +894,18 @@ static void resctrl_group_rm_ctrl(struct resctrl_group *rdtgrp, cpumask_var_t tm
	cpumask_or(tmpmask, tmpmask, &rdtgrp->cpu_mask);
	update_closid_rmid(tmpmask, NULL);

	rdtgrp->flags |= RDT_DELETED;
	closid_free(rdtgrp->closid.intpartid);
	rmid_free(rdtgrp->mon.rmid);

	rdtgrp->flags |= RDT_DELETED;
	list_del(&rdtgrp->resctrl_group_list);

	kernfs_remove(rdtgrp->kn);
	/*
	 * Free all the child monitor group rmids.
	 */
	free_all_child_rdtgrp(rdtgrp);

	list_del(&rdtgrp->resctrl_group_list);
}

static int resctrl_group_rmdir_ctrl(struct kernfs_node *kn, struct resctrl_group *rdtgrp,
			       cpumask_var_t tmpmask)
{
	resctrl_group_rm_ctrl(rdtgrp, tmpmask);

	kernfs_remove(rdtgrp->kn);

	return 0;
}

@@ -948,7 +932,8 @@ static int resctrl_group_rmdir(struct kernfs_node *kn)
	 * If the resctrl_group is a mon group and parent directory
	 * is a valid "mon_groups" directory, remove the mon group.
	 */
	if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == resctrl_group_default.kn)
	if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == resctrl_group_default.kn &&
	    rdtgrp != &resctrl_group_default)
		ret = resctrl_group_rmdir_ctrl(kn, rdtgrp, tmpmask);
	else if (rdtgrp->type == RDTMON_GROUP &&
		 is_mon_groups(parent_kn, kn->name))