* [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
@ 2016-10-14 1:48 Wanpeng Li
2016-10-14 12:19 ` [tip:x86/urgent] " tip-bot for Wanpeng Li
2016-10-16 13:39 ` [PATCH] " Peter Zijlstra
0 siblings, 2 replies; 15+ messages in thread
From: Wanpeng Li @ 2016-10-14 1:48 UTC (permalink / raw)
To: linux-kernel
Cc: Wanpeng Li, Ingo Molnar, Mike Galbraith, Peter Zijlstra, Thomas Gleixner
===============================
[ INFO: suspicious RCU usage. ]
4.8.0+ #24 Not tainted
-------------------------------
./arch/x86/include/asm/msr-trace.h:47 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active = 1, debug_locks = 0
RCU used illegally from extended quiescent state!
no locks held by swapper/1/0.
stack backtrace:
CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.8.0+ #24
Hardware name: Dell Inc. OptiPlex 7020/0F5C5X, BIOS A03 01/08/2015
ffff90285de03f58 ffffffff9d44a0c9 ffff90285ca5d100 0000000000000001
ffff90285de03f88 ffffffff9d0ebd67 ffff902845165410 000000000000080b
0000000000000000 0000000000000000 ffff90285de03fb8 ffffffff9d492b95
Call Trace:
<IRQ> [<ffffffff9d44a0c9>] dump_stack+0x99/0xd0
[<ffffffff9d0ebd67>] lockdep_rcu_suspicious+0xe7/0x120
[<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
[<ffffffff9d06f860>] native_write_msr+0x20/0x30
[<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
[<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
[<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
<EOI> [<ffffffff9d732634>] ? cpuidle_enter_state+0xe4/0x360
[<ffffffff9d73261f>] ? cpuidle_enter_state+0xcf/0x360
[<ffffffff9d7328e7>] cpuidle_enter+0x17/0x20
[<ffffffff9d0e1a73>] call_cpuidle+0x23/0x50
[<ffffffff9d0e1d0c>] cpu_startup_entry+0x15c/0x280
[<ffffffff9d05ce64>] start_secondary+0x154/0x180
Reschedule interrupt may be called in cpu idle state. This causes lockdep
check warning above.
Add irq_enter/exit() in smp_reschedule_interrupt(), irq_enter() tells the RCU
subsystems to end the extended quiescent state, so the following trace call in
ack_APIC_irq() works correctly.
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
arch/x86/kernel/smp.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 658777c..ac2ee87 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -259,8 +259,10 @@ static inline void __smp_reschedule_interrupt(void)
__visible void smp_reschedule_interrupt(struct pt_regs *regs)
{
+ irq_enter();
ack_APIC_irq();
__smp_reschedule_interrupt();
+ irq_exit();
/*
* KVM uses this interrupt to force a cpu out of guest mode
*/
--
1.9.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [tip:x86/urgent] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-14 1:48 [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt() Wanpeng Li
@ 2016-10-14 12:19 ` tip-bot for Wanpeng Li
2016-10-16 13:39 ` [PATCH] " Peter Zijlstra
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Wanpeng Li @ 2016-10-14 12:19 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, kernellwp, tglx, peterz, wanpeng.li, efault
Commit-ID: 1ec6ec14a2943f6f611fc1d5fb2d4eaa85bd9d72
Gitweb: http://git.kernel.org/tip/1ec6ec14a2943f6f611fc1d5fb2d4eaa85bd9d72
Author: Wanpeng Li <kernellwp@gmail.com>
AuthorDate: Fri, 14 Oct 2016 09:48:53 +0800
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Fri, 14 Oct 2016 14:14:20 +0200
x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
===============================
[ INFO: suspicious RCU usage. ]
4.8.0+ #24 Not tainted
-------------------------------
./arch/x86/include/asm/msr-trace.h:47 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
RCU used illegally from idle CPU!
rcu_scheduler_active = 1, debug_locks = 0
RCU used illegally from extended quiescent state!
no locks held by swapper/1/0.
[<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
[<ffffffff9d06f860>] native_write_msr+0x20/0x30
[<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
[<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
[<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
Reschedule interrupt may be called in cpu idle state. This causes lockdep
check warning above.
Add irq_enter/exit() in smp_reschedule_interrupt(), irq_enter() tells the RCU
subsystems to end the extended quiescent state, so the following trace call in
ack_APIC_irq() works correctly.
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Link: http://lkml.kernel.org/r/1476409733-5133-1-git-send-email-wanpeng.li@hotmail.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/kernel/smp.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 658777c..ac2ee87 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -259,8 +259,10 @@ static inline void __smp_reschedule_interrupt(void)
__visible void smp_reschedule_interrupt(struct pt_regs *regs)
{
+ irq_enter();
ack_APIC_irq();
__smp_reschedule_interrupt();
+ irq_exit();
/*
* KVM uses this interrupt to force a cpu out of guest mode
*/
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-14 1:48 [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt() Wanpeng Li
2016-10-14 12:19 ` [tip:x86/urgent] " tip-bot for Wanpeng Li
@ 2016-10-16 13:39 ` Peter Zijlstra
2016-10-17 4:19 ` Wanpeng Li
1 sibling, 1 reply; 15+ messages in thread
From: Peter Zijlstra @ 2016-10-16 13:39 UTC (permalink / raw)
To: Wanpeng Li
Cc: linux-kernel, Wanpeng Li, Ingo Molnar, Mike Galbraith, Thomas Gleixner
On Fri, Oct 14, 2016 at 09:48:53AM +0800, Wanpeng Li wrote:
> ===============================
> [ INFO: suspicious RCU usage. ]
> 4.8.0+ #24 Not tainted
> -------------------------------
> ./arch/x86/include/asm/msr-trace.h:47 suspicious rcu_dereference_check() usage!
>
> other info that might help us debug this:
>
>
> RCU used illegally from idle CPU!
> rcu_scheduler_active = 1, debug_locks = 0
> RCU used illegally from extended quiescent state!
> no locks held by swapper/1/0.
>
> stack backtrace:
> CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.8.0+ #24
> Hardware name: Dell Inc. OptiPlex 7020/0F5C5X, BIOS A03 01/08/2015
> ffff90285de03f58 ffffffff9d44a0c9 ffff90285ca5d100 0000000000000001
> ffff90285de03f88 ffffffff9d0ebd67 ffff902845165410 000000000000080b
> 0000000000000000 0000000000000000 ffff90285de03fb8 ffffffff9d492b95
> Call Trace:
> <IRQ> [<ffffffff9d44a0c9>] dump_stack+0x99/0xd0
> [<ffffffff9d0ebd67>] lockdep_rcu_suspicious+0xe7/0x120
> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
> <EOI> [<ffffffff9d732634>] ? cpuidle_enter_state+0xe4/0x360
> [<ffffffff9d73261f>] ? cpuidle_enter_state+0xcf/0x360
> [<ffffffff9d7328e7>] cpuidle_enter+0x17/0x20
> [<ffffffff9d0e1a73>] call_cpuidle+0x23/0x50
> [<ffffffff9d0e1d0c>] cpu_startup_entry+0x15c/0x280
> [<ffffffff9d05ce64>] start_secondary+0x154/0x180
>
> Reschedule interrupt may be called in cpu idle state. This causes lockdep
> check warning above.
>
> Add irq_enter/exit() in smp_reschedule_interrupt(), irq_enter() tells the RCU
> subsystems to end the extended quiescent state, so the following trace call in
> ack_APIC_irq() works correctly.
>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Mike Galbraith <efault@gmx.de>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
> arch/x86/kernel/smp.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
> index 658777c..ac2ee87 100644
> --- a/arch/x86/kernel/smp.c
> +++ b/arch/x86/kernel/smp.c
> @@ -259,8 +259,10 @@ static inline void __smp_reschedule_interrupt(void)
>
> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
> {
> + irq_enter();
> ack_APIC_irq();
> __smp_reschedule_interrupt();
> + irq_exit();
Urgh, I really hate this...
So now we're making a very frequent interrupt slower because of debug
code :/
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-16 13:39 ` [PATCH] " Peter Zijlstra
@ 2016-10-17 4:19 ` Wanpeng Li
2016-10-17 8:22 ` Peter Zijlstra
0 siblings, 1 reply; 15+ messages in thread
From: Wanpeng Li @ 2016-10-17 4:19 UTC (permalink / raw)
To: Peter Zijlstra
Cc: linux-kernel, Wanpeng Li, Ingo Molnar, Mike Galbraith, Thomas Gleixner
2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> On Fri, Oct 14, 2016 at 09:48:53AM +0800, Wanpeng Li wrote:
>> ===============================
>> [ INFO: suspicious RCU usage. ]
>> 4.8.0+ #24 Not tainted
>> -------------------------------
>> ./arch/x86/include/asm/msr-trace.h:47 suspicious rcu_dereference_check() usage!
>>
>> other info that might help us debug this:
>>
>>
>> RCU used illegally from idle CPU!
>> rcu_scheduler_active = 1, debug_locks = 0
>> RCU used illegally from extended quiescent state!
>> no locks held by swapper/1/0.
>>
>> stack backtrace:
>> CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.8.0+ #24
>> Hardware name: Dell Inc. OptiPlex 7020/0F5C5X, BIOS A03 01/08/2015
>> ffff90285de03f58 ffffffff9d44a0c9 ffff90285ca5d100 0000000000000001
>> ffff90285de03f88 ffffffff9d0ebd67 ffff902845165410 000000000000080b
>> 0000000000000000 0000000000000000 ffff90285de03fb8 ffffffff9d492b95
>> Call Trace:
>> <IRQ> [<ffffffff9d44a0c9>] dump_stack+0x99/0xd0
>> [<ffffffff9d0ebd67>] lockdep_rcu_suspicious+0xe7/0x120
>> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
>> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
>> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
>> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
>> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
>> <EOI> [<ffffffff9d732634>] ? cpuidle_enter_state+0xe4/0x360
>> [<ffffffff9d73261f>] ? cpuidle_enter_state+0xcf/0x360
>> [<ffffffff9d7328e7>] cpuidle_enter+0x17/0x20
>> [<ffffffff9d0e1a73>] call_cpuidle+0x23/0x50
>> [<ffffffff9d0e1d0c>] cpu_startup_entry+0x15c/0x280
>> [<ffffffff9d05ce64>] start_secondary+0x154/0x180
>>
>> Reschedule interrupt may be called in cpu idle state. This causes lockdep
>> check warning above.
>>
>> Add irq_enter/exit() in smp_reschedule_interrupt(), irq_enter() tells the RCU
>> subsystems to end the extended quiescent state, so the following trace call in
>> ack_APIC_irq() works correctly.
>>
>> Cc: Ingo Molnar <mingo@kernel.org>
>> Cc: Mike Galbraith <efault@gmx.de>
>> Cc: Peter Zijlstra <peterz@infradead.org>
>> Cc: Thomas Gleixner <tglx@linutronix.de>
>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>> ---
>> arch/x86/kernel/smp.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
>> index 658777c..ac2ee87 100644
>> --- a/arch/x86/kernel/smp.c
>> +++ b/arch/x86/kernel/smp.c
>> @@ -259,8 +259,10 @@ static inline void __smp_reschedule_interrupt(void)
>>
>> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
>> {
>> + irq_enter();
>> ack_APIC_irq();
>> __smp_reschedule_interrupt();
>> + irq_exit();
>
> Urgh, I really hate this...
>
> So now we're making a very frequent interrupt slower because of debug
> code :/
Do you have a better idea? :)
Regards,
Wanpeng Li
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 4:19 ` Wanpeng Li
@ 2016-10-17 8:22 ` Peter Zijlstra
2016-10-17 9:45 ` Wanpeng Li
2016-10-17 12:19 ` Wanpeng Li
0 siblings, 2 replies; 15+ messages in thread
From: Peter Zijlstra @ 2016-10-17 8:22 UTC (permalink / raw)
To: Wanpeng Li
Cc: linux-kernel, Wanpeng Li, Ingo Molnar, Mike Galbraith, Thomas Gleixner
On Mon, Oct 17, 2016 at 12:19:43PM +0800, Wanpeng Li wrote:
> 2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> >> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
> >> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
> >> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
> >> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
> >> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
> >> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
> >> {
> >> + irq_enter();
> >> ack_APIC_irq();
> >> __smp_reschedule_interrupt();
> >> + irq_exit();
> >
> > Urgh, I really hate this...
> >
> > So now we're making a very frequent interrupt slower because of debug
> > code :/
>
> Do you have a better idea? :)
Something like the below avoids all that. Paravirt will still need fixing.
The thing is, many many smp_reschedule_interrupt() invocations don't
actually execute anything much at all and are only send to tickle the
return to user path (which does the actual preemption).
Having to do the whole irq_enter/irq_exit dance just for this unlikely
debug case totally blows.
---
arch/x86/include/asm/apic.h | 2 +-
arch/x86/include/asm/msr.h | 15 +++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index f5aaf6c83222..b97bfeed6456 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -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)
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
index b5fee97813cd..45c080449d5b 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -127,6 +127,16 @@ notrace static inline void native_write_msr(unsigned int msr,
}
/* Can be uninlined because referenced by paravirt */
+notrace static inline void native_write_msr_notrace(unsigned int msr,
+ unsigned low, unsigned 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 */
notrace static inline int native_write_msr_safe(unsigned int msr,
unsigned low, unsigned high)
{
@@ -228,6 +238,11 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
native_write_msr(msr, low, high);
}
+static inline void wrmsr_notrace(unsigned msr, unsigned low, unsigned high)
+{
+ native_write_msr_notrace(msr, low, high);
+}
+
#define rdmsrl(msr, val) \
((val) = native_read_msr((msr)))
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 8:22 ` Peter Zijlstra
@ 2016-10-17 9:45 ` Wanpeng Li
2016-10-17 10:08 ` Paolo Bonzini
2016-10-17 12:19 ` Wanpeng Li
1 sibling, 1 reply; 15+ messages in thread
From: Wanpeng Li @ 2016-10-17 9:45 UTC (permalink / raw)
To: Peter Zijlstra
Cc: linux-kernel, Wanpeng Li, Ingo Molnar, Mike Galbraith,
Thomas Gleixner, Paolo Bonzini
Cc Paolo,
2016-10-17 16:22 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> On Mon, Oct 17, 2016 at 12:19:43PM +0800, Wanpeng Li wrote:
>> 2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
>
>> >> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
>> >> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
>> >> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
>> >> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
>> >> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
>
>> >> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
>> >> {
>> >> + irq_enter();
>> >> ack_APIC_irq();
>> >> __smp_reschedule_interrupt();
>> >> + irq_exit();
>> >
>> > Urgh, I really hate this...
>> >
>> > So now we're making a very frequent interrupt slower because of debug
>> > code :/
>>
>> Do you have a better idea? :)
>
> Something like the below avoids all that. Paravirt will still need fixing.
kvm_guest_apic_eoi_write
-> native_apic_msr_write
I think you can replace the wrmsr in native_apic_msr_write() by your
wrmsr_notrace().
Regards,
Wanpeng Li
>
> The thing is, many many smp_reschedule_interrupt() invocations don't
> actually execute anything much at all and are only send to tickle the
> return to user path (which does the actual preemption).
>
> Having to do the whole irq_enter/irq_exit dance just for this unlikely
> debug case totally blows.
>
> ---
> arch/x86/include/asm/apic.h | 2 +-
> arch/x86/include/asm/msr.h | 15 +++++++++++++++
> 2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index f5aaf6c83222..b97bfeed6456 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -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)
> diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
> index b5fee97813cd..45c080449d5b 100644
> --- a/arch/x86/include/asm/msr.h
> +++ b/arch/x86/include/asm/msr.h
> @@ -127,6 +127,16 @@ notrace static inline void native_write_msr(unsigned int msr,
> }
>
> /* Can be uninlined because referenced by paravirt */
> +notrace static inline void native_write_msr_notrace(unsigned int msr,
> + unsigned low, unsigned 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 */
> notrace static inline int native_write_msr_safe(unsigned int msr,
> unsigned low, unsigned high)
> {
> @@ -228,6 +238,11 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
> native_write_msr(msr, low, high);
> }
>
> +static inline void wrmsr_notrace(unsigned msr, unsigned low, unsigned high)
> +{
> + native_write_msr_notrace(msr, low, high);
> +}
> +
> #define rdmsrl(msr, val) \
> ((val) = native_read_msr((msr)))
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 9:45 ` Wanpeng Li
@ 2016-10-17 10:08 ` Paolo Bonzini
2016-10-17 10:23 ` Wanpeng Li
2016-10-18 0:01 ` Wanpeng Li
0 siblings, 2 replies; 15+ messages in thread
From: Paolo Bonzini @ 2016-10-17 10:08 UTC (permalink / raw)
To: Wanpeng Li
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner
----- Original Message -----
> From: "Wanpeng Li" <kernellwp@gmail.com>
> To: "Peter Zijlstra" <peterz@infradead.org>
> Cc: linux-kernel@vger.kernel.org, "Wanpeng Li" <wanpeng.li@hotmail.com>, "Ingo Molnar" <mingo@kernel.org>, "Mike
> Galbraith" <efault@gmx.de>, "Thomas Gleixner" <tglx@linutronix.de>, "Paolo Bonzini" <pbonzini@redhat.com>
> Sent: Monday, October 17, 2016 11:45:32 AM
> Subject: Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
>
> Cc Paolo,
> 2016-10-17 16:22 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> > On Mon, Oct 17, 2016 at 12:19:43PM +0800, Wanpeng Li wrote:
> >> 2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> >
> >> >> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
> >> >> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
> >> >> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
> >> >> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
> >> >> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
> >
> >> >> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
> >> >> {
> >> >> + irq_enter();
> >> >> ack_APIC_irq();
> >> >> __smp_reschedule_interrupt();
> >> >> + irq_exit();
> >> >
> >> > Urgh, I really hate this...
> >> >
> >> > So now we're making a very frequent interrupt slower because of debug
> >> > code :/
> >>
> >> Do you have a better idea? :)
> >
> > Something like the below avoids all that. Paravirt will still need fixing.
>
> kvm_guest_apic_eoi_write
> -> native_apic_msr_write
kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index f5aaf6c83222..9769d76a62c4 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
static inline void lapic_update_tsc_freq(void) { }
#endif /* !CONFIG_X86_LOCAL_APIC */
-#ifdef CONFIG_X86_X2APIC
+#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
/*
* Make previous memory operations globally visible before
* sending the IPI through x2apic wrmsr. We need a serializing instruction or
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index edbbfc854e39..61cc6a5e3f44 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -319,7 +319,7 @@ static void kvm_guest_apic_eoi_write(u32 reg, u32 val)
*/
if (__test_and_clear_bit(KVM_PV_EOI_BIT, this_cpu_ptr(&kvm_apic_eoi)))
return;
- apic_write(APIC_EOI, APIC_EOI_ACK);
+ native_apic_msr_eoi_write(APIC_EOI, APIC_EOI_ACK);
}
static void kvm_guest_cpu_init(void)
Thanks,
Paolo
> I think you can replace the wrmsr in native_apic_msr_write() by your
> wrmsr_notrace().
>
> Regards,
> Wanpeng Li
>
> >
> > The thing is, many many smp_reschedule_interrupt() invocations don't
> > actually execute anything much at all and are only send to tickle the
> > return to user path (which does the actual preemption).
> >
> > Having to do the whole irq_enter/irq_exit dance just for this unlikely
> > debug case totally blows.
> >
> > ---
> > arch/x86/include/asm/apic.h | 2 +-
> > arch/x86/include/asm/msr.h | 15 +++++++++++++++
> > 2 files changed, 16 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> > index f5aaf6c83222..b97bfeed6456 100644
> > --- a/arch/x86/include/asm/apic.h
> > +++ b/arch/x86/include/asm/apic.h
> > @@ -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)
> > diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
> > index b5fee97813cd..45c080449d5b 100644
> > --- a/arch/x86/include/asm/msr.h
> > +++ b/arch/x86/include/asm/msr.h
> > @@ -127,6 +127,16 @@ notrace static inline void native_write_msr(unsigned
> > int msr,
> > }
> >
> > /* Can be uninlined because referenced by paravirt */
> > +notrace static inline void native_write_msr_notrace(unsigned int msr,
> > + unsigned low, unsigned 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 */
> > notrace static inline int native_write_msr_safe(unsigned int msr,
> > unsigned low, unsigned high)
> > {
> > @@ -228,6 +238,11 @@ static inline void wrmsr(unsigned msr, unsigned low,
> > unsigned high)
> > native_write_msr(msr, low, high);
> > }
> >
> > +static inline void wrmsr_notrace(unsigned msr, unsigned low, unsigned
> > high)
> > +{
> > + native_write_msr_notrace(msr, low, high);
> > +}
> > +
> > #define rdmsrl(msr, val) \
> > ((val) = native_read_msr((msr)))
> >
>
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 10:08 ` Paolo Bonzini
@ 2016-10-17 10:23 ` Wanpeng Li
2016-10-18 0:01 ` Wanpeng Li
1 sibling, 0 replies; 15+ messages in thread
From: Wanpeng Li @ 2016-10-17 10:23 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner
2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
> ----- Original Message -----
>> From: "Wanpeng Li" <kernellwp@gmail.com>
>> To: "Peter Zijlstra" <peterz@infradead.org>
>> Cc: linux-kernel@vger.kernel.org, "Wanpeng Li" <wanpeng.li@hotmail.com>, "Ingo Molnar" <mingo@kernel.org>, "Mike
>> Galbraith" <efault@gmx.de>, "Thomas Gleixner" <tglx@linutronix.de>, "Paolo Bonzini" <pbonzini@redhat.com>
>> Sent: Monday, October 17, 2016 11:45:32 AM
>> Subject: Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
>>
>> Cc Paolo,
>> 2016-10-17 16:22 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
>> > On Mon, Oct 17, 2016 at 12:19:43PM +0800, Wanpeng Li wrote:
>> >> 2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
>> >
>> >> >> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
>> >> >> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
>> >> >> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
>> >> >> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
>> >> >> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
>> >
>> >> >> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
>> >> >> {
>> >> >> + irq_enter();
>> >> >> ack_APIC_irq();
>> >> >> __smp_reschedule_interrupt();
>> >> >> + irq_exit();
>> >> >
>> >> > Urgh, I really hate this...
>> >> >
>> >> > So now we're making a very frequent interrupt slower because of debug
>> >> > code :/
>> >>
>> >> Do you have a better idea? :)
>> >
>> > Something like the below avoids all that. Paravirt will still need fixing.
>>
>> kvm_guest_apic_eoi_write
>> -> native_apic_msr_write
>
> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index f5aaf6c83222..9769d76a62c4 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
> static inline void lapic_update_tsc_freq(void) { }
> #endif /* !CONFIG_X86_LOCAL_APIC */
>
> -#ifdef CONFIG_X86_X2APIC
> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
> /*
> * Make previous memory operations globally visible before
> * sending the IPI through x2apic wrmsr. We need a serializing instruction or
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index edbbfc854e39..61cc6a5e3f44 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -319,7 +319,7 @@ static void kvm_guest_apic_eoi_write(u32 reg, u32 val)
> */
> if (__test_and_clear_bit(KVM_PV_EOI_BIT, this_cpu_ptr(&kvm_apic_eoi)))
> return;
> - apic_write(APIC_EOI, APIC_EOI_ACK);
> + native_apic_msr_eoi_write(APIC_EOI, APIC_EOI_ACK);
> }
>
> static void kvm_guest_cpu_init(void)
I see, thanks Paolo and Peterz. :)
Regards,
Wanpeng Li
>
>
> Thanks,
>
> Paolo
>
>> I think you can replace the wrmsr in native_apic_msr_write() by your
>> wrmsr_notrace().
>>
>> Regards,
>> Wanpeng Li
>>
>> >
>> > The thing is, many many smp_reschedule_interrupt() invocations don't
>> > actually execute anything much at all and are only send to tickle the
>> > return to user path (which does the actual preemption).
>> >
>> > Having to do the whole irq_enter/irq_exit dance just for this unlikely
>> > debug case totally blows.
>> >
>> > ---
>> > arch/x86/include/asm/apic.h | 2 +-
>> > arch/x86/include/asm/msr.h | 15 +++++++++++++++
>> > 2 files changed, 16 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>> > index f5aaf6c83222..b97bfeed6456 100644
>> > --- a/arch/x86/include/asm/apic.h
>> > +++ b/arch/x86/include/asm/apic.h
>> > @@ -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)
>> > diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
>> > index b5fee97813cd..45c080449d5b 100644
>> > --- a/arch/x86/include/asm/msr.h
>> > +++ b/arch/x86/include/asm/msr.h
>> > @@ -127,6 +127,16 @@ notrace static inline void native_write_msr(unsigned
>> > int msr,
>> > }
>> >
>> > /* Can be uninlined because referenced by paravirt */
>> > +notrace static inline void native_write_msr_notrace(unsigned int msr,
>> > + unsigned low, unsigned 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 */
>> > notrace static inline int native_write_msr_safe(unsigned int msr,
>> > unsigned low, unsigned high)
>> > {
>> > @@ -228,6 +238,11 @@ static inline void wrmsr(unsigned msr, unsigned low,
>> > unsigned high)
>> > native_write_msr(msr, low, high);
>> > }
>> >
>> > +static inline void wrmsr_notrace(unsigned msr, unsigned low, unsigned
>> > high)
>> > +{
>> > + native_write_msr_notrace(msr, low, high);
>> > +}
>> > +
>> > #define rdmsrl(msr, val) \
>> > ((val) = native_read_msr((msr)))
>> >
>>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 8:22 ` Peter Zijlstra
2016-10-17 9:45 ` Wanpeng Li
@ 2016-10-17 12:19 ` Wanpeng Li
1 sibling, 0 replies; 15+ messages in thread
From: Wanpeng Li @ 2016-10-17 12:19 UTC (permalink / raw)
To: Peter Zijlstra
Cc: linux-kernel, Wanpeng Li, Ingo Molnar, Mike Galbraith, Thomas Gleixner
2016-10-17 16:22 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
> On Mon, Oct 17, 2016 at 12:19:43PM +0800, Wanpeng Li wrote:
>> 2016-10-16 21:39 GMT+08:00 Peter Zijlstra <peterz@infradead.org>:
>
>> >> [<ffffffff9d492b95>] do_trace_write_msr+0x135/0x140
>> >> [<ffffffff9d06f860>] native_write_msr+0x20/0x30
>> >> [<ffffffff9d065fad>] native_apic_msr_eoi_write+0x1d/0x30
>> >> [<ffffffff9d05bd1d>] smp_reschedule_interrupt+0x1d/0x30
>> >> [<ffffffff9d8daec6>] reschedule_interrupt+0x96/0xa0
>
>> >> __visible void smp_reschedule_interrupt(struct pt_regs *regs)
>> >> {
>> >> + irq_enter();
>> >> ack_APIC_irq();
>> >> __smp_reschedule_interrupt();
>> >> + irq_exit();
>> >
>> > Urgh, I really hate this...
>> >
>> > So now we're making a very frequent interrupt slower because of debug
>> > code :/
>>
>> Do you have a better idea? :)
>
> Something like the below avoids all that. Paravirt will still need fixing.
>
> The thing is, many many smp_reschedule_interrupt() invocations don't
> actually execute anything much at all and are only send to tickle the
> return to user path (which does the actual preemption).
>
> Having to do the whole irq_enter/irq_exit dance just for this unlikely
> debug case totally blows.
>
> ---
> arch/x86/include/asm/apic.h | 2 +-
> arch/x86/include/asm/msr.h | 15 +++++++++++++++
> 2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index f5aaf6c83222..b97bfeed6456 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -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)
> diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
> index b5fee97813cd..45c080449d5b 100644
> --- a/arch/x86/include/asm/msr.h
> +++ b/arch/x86/include/asm/msr.h
> @@ -127,6 +127,16 @@ notrace static inline void native_write_msr(unsigned int msr,
> }
>
> /* Can be uninlined because referenced by paravirt */
> +notrace static inline void native_write_msr_notrace(unsigned int msr,
> + unsigned low, unsigned 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 */
> notrace static inline int native_write_msr_safe(unsigned int msr,
> unsigned low, unsigned high)
> {
> @@ -228,6 +238,11 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
> native_write_msr(msr, low, high);
> }
>
> +static inline void wrmsr_notrace(unsigned msr, unsigned low, unsigned high)
> +{
> + native_write_msr_notrace(msr, low, high);
> +}
I move this out of !PARAVIRT since PARAVIRT also will use it.
Regards,
Wanpeng Li
> +
> #define rdmsrl(msr, val) \
> ((val) = native_read_msr((msr)))
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-17 10:08 ` Paolo Bonzini
2016-10-17 10:23 ` Wanpeng Li
@ 2016-10-18 0:01 ` Wanpeng Li
2016-10-19 14:01 ` Wanpeng Li
1 sibling, 1 reply; 15+ messages in thread
From: Wanpeng Li @ 2016-10-18 0:01 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner
2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
[...]
>> > Something like the below avoids all that. Paravirt will still need fixing.
>>
>> kvm_guest_apic_eoi_write
>> -> native_apic_msr_write
>
> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index f5aaf6c83222..9769d76a62c4 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
> static inline void lapic_update_tsc_freq(void) { }
> #endif /* !CONFIG_X86_LOCAL_APIC */
>
> -#ifdef CONFIG_X86_X2APIC
> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
there are undefined reference warning for x2apic_mode and check_x2apic
etc since they are extern variables and just define under
CONFIG_X86_X2APIC.
> /*
> * Make previous memory operations globally visible before
> * sending the IPI through x2apic wrmsr. We need a serializing instruction or
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index edbbfc854e39..61cc6a5e3f44 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -319,7 +319,7 @@ static void kvm_guest_apic_eoi_write(u32 reg, u32 val)
> */
> if (__test_and_clear_bit(KVM_PV_EOI_BIT, this_cpu_ptr(&kvm_apic_eoi)))
> return;
> - apic_write(APIC_EOI, APIC_EOI_ACK);
> + native_apic_msr_eoi_write(APIC_EOI, APIC_EOI_ACK);
> }
If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
Regards,
Wanpeng Li
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-18 0:01 ` Wanpeng Li
@ 2016-10-19 14:01 ` Wanpeng Li
2016-10-19 14:10 ` Paolo Bonzini
0 siblings, 1 reply; 15+ messages in thread
From: Wanpeng Li @ 2016-10-19 14:01 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner
2016-10-18 8:01 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
> 2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
> [...]
>>> > Something like the below avoids all that. Paravirt will still need fixing.
>>>
>>> kvm_guest_apic_eoi_write
>>> -> native_apic_msr_write
>>
>> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>>
>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>> index f5aaf6c83222..9769d76a62c4 100644
>> --- a/arch/x86/include/asm/apic.h
>> +++ b/arch/x86/include/asm/apic.h
>> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
>> static inline void lapic_update_tsc_freq(void) { }
>> #endif /* !CONFIG_X86_LOCAL_APIC */
>>
>> -#ifdef CONFIG_X86_X2APIC
>> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
>
> If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
> there are undefined reference warning for x2apic_mode and check_x2apic
> etc since they are extern variables and just define under
> CONFIG_X86_X2APIC.
[...]
>
> If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
Any ideas? :)
Regards,
Wanpeng Li
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-19 14:01 ` Wanpeng Li
@ 2016-10-19 14:10 ` Paolo Bonzini
2016-10-19 14:30 ` Wanpeng Li
0 siblings, 1 reply; 15+ messages in thread
From: Paolo Bonzini @ 2016-10-19 14:10 UTC (permalink / raw)
To: Wanpeng Li
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner
On 19/10/2016 16:01, Wanpeng Li wrote:
> 2016-10-18 8:01 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
>> 2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>> [...]
>>>>> Something like the below avoids all that. Paravirt will still need fixing.
>>>>
>>>> kvm_guest_apic_eoi_write
>>>> -> native_apic_msr_write
>>>
>>> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>>>
>>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>>> index f5aaf6c83222..9769d76a62c4 100644
>>> --- a/arch/x86/include/asm/apic.h
>>> +++ b/arch/x86/include/asm/apic.h
>>> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
>>> static inline void lapic_update_tsc_freq(void) { }
>>> #endif /* !CONFIG_X86_LOCAL_APIC */
>>>
>>> -#ifdef CONFIG_X86_X2APIC
>>> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
>>
>> If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
>> there are undefined reference warning for x2apic_mode and check_x2apic
>> etc since they are extern variables and just define under
>> CONFIG_X86_X2APIC.
>
> [...]
>
>>
>> If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
>
> Any ideas? :)
Make apic_set_eoi_write return the old pointer?
Paolo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-19 14:10 ` Paolo Bonzini
@ 2016-10-19 14:30 ` Wanpeng Li
2016-10-24 14:32 ` Paolo Bonzini
0 siblings, 1 reply; 15+ messages in thread
From: Wanpeng Li @ 2016-10-19 14:30 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner, Radim Krcmar
Cc Radim,
2016-10-19 22:10 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
> On 19/10/2016 16:01, Wanpeng Li wrote:
>> 2016-10-18 8:01 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
>>> 2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>> [...]
>>>>>> Something like the below avoids all that. Paravirt will still need fixing.
>>>>>
>>>>> kvm_guest_apic_eoi_write
>>>>> -> native_apic_msr_write
>>>>
>>>> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>>>>
>>>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>>>> index f5aaf6c83222..9769d76a62c4 100644
>>>> --- a/arch/x86/include/asm/apic.h
>>>> +++ b/arch/x86/include/asm/apic.h
>>>> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
>>>> static inline void lapic_update_tsc_freq(void) { }
>>>> #endif /* !CONFIG_X86_LOCAL_APIC */
>>>>
>>>> -#ifdef CONFIG_X86_X2APIC
>>>> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
>>>
>>> If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
>>> there are undefined reference warning for x2apic_mode and check_x2apic
>>> etc since they are extern variables and just define under
>>> CONFIG_X86_X2APIC.
>>
This results in undefined reference warning.
>>
>>>
>>> If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
>>
>> Any ideas? :)
>
> Make apic_set_eoi_write return the old pointer?
Could you elaborate? :)
Regards,
Wanpeng Li
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-19 14:30 ` Wanpeng Li
@ 2016-10-24 14:32 ` Paolo Bonzini
2016-10-25 2:52 ` Wanpeng Li
0 siblings, 1 reply; 15+ messages in thread
From: Paolo Bonzini @ 2016-10-24 14:32 UTC (permalink / raw)
To: Wanpeng Li
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner, Radim Krcmar
On 19/10/2016 16:30, Wanpeng Li wrote:
> Cc Radim,
> 2016-10-19 22:10 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>
>>
>> On 19/10/2016 16:01, Wanpeng Li wrote:
>>> 2016-10-18 8:01 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
>>>> 2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>>> [...]
>>>>>>> Something like the below avoids all that. Paravirt will still need fixing.
>>>>>>
>>>>>> kvm_guest_apic_eoi_write
>>>>>> -> native_apic_msr_write
>>>>>
>>>>> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>>>>>
>>>>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>>>>> index f5aaf6c83222..9769d76a62c4 100644
>>>>> --- a/arch/x86/include/asm/apic.h
>>>>> +++ b/arch/x86/include/asm/apic.h
>>>>> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
>>>>> static inline void lapic_update_tsc_freq(void) { }
>>>>> #endif /* !CONFIG_X86_LOCAL_APIC */
>>>>>
>>>>> -#ifdef CONFIG_X86_X2APIC
>>>>> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
>>>>
>>>> If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
>>>> there are undefined reference warning for x2apic_mode and check_x2apic
>>>> etc since they are extern variables and just define under
>>>> CONFIG_X86_X2APIC.
>>>
>
> This results in undefined reference warning.
>
>>>
>>>>
>>>> If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
>>>
>>> Any ideas? :)
>>
>> Make apic_set_eoi_write return the old pointer?
>
> Could you elaborate? :)
No, that won't work due to how struct apic works and how
apic_set_eoi_write patches it. One possibility then is to add a
void (*native_eoi_write)(u32 reg, u32 v);
field to struct apic, and make apic_set_eoi_write set
(*drv)->native_eoi_write = (*drv)->eoi_write;
(*drv)->eoi_write = eoi_write;
Then kvm.c can call
apic->native_eoi_write(reg, v);
Thanks,
Paolo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt()
2016-10-24 14:32 ` Paolo Bonzini
@ 2016-10-25 2:52 ` Wanpeng Li
0 siblings, 0 replies; 15+ messages in thread
From: Wanpeng Li @ 2016-10-25 2:52 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Peter Zijlstra, linux-kernel, Wanpeng Li, Ingo Molnar,
Mike Galbraith, Thomas Gleixner, Radim Krcmar
2016-10-24 22:32 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
> On 19/10/2016 16:30, Wanpeng Li wrote:
>> Cc Radim,
>> 2016-10-19 22:10 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>>
>>>
>>> On 19/10/2016 16:01, Wanpeng Li wrote:
>>>> 2016-10-18 8:01 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
>>>>> 2016-10-17 18:08 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>>>> [...]
>>>>>>>> Something like the below avoids all that. Paravirt will still need fixing.
>>>>>>>
>>>>>>> kvm_guest_apic_eoi_write
>>>>>>> -> native_apic_msr_write
>>>>>>
>>>>>> kvm_guest_apic_eoi_write can use native_apic_msr_eoi_write too:
>>>>>>
>>>>>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>>>>>> index f5aaf6c83222..9769d76a62c4 100644
>>>>>> --- a/arch/x86/include/asm/apic.h
>>>>>> +++ b/arch/x86/include/asm/apic.h
>>>>>> @@ -174,7 +174,7 @@ static inline void disable_local_APIC(void) { }
>>>>>> static inline void lapic_update_tsc_freq(void) { }
>>>>>> #endif /* !CONFIG_X86_LOCAL_APIC */
>>>>>>
>>>>>> -#ifdef CONFIG_X86_X2APIC
>>>>>> +#if defined CONFIG_X86_X2APIC || defined CONFIG_KVM_GUEST
>>>>>
>>>>> If CONFIG_X86_X2APIC is undefined and CONFIG_KVM_GUEST is defined,
>>>>> there are undefined reference warning for x2apic_mode and check_x2apic
>>>>> etc since they are extern variables and just define under
>>>>> CONFIG_X86_X2APIC.
>>>>
>>
>> This results in undefined reference warning.
>>
>>>>
>>>>>
>>>>> If -cpu host,-x2apic we should go through mmio when writes xapic EOI.
>>>>
>>>> Any ideas? :)
>>>
>>> Make apic_set_eoi_write return the old pointer?
>>
>> Could you elaborate? :)
>
> No, that won't work due to how struct apic works and how
> apic_set_eoi_write patches it. One possibility then is to add a
>
> void (*native_eoi_write)(u32 reg, u32 v);
>
> field to struct apic, and make apic_set_eoi_write set
>
> (*drv)->native_eoi_write = (*drv)->eoi_write;
> (*drv)->eoi_write = eoi_write;
>
> Then kvm.c can call
>
> apic->native_eoi_write(reg, v);
It works. Thanks Paolo. :)
Regards,
Wanpeng Li
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2016-10-25 2:52 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-14 1:48 [PATCH] x86/smp: Add irq_enter/exit() in smp_reschedule_interrupt() Wanpeng Li
2016-10-14 12:19 ` [tip:x86/urgent] " tip-bot for Wanpeng Li
2016-10-16 13:39 ` [PATCH] " Peter Zijlstra
2016-10-17 4:19 ` Wanpeng Li
2016-10-17 8:22 ` Peter Zijlstra
2016-10-17 9:45 ` Wanpeng Li
2016-10-17 10:08 ` Paolo Bonzini
2016-10-17 10:23 ` Wanpeng Li
2016-10-18 0:01 ` Wanpeng Li
2016-10-19 14:01 ` Wanpeng Li
2016-10-19 14:10 ` Paolo Bonzini
2016-10-19 14:30 ` Wanpeng Li
2016-10-24 14:32 ` Paolo Bonzini
2016-10-25 2:52 ` Wanpeng Li
2016-10-17 12:19 ` Wanpeng Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).