Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 31 Jan 2020 19:05:33 +0000 (11:05 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 31 Jan 2020 19:05:33 +0000 (11:05 -0800)
Pull x86 fixes from Ingo Molnar:
 "Misc fixes:

   - three fixes and a cleanup for the resctrl code

   - a HyperV fix

   - a fix to /proc/kcore contents in live debugging sessions

   - a fix for the x86 decoder opcode map"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/decoder: Add TEST opcode to Group3-2
  x86/resctrl: Clean up unused function parameter in mkdir path
  x86/resctrl: Fix a deadlock due to inaccurate reference
  x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup
  x86/resctrl: Fix use-after-free when deleting resource groups
  x86/hyper-v: Add "polling" bit to hv_synic_sint
  x86/crash: Define arch_crash_save_vmcoreinfo() if CONFIG_CRASH_CORE=y

arch/x86/include/asm/hyperv-tlfs.h
arch/x86/kernel/Makefile
arch/x86/kernel/cpu/resctrl/rdtgroup.c
arch/x86/kernel/crash_core_32.c [new file with mode: 0644]
arch/x86/kernel/crash_core_64.c [new file with mode: 0644]
arch/x86/kernel/machine_kexec_32.c
arch/x86/kernel/machine_kexec_64.c
arch/x86/lib/x86-opcode-map.txt
tools/arch/x86/lib/x86-opcode-map.txt

index 5f10f7f..92abc1e 100644 (file)
@@ -809,7 +809,8 @@ union hv_synic_sint {
                u64 reserved1:8;
                u64 masked:1;
                u64 auto_eoi:1;
-               u64 reserved2:46;
+               u64 polling:1;
+               u64 reserved2:45;
        } __packed;
 };
 
index 6175e37..9b294c1 100644 (file)
@@ -94,6 +94,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += ftrace_$(BITS).o
 obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
 obj-$(CONFIG_FTRACE_SYSCALLS)  += ftrace.o
 obj-$(CONFIG_X86_TSC)          += trace_clock.o
+obj-$(CONFIG_CRASH_CORE)       += crash_core_$(BITS).o
 obj-$(CONFIG_KEXEC_CORE)       += machine_kexec_$(BITS).o
 obj-$(CONFIG_KEXEC_CORE)       += relocate_kernel_$(BITS).o crash.o
 obj-$(CONFIG_KEXEC_FILE)       += kexec-bzimage64.o
index 1504bca..8ca5e51 100644 (file)
@@ -2060,7 +2060,7 @@ static int rdt_get_tree(struct fs_context *fc)
 
        if (rdt_mon_capable) {
                ret = mongroup_create_dir(rdtgroup_default.kn,
-                                         NULL, "mon_groups",
+                                         &rdtgroup_default, "mon_groups",
                                          &kn_mongrp);
                if (ret < 0)
                        goto out_info;
@@ -2295,7 +2295,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);
        }
 }
 
@@ -2333,7 +2337,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);
@@ -2536,7 +2544,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;
 
@@ -2726,7 +2734,6 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
 }
 
 static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
-                            struct kernfs_node *prgrp_kn,
                             const char *name, umode_t mode,
                             enum rdt_group_type rtype, struct rdtgroup **r)
 {
@@ -2735,7 +2742,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);
        if (!prdtgrp) {
                ret = -ENODEV;
                goto out_unlock;
@@ -2808,7 +2815,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;
 
@@ -2819,7 +2826,7 @@ out_destroy:
 out_free_rgrp:
        kfree(rdtgrp);
 out_unlock:
-       rdtgroup_kn_unlock(prgrp_kn);
+       rdtgroup_kn_unlock(parent_kn);
        return ret;
 }
 
@@ -2836,15 +2843,12 @@ static void mkdir_rdt_prepare_clean(struct rdtgroup *rgrp)
  * to monitor a subset of tasks and cpus in its parent ctrl_mon group.
  */
 static int rdtgroup_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 rdtgroup *rdtgrp, *prgrp;
        int ret;
 
-       ret = mkdir_rdt_prepare(parent_kn, prgrp_kn, name, mode, RDTMON_GROUP,
-                               &rdtgrp);
+       ret = mkdir_rdt_prepare(parent_kn, name, mode, RDTMON_GROUP, &rdtgrp);
        if (ret)
                return ret;
 
@@ -2857,7 +2861,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;
 }
 
@@ -2866,7 +2870,6 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn,
  * to allocate and monitor resources.
  */
 static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
-                                  struct kernfs_node *prgrp_kn,
                                   const char *name, umode_t mode)
 {
        struct rdtgroup *rdtgrp;
@@ -2874,8 +2877,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
        u32 closid;
        int ret;
 
-       ret = mkdir_rdt_prepare(parent_kn, prgrp_kn, name, mode, RDTCTRL_GROUP,
-                               &rdtgrp);
+       ret = mkdir_rdt_prepare(parent_kn, name, mode, RDTCTRL_GROUP, &rdtgrp);
        if (ret)
                return ret;
 
@@ -2900,7 +2902,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_del_list;
@@ -2916,7 +2918,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;
 }
 
@@ -2949,14 +2951,14 @@ static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
         * subdirectory
         */
        if (rdt_alloc_capable && parent_kn == rdtgroup_default.kn)
-               return rdtgroup_mkdir_ctrl_mon(parent_kn, parent_kn, name, mode);
+               return rdtgroup_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 (rdt_mon_capable && is_mon_groups(parent_kn, name))
-               return rdtgroup_mkdir_mon(parent_kn, parent_kn->parent, name, mode);
+               return rdtgroup_mkdir_mon(parent_kn, name, mode);
 
        return -EPERM;
 }
@@ -3042,13 +3044,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
        closid_free(rdtgrp->closid);
        free_rmid(rdtgrp->mon.rmid);
 
+       rdtgroup_ctrl_remove(kn, rdtgrp);
+
        /*
         * Free all the child monitor group rmids.
         */
        free_all_child_rdtgrp(rdtgrp);
 
-       rdtgroup_ctrl_remove(kn, rdtgrp);
-
        return 0;
 }
 
diff --git a/arch/x86/kernel/crash_core_32.c b/arch/x86/kernel/crash_core_32.c
new file mode 100644 (file)
index 0000000..c0159a7
--- /dev/null
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/crash_core.h>
+
+#include <asm/pgtable.h>
+#include <asm/setup.h>
+
+void arch_crash_save_vmcoreinfo(void)
+{
+#ifdef CONFIG_NUMA
+       VMCOREINFO_SYMBOL(node_data);
+       VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
+#endif
+#ifdef CONFIG_X86_PAE
+       VMCOREINFO_CONFIG(X86_PAE);
+#endif
+}
diff --git a/arch/x86/kernel/crash_core_64.c b/arch/x86/kernel/crash_core_64.c
new file mode 100644 (file)
index 0000000..845a57e
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/crash_core.h>
+
+#include <asm/pgtable.h>
+#include <asm/setup.h>
+
+void arch_crash_save_vmcoreinfo(void)
+{
+       u64 sme_mask = sme_me_mask;
+
+       VMCOREINFO_NUMBER(phys_base);
+       VMCOREINFO_SYMBOL(init_top_pgt);
+       vmcoreinfo_append_str("NUMBER(pgtable_l5_enabled)=%d\n",
+                             pgtable_l5_enabled());
+
+#ifdef CONFIG_NUMA
+       VMCOREINFO_SYMBOL(node_data);
+       VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
+#endif
+       vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset());
+       VMCOREINFO_NUMBER(KERNEL_IMAGE_SIZE);
+       VMCOREINFO_NUMBER(sme_mask);
+}
index 7b45e8d..02bddfc 100644 (file)
@@ -250,15 +250,3 @@ void machine_kexec(struct kimage *image)
 
        __ftrace_enabled_restore(save_ftrace_enabled);
 }
-
-void arch_crash_save_vmcoreinfo(void)
-{
-#ifdef CONFIG_NUMA
-       VMCOREINFO_SYMBOL(node_data);
-       VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
-#endif
-#ifdef CONFIG_X86_PAE
-       VMCOREINFO_CONFIG(X86_PAE);
-#endif
-}
-
index 16e125a..ad5cdd6 100644 (file)
@@ -398,25 +398,6 @@ void machine_kexec(struct kimage *image)
        __ftrace_enabled_restore(save_ftrace_enabled);
 }
 
-void arch_crash_save_vmcoreinfo(void)
-{
-       u64 sme_mask = sme_me_mask;
-
-       VMCOREINFO_NUMBER(phys_base);
-       VMCOREINFO_SYMBOL(init_top_pgt);
-       vmcoreinfo_append_str("NUMBER(pgtable_l5_enabled)=%d\n",
-                       pgtable_l5_enabled());
-
-#ifdef CONFIG_NUMA
-       VMCOREINFO_SYMBOL(node_data);
-       VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
-#endif
-       vmcoreinfo_append_str("KERNELOFFSET=%lx\n",
-                             kaslr_offset());
-       VMCOREINFO_NUMBER(KERNEL_IMAGE_SIZE);
-       VMCOREINFO_NUMBER(sme_mask);
-}
-
 /* arch-dependent functionality related to kexec file-based syscall */
 
 #ifdef CONFIG_KEXEC_FILE
index 8908c58..53adc17 100644 (file)
@@ -929,7 +929,7 @@ EndTable
 
 GrpTable: Grp3_2
 0: TEST Ev,Iz
-1:
+1: TEST Ev,Iz
 2: NOT Ev
 3: NEG Ev
 4: MUL rAX,Ev
index 8908c58..53adc17 100644 (file)
@@ -929,7 +929,7 @@ EndTable
 
 GrpTable: Grp3_2
 0: TEST Ev,Iz
-1:
+1: TEST Ev,Iz
 2: NOT Ev
 3: NEG Ev
 4: MUL rAX,Ev