Commit b70a2d6b authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

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
parents e813e650 6bd3357b
...@@ -809,7 +809,8 @@ union hv_synic_sint { ...@@ -809,7 +809,8 @@ union hv_synic_sint {
u64 reserved1:8; u64 reserved1:8;
u64 masked:1; u64 masked:1;
u64 auto_eoi:1; u64 auto_eoi:1;
u64 reserved2:46; u64 polling:1;
u64 reserved2:45;
} __packed; } __packed;
}; };
......
...@@ -94,6 +94,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += ftrace_$(BITS).o ...@@ -94,6 +94,7 @@ obj-$(CONFIG_FUNCTION_TRACER) += ftrace_$(BITS).o
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
obj-$(CONFIG_X86_TSC) += trace_clock.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) += machine_kexec_$(BITS).o
obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).o crash.o obj-$(CONFIG_KEXEC_CORE) += relocate_kernel_$(BITS).o crash.o
obj-$(CONFIG_KEXEC_FILE) += kexec-bzimage64.o obj-$(CONFIG_KEXEC_FILE) += kexec-bzimage64.o
......
...@@ -2060,7 +2060,7 @@ static int rdt_get_tree(struct fs_context *fc) ...@@ -2060,7 +2060,7 @@ static int rdt_get_tree(struct fs_context *fc)
if (rdt_mon_capable) { if (rdt_mon_capable) {
ret = mongroup_create_dir(rdtgroup_default.kn, ret = mongroup_create_dir(rdtgroup_default.kn,
NULL, "mon_groups", &rdtgroup_default, "mon_groups",
&kn_mongrp); &kn_mongrp);
if (ret < 0) if (ret < 0)
goto out_info; goto out_info;
...@@ -2295,7 +2295,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp) ...@@ -2295,7 +2295,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)
list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) {
free_rmid(sentry->mon.rmid); free_rmid(sentry->mon.rmid);
list_del(&sentry->mon.crdtgrp_list); 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) ...@@ -2333,7 +2337,11 @@ static void rmdir_all_sub(void)
kernfs_remove(rdtgrp->kn); kernfs_remove(rdtgrp->kn);
list_del(&rdtgrp->rdtgroup_list); 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 */ /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
update_closid_rmid(cpu_online_mask, &rdtgroup_default); update_closid_rmid(cpu_online_mask, &rdtgroup_default);
...@@ -2536,7 +2544,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn, ...@@ -2536,7 +2544,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn,
/* /*
* Create the mon_data directory first. * 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) if (ret)
return ret; return ret;
...@@ -2726,7 +2734,6 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) ...@@ -2726,7 +2734,6 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
} }
static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
struct kernfs_node *prgrp_kn,
const char *name, umode_t mode, const char *name, umode_t mode,
enum rdt_group_type rtype, struct rdtgroup **r) enum rdt_group_type rtype, struct rdtgroup **r)
{ {
...@@ -2735,7 +2742,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, ...@@ -2735,7 +2742,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
uint files = 0; uint files = 0;
int ret; int ret;
prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); prdtgrp = rdtgroup_kn_lock_live(parent_kn);
if (!prdtgrp) { if (!prdtgrp) {
ret = -ENODEV; ret = -ENODEV;
goto out_unlock; goto out_unlock;
...@@ -2808,7 +2815,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, ...@@ -2808,7 +2815,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
kernfs_activate(kn); kernfs_activate(kn);
/* /*
* The caller unlocks the prgrp_kn upon success. * The caller unlocks the parent_kn upon success.
*/ */
return 0; return 0;
...@@ -2819,7 +2826,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn, ...@@ -2819,7 +2826,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
out_free_rgrp: out_free_rgrp:
kfree(rdtgrp); kfree(rdtgrp);
out_unlock: out_unlock:
rdtgroup_kn_unlock(prgrp_kn); rdtgroup_kn_unlock(parent_kn);
return ret; return ret;
} }
...@@ -2836,15 +2843,12 @@ static void mkdir_rdt_prepare_clean(struct rdtgroup *rgrp) ...@@ -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. * to monitor a subset of tasks and cpus in its parent ctrl_mon group.
*/ */
static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, 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; struct rdtgroup *rdtgrp, *prgrp;
int ret; int ret;
ret = mkdir_rdt_prepare(parent_kn, prgrp_kn, name, mode, RDTMON_GROUP, ret = mkdir_rdt_prepare(parent_kn, name, mode, RDTMON_GROUP, &rdtgrp);
&rdtgrp);
if (ret) if (ret)
return ret; return ret;
...@@ -2857,7 +2861,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, ...@@ -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); list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list);
rdtgroup_kn_unlock(prgrp_kn); rdtgroup_kn_unlock(parent_kn);
return ret; return ret;
} }
...@@ -2866,7 +2870,6 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn, ...@@ -2866,7 +2870,6 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn,
* to allocate and monitor resources. * to allocate and monitor resources.
*/ */
static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, static int rdtgroup_mkdir_ctrl_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; struct rdtgroup *rdtgrp;
...@@ -2874,8 +2877,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, ...@@ -2874,8 +2877,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
u32 closid; u32 closid;
int ret; int ret;
ret = mkdir_rdt_prepare(parent_kn, prgrp_kn, name, mode, RDTCTRL_GROUP, ret = mkdir_rdt_prepare(parent_kn, name, mode, RDTCTRL_GROUP, &rdtgrp);
&rdtgrp);
if (ret) if (ret)
return ret; return ret;
...@@ -2900,7 +2902,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, ...@@ -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 * Create an empty mon_groups directory to hold the subset
* of tasks and cpus to monitor. * 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) { if (ret) {
rdt_last_cmd_puts("kernfs subdir error\n"); rdt_last_cmd_puts("kernfs subdir error\n");
goto out_del_list; goto out_del_list;
...@@ -2916,7 +2918,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn, ...@@ -2916,7 +2918,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
out_common_fail: out_common_fail:
mkdir_rdt_prepare_clean(rdtgrp); mkdir_rdt_prepare_clean(rdtgrp);
out_unlock: out_unlock:
rdtgroup_kn_unlock(prgrp_kn); rdtgroup_kn_unlock(parent_kn);
return ret; return ret;
} }
...@@ -2949,14 +2951,14 @@ static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name, ...@@ -2949,14 +2951,14 @@ static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
* subdirectory * subdirectory
*/ */
if (rdt_alloc_capable && parent_kn == rdtgroup_default.kn) 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 * If RDT monitoring is supported and the parent directory is a valid
* "mon_groups" directory, add a monitoring subdirectory. * "mon_groups" directory, add a monitoring subdirectory.
*/ */
if (rdt_mon_capable && is_mon_groups(parent_kn, name)) 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; return -EPERM;
} }
...@@ -3042,13 +3044,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp, ...@@ -3042,13 +3044,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
closid_free(rdtgrp->closid); closid_free(rdtgrp->closid);
free_rmid(rdtgrp->mon.rmid); free_rmid(rdtgrp->mon.rmid);
rdtgroup_ctrl_remove(kn, rdtgrp);
/* /*
* Free all the child monitor group rmids. * Free all the child monitor group rmids.
*/ */
free_all_child_rdtgrp(rdtgrp); free_all_child_rdtgrp(rdtgrp);
rdtgroup_ctrl_remove(kn, rdtgrp);
return 0; return 0;
} }
......
// 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
}
// 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);
}
...@@ -250,15 +250,3 @@ void machine_kexec(struct kimage *image) ...@@ -250,15 +250,3 @@ void machine_kexec(struct kimage *image)
__ftrace_enabled_restore(save_ftrace_enabled); __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
}
...@@ -398,25 +398,6 @@ void machine_kexec(struct kimage *image) ...@@ -398,25 +398,6 @@ void machine_kexec(struct kimage *image)
__ftrace_enabled_restore(save_ftrace_enabled); __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 */ /* arch-dependent functionality related to kexec file-based syscall */
#ifdef CONFIG_KEXEC_FILE #ifdef CONFIG_KEXEC_FILE
......
...@@ -929,7 +929,7 @@ EndTable ...@@ -929,7 +929,7 @@ EndTable
GrpTable: Grp3_2 GrpTable: Grp3_2
0: TEST Ev,Iz 0: TEST Ev,Iz
1: 1: TEST Ev,Iz
2: NOT Ev 2: NOT Ev
3: NEG Ev 3: NEG Ev
4: MUL rAX,Ev 4: MUL rAX,Ev
......
...@@ -929,7 +929,7 @@ EndTable ...@@ -929,7 +929,7 @@ EndTable
GrpTable: Grp3_2 GrpTable: Grp3_2
0: TEST Ev,Iz 0: TEST Ev,Iz
1: 1: TEST Ev,Iz
2: NOT Ev 2: NOT Ev
3: NEG Ev 3: NEG Ev
4: MUL rAX,Ev 4: MUL rAX,Ev
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment