mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 07:30:16 +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 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
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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 @@ out_destroy:
|
|||||||
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)
|
|||||||
* 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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
* 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 @@ out_id_free:
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
__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);
|
__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
|
|||||||
|
|
||||||
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
|
|||||||
|
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user