
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IC03L1 -------------------------------- When unmounting the resctrl system or removing a control group, move all its iommu_groups to the default resource group. When removing a monitor group, move its iommu_groups back to the parent control group. Signed-off-by: Zeng Heng <zengheng4@huawei.com> --- fs/resctrl/rdtgroup.c | 70 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c index ff1ed540477a..dc5d87224697 100644 --- a/fs/resctrl/rdtgroup.c +++ b/fs/resctrl/rdtgroup.c @@ -746,8 +746,7 @@ static int rdtgroup_move_task(pid_t pid, struct rdtgroup *rdtgrp, return ret; } -static int rdtgroup_move_iommu(int iommu_group_id, struct rdtgroup *rdtgrp, - struct kernfs_open_file *of) +static int rdtgroup_move_iommu(int iommu_group_id, struct rdtgroup *rdtgrp) { const struct cred *cred = current_cred(); struct iommu_group *iommu_group; @@ -782,6 +781,53 @@ static int rdtgroup_move_iommu(int iommu_group_id, struct rdtgroup *rdtgrp, return err; } +static bool iommu_matches_rdtgroup(struct iommu_group *group, struct rdtgroup *r) +{ + if (r->type == RDTCTRL_GROUP) + return resctrl_arch_match_iommu_closid(group, r->closid); + + return resctrl_arch_match_iommu_closid_rmid(group, r->closid, + r->mon.rmid); +} + +static int rdt_move_group_iommus(struct rdtgroup *from, struct rdtgroup *to) +{ + int err, iommu_group_id; + struct kset *iommu_groups; + struct iommu_group *group; + struct kobject *group_kobj = NULL; + + if (!IS_ENABLED(CONFIG_RESCTRL_IOMMU)) + return 0; + + if (from == to) + return 0; + + iommu_groups = iommu_get_group_kset(); + + while ((group_kobj = kset_get_next_obj(iommu_groups, group_kobj))) { + /* iommu_group_get_from_kobj() wants to drop a reference */ + kobject_get(group_kobj); + + group = iommu_group_get_from_kobj(group_kobj); + if (!group) + continue; + + if (!from || iommu_matches_rdtgroup(group, from)) { + err = kstrtoint(group_kobj->name, 0, &iommu_group_id); + if (err) + break; + + err = rdtgroup_move_iommu(iommu_group_id, to); + if (err) + break; + } + } + + kset_put(iommu_groups); + return err; +} + static bool string_is_iommu_group(char *buf, int *val) { if (!IS_ENABLED(CONFIG_RESCTRL_IOMMU)) @@ -827,7 +873,7 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, is_iommu = string_is_iommu_group(pid_str, &iommu_group_id); if (is_iommu) { - ret = rdtgroup_move_iommu(iommu_group_id, rdtgrp, of); + ret = rdtgroup_move_iommu(iommu_group_id, rdtgrp); if (ret) break; @@ -859,15 +905,6 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, return ret ?: nbytes; } -static bool iommu_matches_rdtgroup(struct iommu_group *group, struct rdtgroup *r) -{ - if (r->type == RDTCTRL_GROUP) - return resctrl_arch_match_iommu_closid(group, r->closid); - - return resctrl_arch_match_iommu_closid_rmid(group, r->closid, - r->mon.rmid); -} - static void show_rdt_iommu(struct rdtgroup *r, struct seq_file *s) { struct kset *iommu_groups; @@ -2881,6 +2918,9 @@ static void rmdir_all_sub(void) /* Move all tasks to the default resource group */ rdt_move_group_tasks(NULL, &rdtgroup_default, NULL); + /* Move all iommu_groups to the default resource group */ + rdt_move_group_iommus(NULL, &rdtgroup_default); + list_for_each_entry_safe(rdtgrp, tmp, &rdt_all_groups, rdtgroup_list) { /* Free any child rmids */ free_all_child_rdtgrp(rdtgrp); @@ -3602,6 +3642,9 @@ static int rdtgroup_rmdir_mon(struct rdtgroup *rdtgrp, cpumask_var_t tmpmask) /* Give any tasks back to the parent group */ rdt_move_group_tasks(rdtgrp, prdtgrp, tmpmask); + /* Give any iommu_groups back to the parent group */ + rdt_move_group_iommus(rdtgrp, prdtgrp); + /* Update per cpu rmid of the moved CPUs first */ for_each_cpu(cpu, &rdtgrp->cpu_mask) resctrl_arch_set_cpu_default_closid_rmid(cpu, rdtgrp->closid, @@ -3645,6 +3688,9 @@ static int rdtgroup_rmdir_ctrl(struct rdtgroup *rdtgrp, cpumask_var_t tmpmask) /* Give any tasks back to the default group */ rdt_move_group_tasks(rdtgrp, &rdtgroup_default, tmpmask); + /* Give any iommu_groups back to the default group */ + rdt_move_group_iommus(rdtgrp, &rdtgroup_default); + /* Give any CPUs back to the default group */ cpumask_or(&rdtgroup_default.cpu_mask, &rdtgroup_default.cpu_mask, &rdtgrp->cpu_mask); -- 2.25.1