mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
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
This commit is contained in:
commit
b70a2d6b29
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
17
arch/x86/kernel/crash_core_32.c
Normal file
17
arch/x86/kernel/crash_core_32.c
Normal file
@ -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
|
||||
}
|
24
arch/x86/kernel/crash_core_64.c
Normal file
24
arch/x86/kernel/crash_core_64.c
Normal file
@ -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);
|
||||
}
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user