Merge tag 'v5.10-rc6' into x86/cache
authorBorislav Petkov <bp@suse.de>
Tue, 1 Dec 2020 17:01:27 +0000 (18:01 +0100)
committerBorislav Petkov <bp@suse.de>
Tue, 1 Dec 2020 17:01:27 +0000 (18:01 +0100)
Merge -rc6 tag to pick up dependent changes.

Signed-off-by: Borislav Petkov <bp@suse.de>
1  2 
arch/x86/kernel/cpu/resctrl/rdtgroup.c

index 78dcbb8e0172a6b6951bb8ee599140eb4a35a612,6f4ca4bea62535452237a051b03fc3b77a851f8d..05a026d4420bcc0f8a4c8d15822ea9d075385c5c
@@@ -240,13 -240,13 +240,13 @@@ static ssize_t rdtgroup_file_write(stru
        return -EINVAL;
  }
  
 -static struct kernfs_ops rdtgroup_kf_single_ops = {
 +static const struct kernfs_ops rdtgroup_kf_single_ops = {
        .atomic_write_len       = PAGE_SIZE,
        .write                  = rdtgroup_file_write,
        .seq_show               = rdtgroup_seqfile_show,
  };
  
 -static struct kernfs_ops kf_mondata_ops = {
 +static const struct kernfs_ops kf_mondata_ops = {
        .atomic_write_len       = PAGE_SIZE,
        .seq_show               = rdtgroup_mondata_show,
  };
@@@ -507,6 -507,24 +507,24 @@@ unlock
        return ret ?: nbytes;
  }
  
+ /**
+  * rdtgroup_remove - the helper to remove resource group safely
+  * @rdtgrp: resource group to remove
+  *
+  * On resource group creation via a mkdir, an extra kernfs_node reference is
+  * taken to ensure that the rdtgroup structure remains accessible for the
+  * rdtgroup_kn_unlock() calls where it is removed.
+  *
+  * Drop the extra reference here, then free the rdtgroup structure.
+  *
+  * Return: void
+  */
+ static void rdtgroup_remove(struct rdtgroup *rdtgrp)
+ {
+       kernfs_put(rdtgrp->kn);
+       kfree(rdtgrp);
+ }
  struct task_move_callback {
        struct callback_head    work;
        struct rdtgroup         *rdtgrp;
@@@ -529,7 -547,7 +547,7 @@@ static void move_myself(struct callback
            (rdtgrp->flags & RDT_DELETED)) {
                current->closid = 0;
                current->rmid = 0;
-               kfree(rdtgrp);
+               rdtgroup_remove(rdtgrp);
        }
  
        if (unlikely(current->flags & PF_EXITING))
@@@ -1769,7 -1787,6 +1787,6 @@@ static int rdtgroup_mkdir_info_resdir(s
        if (IS_ERR(kn_subdir))
                return PTR_ERR(kn_subdir);
  
-       kernfs_get(kn_subdir);
        ret = rdtgroup_kn_set_ugid(kn_subdir);
        if (ret)
                return ret;
@@@ -1792,7 -1809,6 +1809,6 @@@ static int rdtgroup_create_info_dir(str
        kn_info = kernfs_create_dir(parent_kn, "info", parent_kn->mode, NULL);
        if (IS_ERR(kn_info))
                return PTR_ERR(kn_info);
-       kernfs_get(kn_info);
  
        ret = rdtgroup_add_files(kn_info, RF_TOP_INFO);
        if (ret)
                        goto out_destroy;
        }
  
-       /*
-        * This extra ref will be put in kernfs_remove() and guarantees
-        * that @rdtgrp->kn is always accessible.
-        */
-       kernfs_get(kn_info);
        ret = rdtgroup_kn_set_ugid(kn_info);
        if (ret)
                goto out_destroy;
@@@ -1847,12 -1857,6 +1857,6 @@@ mongroup_create_dir(struct kernfs_node 
        if (dest_kn)
                *dest_kn = kn;
  
-       /*
-        * This extra ref will be put in kernfs_remove() and guarantees
-        * that @rdtgrp->kn is always accessible.
-        */
-       kernfs_get(kn);
        ret = rdtgroup_kn_set_ugid(kn);
        if (ret)
                goto out_destroy;
@@@ -2079,8 -2083,7 +2083,7 @@@ void rdtgroup_kn_unlock(struct kernfs_n
                    rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
                        rdtgroup_pseudo_lock_remove(rdtgrp);
                kernfs_unbreak_active_protection(kn);
-               kernfs_put(rdtgrp->kn);
-               kfree(rdtgrp);
+               rdtgroup_remove(rdtgrp);
        } else {
                kernfs_unbreak_active_protection(kn);
        }
@@@ -2139,13 -2142,11 +2142,11 @@@ static int rdt_get_tree(struct fs_conte
                                          &kn_mongrp);
                if (ret < 0)
                        goto out_info;
-               kernfs_get(kn_mongrp);
  
                ret = mkdir_mondata_all(rdtgroup_default.kn,
                                        &rdtgroup_default, &kn_mondata);
                if (ret < 0)
                        goto out_mongrp;
-               kernfs_get(kn_mondata);
                rdtgroup_default.mon.mon_data_kn = kn_mondata;
        }
  
@@@ -2357,7 -2358,7 +2358,7 @@@ static void free_all_child_rdtgrp(struc
                if (atomic_read(&sentry->waitcount) != 0)
                        sentry->flags = RDT_DELETED;
                else
-                       kfree(sentry);
+                       rdtgroup_remove(sentry);
        }
  }
  
@@@ -2399,7 -2400,7 +2400,7 @@@ static void rmdir_all_sub(void
                if (atomic_read(&rdtgrp->waitcount) != 0)
                        rdtgrp->flags = RDT_DELETED;
                else
-                       kfree(rdtgrp);
+                       rdtgroup_remove(rdtgrp);
        }
        /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
        update_closid_rmid(cpu_online_mask, &rdtgroup_default);
@@@ -2499,11 -2500,6 +2500,6 @@@ static int mkdir_mondata_subdir(struct 
        if (IS_ERR(kn))
                return PTR_ERR(kn);
  
-       /*
-        * This extra ref will be put in kernfs_remove() and guarantees
-        * that kn is always accessible.
-        */
-       kernfs_get(kn);
        ret = rdtgroup_kn_set_ugid(kn);
        if (ret)
                goto out_destroy;
@@@ -2838,8 -2834,8 +2834,8 @@@ static int mkdir_rdt_prepare(struct ker
        /*
         * kernfs_remove() will drop the reference count on "kn" which
         * will free it. But we still need it to stick around for the
-        * rdtgroup_kn_unlock(kn} call below. Take one extra reference
-        * here, which will be dropped inside rdtgroup_kn_unlock().
+        * rdtgroup_kn_unlock(kn) call. Take one extra reference here,
+        * which will be dropped by kernfs_put() in rdtgroup_remove().
         */
        kernfs_get(kn);
  
  out_idfree:
        free_rmid(rdtgrp->mon.rmid);
  out_destroy:
+       kernfs_put(rdtgrp->kn);
        kernfs_remove(rdtgrp->kn);
  out_free_rgrp:
        kfree(rdtgrp);
@@@ -2892,7 -2889,7 +2889,7 @@@ static void mkdir_rdt_prepare_clean(str
  {
        kernfs_remove(rgrp->kn);
        free_rmid(rgrp->mon.rmid);
-       kfree(rgrp);
+       rdtgroup_remove(rgrp);
  }
  
  /*
@@@ -3049,11 -3046,6 +3046,6 @@@ static int rdtgroup_rmdir_mon(struct ke
        WARN_ON(list_empty(&prdtgrp->mon.crdtgrp_list));
        list_del(&rdtgrp->mon.crdtgrp_list);
  
-       /*
-        * one extra hold on this, will drop when we kfree(rdtgrp)
-        * in rdtgroup_kn_unlock()
-        */
-       kernfs_get(kn);
        kernfs_remove(rdtgrp->kn);
  
        return 0;
@@@ -3065,11 -3057,6 +3057,6 @@@ static int rdtgroup_ctrl_remove(struct 
        rdtgrp->flags = RDT_DELETED;
        list_del(&rdtgrp->rdtgroup_list);
  
-       /*
-        * one extra hold on this, will drop when we kfree(rdtgrp)
-        * in rdtgroup_kn_unlock()
-        */
-       kernfs_get(kn);
        kernfs_remove(rdtgrp->kn);
        return 0;
  }