]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / arch / x86 / kernel / cpu / intel_rdt_rdtgroup.c
index 64c5ff97ee0d76c98e2e76869ddc30475a602599..eeba87919e5cb06b4b81dbaeffd9d7f4a508083c 100644 (file)
@@ -146,6 +146,7 @@ static int rdtgroup_add_file(struct kernfs_node *parent_kn, struct rftype *rft)
        int ret;
 
        kn = __kernfs_create_file(parent_kn, rft->name, rft->mode,
+                                 GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
                                  0, rft->kf_ops, rft, NULL, NULL);
        if (IS_ERR(kn))
                return PTR_ERR(kn);
@@ -1175,7 +1176,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type,
 
        if (rdt_mon_capable) {
                ret = mongroup_create_dir(rdtgroup_default.kn,
-                                         NULL, "mon_groups",
+                                         &rdtgroup_default, "mon_groups",
                                          &kn_mongrp);
                if (ret) {
                        dentry = ERR_PTR(ret);
@@ -1329,7 +1330,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)
        list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) {
                free_rmid(sentry->mon.rmid);
                list_del(&sentry->mon.crdtgrp_list);
-               kfree(sentry);
+
+               if (atomic_read(&sentry->waitcount) != 0)
+                       sentry->flags = RDT_DELETED;
+               else
+                       kfree(sentry);
        }
 }
 
@@ -1363,7 +1368,11 @@ static void rmdir_all_sub(void)
 
                kernfs_remove(rdtgrp->kn);
                list_del(&rdtgrp->rdtgroup_list);
-               kfree(rdtgrp);
+
+               if (atomic_read(&rdtgrp->waitcount) != 0)
+                       rdtgrp->flags = RDT_DELETED;
+               else
+                       kfree(rdtgrp);
        }
        /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
        update_closid_rmid(cpu_online_mask, &rdtgroup_default);
@@ -1405,7 +1414,8 @@ static int mon_addfile(struct kernfs_node *parent_kn, const char *name,
        struct kernfs_node *kn;
        int ret = 0;
 
-       kn = __kernfs_create_file(parent_kn, name, 0444, 0,
+       kn = __kernfs_create_file(parent_kn, name, 0444,
+                                 GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, 0,
                                  &kf_mondata_ops, priv, NULL, NULL);
        if (IS_ERR(kn))
                return PTR_ERR(kn);
@@ -1560,7 +1570,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn,
        /*
         * Create the mon_data directory first.
         */
-       ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn);
+       ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn);
        if (ret)
                return ret;
 
@@ -1594,7 +1604,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
        uint files = 0;
        int ret;
 
-       prdtgrp = rdtgroup_kn_lock_live(prgrp_kn);
+       prdtgrp = rdtgroup_kn_lock_live(parent_kn);
        rdt_last_cmd_clear();
        if (!prdtgrp) {
                ret = -ENODEV;
@@ -1661,7 +1671,7 @@ static int mkdir_rdt_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;
 
@@ -1672,7 +1682,7 @@ out_destroy:
 out_free_rgrp:
        kfree(rdtgrp);
 out_unlock:
-       rdtgroup_kn_unlock(prgrp_kn);
+       rdtgroup_kn_unlock(parent_kn);
        return ret;
 }
 
@@ -1710,7 +1720,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn,
         */
        list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list);
 
-       rdtgroup_kn_unlock(prgrp_kn);
+       rdtgroup_kn_unlock(parent_kn);
        return ret;
 }
 
@@ -1739,6 +1749,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
                goto out_common_fail;
        }
        closid = ret;
+       ret = 0;
 
        rdtgrp->closid = closid;
        list_add(&rdtgrp->rdtgroup_list, &rdt_all_groups);
@@ -1748,7 +1759,7 @@ static int rdtgroup_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_id_free;
@@ -1763,7 +1774,7 @@ out_id_free:
 out_common_fail:
        mkdir_rdt_prepare_clean(rdtgrp);
 out_unlock:
-       rdtgroup_kn_unlock(prgrp_kn);
+       rdtgroup_kn_unlock(parent_kn);
        return ret;
 }
 
@@ -1843,6 +1854,11 @@ static int rdtgroup_rmdir_mon(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
        kernfs_get(kn);
        kernfs_remove(rdtgrp->kn);
 
+       /*
+        * Free all the child monitor group rmids.
+        */
+       free_all_child_rdtgrp(rdtgrp);
+
        return 0;
 }
 
@@ -1875,11 +1891,6 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
        closid_free(rdtgrp->closid);
        free_rmid(rdtgrp->mon.rmid);
 
-       /*
-        * Free all the child monitor group rmids.
-        */
-       free_all_child_rdtgrp(rdtgrp);
-
        list_del(&rdtgrp->rdtgroup_list);
 
        /*