Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 apic updates from Ingo Molnar: "Misc changes: - optimize (reduce) IRQ handler tracing overhead (Wanpeng Li) - clean up MSR helpers (Borislav Petkov) - fix build warning on some configs (Sebastian Andrzej Siewior)" * 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/msr: Cleanup/streamline MSR helpers x86/apic: Prevent tracing on apic_msr_write_eoi() x86/msr: Add wrmsr_notrace() x86/apic: Get rid of "warning: 'acpi_ioapic_lock' defined but not used"
This commit is contained in:
@@ -196,7 +196,7 @@ static inline void native_apic_msr_write(u32 reg, u32 v)
|
||||
|
||||
static inline void native_apic_msr_eoi_write(u32 reg, u32 v)
|
||||
{
|
||||
wrmsr(APIC_BASE_MSR + (APIC_EOI >> 4), APIC_EOI_ACK, 0);
|
||||
wrmsr_notrace(APIC_BASE_MSR + (APIC_EOI >> 4), APIC_EOI_ACK, 0);
|
||||
}
|
||||
|
||||
static inline u32 native_apic_msr_read(u32 reg)
|
||||
@@ -332,6 +332,7 @@ struct apic {
|
||||
* on write for EOI.
|
||||
*/
|
||||
void (*eoi_write)(u32 reg, u32 v);
|
||||
void (*native_eoi_write)(u32 reg, u32 v);
|
||||
u64 (*icr_read)(void);
|
||||
void (*icr_write)(u32 low, u32 high);
|
||||
void (*wait_icr_idle)(void);
|
||||
|
@@ -70,14 +70,14 @@ extern struct tracepoint __tracepoint_read_msr;
|
||||
extern struct tracepoint __tracepoint_write_msr;
|
||||
extern struct tracepoint __tracepoint_rdpmc;
|
||||
#define msr_tracepoint_active(t) static_key_false(&(t).key)
|
||||
extern void do_trace_write_msr(unsigned msr, u64 val, int failed);
|
||||
extern void do_trace_read_msr(unsigned msr, u64 val, int failed);
|
||||
extern void do_trace_rdpmc(unsigned msr, u64 val, int failed);
|
||||
extern void do_trace_write_msr(unsigned int msr, u64 val, int failed);
|
||||
extern void do_trace_read_msr(unsigned int msr, u64 val, int failed);
|
||||
extern void do_trace_rdpmc(unsigned int msr, u64 val, int failed);
|
||||
#else
|
||||
#define msr_tracepoint_active(t) false
|
||||
static inline void do_trace_write_msr(unsigned msr, u64 val, int failed) {}
|
||||
static inline void do_trace_read_msr(unsigned msr, u64 val, int failed) {}
|
||||
static inline void do_trace_rdpmc(unsigned msr, u64 val, int failed) {}
|
||||
static inline void do_trace_write_msr(unsigned int msr, u64 val, int failed) {}
|
||||
static inline void do_trace_read_msr(unsigned int msr, u64 val, int failed) {}
|
||||
static inline void do_trace_rdpmc(unsigned int msr, u64 val, int failed) {}
|
||||
#endif
|
||||
|
||||
static inline unsigned long long native_read_msr(unsigned int msr)
|
||||
@@ -115,22 +115,36 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
|
||||
}
|
||||
|
||||
/* Can be uninlined because referenced by paravirt */
|
||||
notrace static inline void native_write_msr(unsigned int msr,
|
||||
unsigned low, unsigned high)
|
||||
static inline void notrace
|
||||
__native_write_msr_notrace(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
asm volatile("1: wrmsr\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_wrmsr_unsafe)
|
||||
: : "c" (msr), "a"(low), "d" (high) : "memory");
|
||||
}
|
||||
|
||||
/* Can be uninlined because referenced by paravirt */
|
||||
static inline void notrace
|
||||
native_write_msr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
__native_write_msr_notrace(msr, low, high);
|
||||
if (msr_tracepoint_active(__tracepoint_write_msr))
|
||||
do_trace_write_msr(msr, ((u64)high << 32 | low), 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wrmsr_notrace(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
__native_write_msr_notrace(msr, low, high);
|
||||
}
|
||||
|
||||
/* Can be uninlined because referenced by paravirt */
|
||||
notrace static inline int native_write_msr_safe(unsigned int msr,
|
||||
unsigned low, unsigned high)
|
||||
static inline int notrace
|
||||
native_write_msr_safe(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
int err;
|
||||
|
||||
asm volatile("2: wrmsr ; xor %[err],%[err]\n"
|
||||
"1:\n\t"
|
||||
".section .fixup,\"ax\"\n\t"
|
||||
@@ -223,7 +237,7 @@ do { \
|
||||
(void)((high) = (u32)(__val >> 32)); \
|
||||
} while (0)
|
||||
|
||||
static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
|
||||
static inline void wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
native_write_msr(msr, low, high);
|
||||
}
|
||||
@@ -231,13 +245,13 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
|
||||
#define rdmsrl(msr, val) \
|
||||
((val) = native_read_msr((msr)))
|
||||
|
||||
static inline void wrmsrl(unsigned msr, u64 val)
|
||||
static inline void wrmsrl(unsigned int msr, u64 val)
|
||||
{
|
||||
native_write_msr(msr, (u32)(val & 0xffffffffULL), (u32)(val >> 32));
|
||||
}
|
||||
|
||||
/* wrmsr with exception handling */
|
||||
static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
||||
static inline int wrmsr_safe(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
return native_write_msr_safe(msr, low, high);
|
||||
}
|
||||
@@ -252,7 +266,7 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
||||
__err; \
|
||||
})
|
||||
|
||||
static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
|
||||
static inline int rdmsrl_safe(unsigned int msr, unsigned long long *p)
|
||||
{
|
||||
int err;
|
||||
|
||||
@@ -325,12 +339,12 @@ static inline int wrmsrl_on_cpu(unsigned int cpu, u32 msr_no, u64 q)
|
||||
static inline void rdmsr_on_cpus(const struct cpumask *m, u32 msr_no,
|
||||
struct msr *msrs)
|
||||
{
|
||||
rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h));
|
||||
rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h));
|
||||
}
|
||||
static inline void wrmsr_on_cpus(const struct cpumask *m, u32 msr_no,
|
||||
struct msr *msrs)
|
||||
{
|
||||
wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h);
|
||||
wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h);
|
||||
}
|
||||
static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no,
|
||||
u32 *l, u32 *h)
|
||||
|
Reference in New Issue
Block a user