1

x86/msr: Prepare for including <linux/percpu.h> into <asm/msr.h>

To clean up the per CPU insanity of UP which causes sparse to be rightfully
unhappy and prevents the usage of the generic per CPU accessors on cpu_info
it is necessary to include <linux/percpu.h> into <asm/msr.h>.

Including <linux/percpu.h> into <asm/msr.h> is impossible because it ends
up in header dependency hell. The problem is that <asm/processor.h>
includes <asm/msr.h>. The inclusion of <linux/percpu.h> results in a
compile fail where the compiler cannot longer handle an include in
<asm/cpufeature.h> which references boot_cpu_data which is
defined in <asm/processor.h>.

The only reason why <asm/msr.h> is included in <asm/processor.h> are the
set/get_debugctlmsr() inlines. They are defined there because <asm/processor.h>
is such a nice dump ground for everything. In fact they belong obviously
into <asm/debugreg.h>.

Move them to <asm/debugreg.h> and fix up the resulting damage which is just
exposing the reliance on random include chains.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20240304005104.454678686@linutronix.de
This commit is contained in:
Thomas Gleixner 2024-03-04 11:12:19 +01:00 committed by Ingo Molnar
parent 9eae297d5d
commit 154fcf3a78
10 changed files with 36 additions and 25 deletions

View File

@ -17,6 +17,7 @@
#include <linux/kvm_host.h> #include <linux/kvm_host.h>
#include <asm/cpufeature.h> #include <asm/cpufeature.h>
#include <asm/debugreg.h>
#include <asm/hardirq.h> #include <asm/hardirq.h>
#include <asm/intel-family.h> #include <asm/intel-family.h>
#include <asm/intel_pt.h> #include <asm/intel_pt.h>

View File

@ -5,6 +5,7 @@
#include <linux/sched/clock.h> #include <linux/sched/clock.h>
#include <asm/cpu_entry_area.h> #include <asm/cpu_entry_area.h>
#include <asm/debugreg.h>
#include <asm/perf_event.h> #include <asm/perf_event.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/insn.h> #include <asm/insn.h>

View File

@ -5,7 +5,9 @@
#include <linux/bug.h> #include <linux/bug.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <uapi/asm/debugreg.h> #include <uapi/asm/debugreg.h>
#include <asm/cpufeature.h> #include <asm/cpufeature.h>
#include <asm/msr.h>
DECLARE_PER_CPU(unsigned long, cpu_dr7); DECLARE_PER_CPU(unsigned long, cpu_dr7);
@ -159,4 +161,26 @@ static inline unsigned long amd_get_dr_addr_mask(unsigned int dr)
} }
#endif #endif
static inline unsigned long get_debugctlmsr(void)
{
unsigned long debugctlmsr = 0;
#ifndef CONFIG_X86_DEBUGCTLMSR
if (boot_cpu_data.x86 < 6)
return 0;
#endif
rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
return debugctlmsr;
}
static inline void update_debugctlmsr(unsigned long debugctlmsr)
{
#ifndef CONFIG_X86_DEBUGCTLMSR
if (boot_cpu_data.x86 < 6)
return;
#endif
wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
}
#endif /* _ASM_X86_DEBUGREG_H */ #endif /* _ASM_X86_DEBUGREG_H */

View File

@ -6,7 +6,7 @@
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#include <asm/msr-index.h> #include <asm/msr.h>
/* /*
* Read/write a task's FSBASE or GSBASE. This returns the value that * Read/write a task's FSBASE or GSBASE. This returns the value that

View File

@ -576,28 +576,6 @@ extern void cpu_init(void);
extern void cpu_init_exception_handling(void); extern void cpu_init_exception_handling(void);
extern void cr4_init(void); extern void cr4_init(void);
static inline unsigned long get_debugctlmsr(void)
{
unsigned long debugctlmsr = 0;
#ifndef CONFIG_X86_DEBUGCTLMSR
if (boot_cpu_data.x86 < 6)
return 0;
#endif
rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
return debugctlmsr;
}
static inline void update_debugctlmsr(unsigned long debugctlmsr)
{
#ifndef CONFIG_X86_DEBUGCTLMSR
if (boot_cpu_data.x86 < 6)
return;
#endif
wrmsrl(MSR_IA32_DEBUGCTLMSR, debugctlmsr);
}
extern void set_task_blockstep(struct task_struct *task, bool on); extern void set_task_blockstep(struct task_struct *task, bool on);
/* Boot loader type from the setup header: */ /* Boot loader type from the setup header: */

View File

@ -2,11 +2,11 @@
#ifndef _ASM_X86_SPECIAL_INSNS_H #ifndef _ASM_X86_SPECIAL_INSNS_H
#define _ASM_X86_SPECIAL_INSNS_H #define _ASM_X86_SPECIAL_INSNS_H
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/nops.h> #include <asm/nops.h>
#include <asm/processor-flags.h> #include <asm/processor-flags.h>
#include <linux/errno.h>
#include <linux/irqflags.h> #include <linux/irqflags.h>
#include <linux/jump_label.h> #include <linux/jump_label.h>

View File

@ -7,6 +7,8 @@
* Author: * Author:
* Kirill A. Shutemov <kirill.shutemov@linux.intel.com> * Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
*/ */
#include <linux/bug.h>
#include <linux/limits.h>
#include <asm/cpufeature.h> #include <asm/cpufeature.h>
#include <asm/intel_pconfig.h> #include <asm/intel_pconfig.h>

View File

@ -6,6 +6,7 @@
* Authors: Fenghua Yu <fenghua.yu@intel.com>, * Authors: Fenghua Yu <fenghua.yu@intel.com>,
* H. Peter Anvin <hpa@linux.intel.com> * H. Peter Anvin <hpa@linux.intel.com>
*/ */
#include <linux/printk.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/archrandom.h> #include <asm/archrandom.h>

View File

@ -2,6 +2,8 @@
/* /*
* x86 FPU bug checks: * x86 FPU bug checks:
*/ */
#include <linux/printk.h>
#include <asm/cpufeature.h> #include <asm/cpufeature.h>
#include <asm/fpu/api.h> #include <asm/fpu/api.h>

View File

@ -6,7 +6,9 @@
#include <linux/sched/task_stack.h> #include <linux/sched/task_stack.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/debugreg.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs) unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs)