From: Nicholas Piggin <npiggin@gmail.com> To: kvm-ppc@vger.kernel.org Cc: Alexey Kardashevskiy <aik@ozlabs.ru>, linuxppc-dev@lists.ozlabs.org, Nicholas Piggin <npiggin@gmail.com> Subject: [PATCH v5 29/48] powerpc: add set_dec_or_work API for safely updating decrementer Date: Fri, 2 Apr 2021 01:03:06 +1000 [thread overview] Message-ID: <20210401150325.442125-30-npiggin@gmail.com> (raw) In-Reply-To: <20210401150325.442125-1-npiggin@gmail.com> Decrementer updates must always check for new irq work to avoid an irq work decrementer interrupt being lost. Add an API for this in the timer code so callers don't have to care about details. Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/include/asm/time.h | 4 ++++ arch/powerpc/kernel/time.c | 41 +++++++++++++++++++++++++-------- arch/powerpc/kvm/book3s_hv.c | 6 +---- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 0128cd9769bc..924b2157882f 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h @@ -106,6 +106,10 @@ static inline u64 timer_get_next_tb(void) return __this_cpu_read(decrementers_next_tb); } +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +void timer_rearm_host_dec(u64 now); +#endif + /* Convert timebase ticks to nanoseconds */ unsigned long long tb_to_ns(unsigned long long tb_ticks); diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 8b9b38a8ce57..8bbcc6be40c0 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -563,13 +563,43 @@ void arch_irq_work_raise(void) preempt_enable(); } +static void set_dec_or_work(u64 val) +{ + set_dec(val); + /* We may have raced with new irq work */ + if (unlikely(test_irq_work_pending())) + set_dec(1); +} + #else /* CONFIG_IRQ_WORK */ #define test_irq_work_pending() 0 #define clear_irq_work_pending() +static void set_dec_or_work(u64 val) +{ + set_dec(val); +} #endif /* CONFIG_IRQ_WORK */ +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +void timer_rearm_host_dec(u64 now) +{ + u64 *next_tb = this_cpu_ptr(&decrementers_next_tb); + + WARN_ON_ONCE(!arch_irqs_disabled()); + WARN_ON_ONCE(mfmsr() & MSR_EE); + + if (now >= *next_tb) { + now = *next_tb - now; + set_dec_or_work(now); + } else { + local_paca->irq_happened |= PACA_IRQ_DEC; + } +} +EXPORT_SYMBOL_GPL(timer_rearm_host_dec); +#endif + /* * timer_interrupt - gets called when the decrementer overflows, * with interrupts disabled. @@ -630,10 +660,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt) } else { now = *next_tb - now; if (now <= decrementer_max) - set_dec(now); - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + set_dec_or_work(now); __this_cpu_inc(irq_stat.timer_irqs_others); } @@ -875,11 +902,7 @@ static int decrementer_set_next_event(unsigned long evt, struct clock_event_device *dev) { __this_cpu_write(decrementers_next_tb, get_tb() + evt); - set_dec(evt); - - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + set_dec_or_work(evt); return 0; } diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 8c8df88eec8c..287042b4afb5 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3901,11 +3901,7 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, vc->entry_exit_map = 0x101; vc->in_guest = 0; - next_timer = timer_get_next_tb(); - set_dec(next_timer - tb); - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + timer_rearm_host_dec(tb); mtspr(SPRN_SPRG_VDSO_WRITE, local_paca->sprg_vdso); kvmhv_load_host_pmu(); -- 2.23.0
WARNING: multiple messages have this Message-ID (diff)
From: Nicholas Piggin <npiggin@gmail.com> To: kvm-ppc@vger.kernel.org Cc: Alexey Kardashevskiy <aik@ozlabs.ru>, linuxppc-dev@lists.ozlabs.org, Nicholas Piggin <npiggin@gmail.com> Subject: [PATCH v5 29/48] powerpc: add set_dec_or_work API for safely updating decrementer Date: Thu, 01 Apr 2021 15:03:06 +0000 [thread overview] Message-ID: <20210401150325.442125-30-npiggin@gmail.com> (raw) In-Reply-To: <20210401150325.442125-1-npiggin@gmail.com> Decrementer updates must always check for new irq work to avoid an irq work decrementer interrupt being lost. Add an API for this in the timer code so callers don't have to care about details. Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/include/asm/time.h | 4 ++++ arch/powerpc/kernel/time.c | 41 +++++++++++++++++++++++++-------- arch/powerpc/kvm/book3s_hv.c | 6 +---- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 0128cd9769bc..924b2157882f 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h @@ -106,6 +106,10 @@ static inline u64 timer_get_next_tb(void) return __this_cpu_read(decrementers_next_tb); } +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +void timer_rearm_host_dec(u64 now); +#endif + /* Convert timebase ticks to nanoseconds */ unsigned long long tb_to_ns(unsigned long long tb_ticks); diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 8b9b38a8ce57..8bbcc6be40c0 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -563,13 +563,43 @@ void arch_irq_work_raise(void) preempt_enable(); } +static void set_dec_or_work(u64 val) +{ + set_dec(val); + /* We may have raced with new irq work */ + if (unlikely(test_irq_work_pending())) + set_dec(1); +} + #else /* CONFIG_IRQ_WORK */ #define test_irq_work_pending() 0 #define clear_irq_work_pending() +static void set_dec_or_work(u64 val) +{ + set_dec(val); +} #endif /* CONFIG_IRQ_WORK */ +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +void timer_rearm_host_dec(u64 now) +{ + u64 *next_tb = this_cpu_ptr(&decrementers_next_tb); + + WARN_ON_ONCE(!arch_irqs_disabled()); + WARN_ON_ONCE(mfmsr() & MSR_EE); + + if (now >= *next_tb) { + now = *next_tb - now; + set_dec_or_work(now); + } else { + local_paca->irq_happened |= PACA_IRQ_DEC; + } +} +EXPORT_SYMBOL_GPL(timer_rearm_host_dec); +#endif + /* * timer_interrupt - gets called when the decrementer overflows, * with interrupts disabled. @@ -630,10 +660,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt) } else { now = *next_tb - now; if (now <= decrementer_max) - set_dec(now); - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + set_dec_or_work(now); __this_cpu_inc(irq_stat.timer_irqs_others); } @@ -875,11 +902,7 @@ static int decrementer_set_next_event(unsigned long evt, struct clock_event_device *dev) { __this_cpu_write(decrementers_next_tb, get_tb() + evt); - set_dec(evt); - - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + set_dec_or_work(evt); return 0; } diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 8c8df88eec8c..287042b4afb5 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3901,11 +3901,7 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, vc->entry_exit_map = 0x101; vc->in_guest = 0; - next_timer = timer_get_next_tb(); - set_dec(next_timer - tb); - /* We may have raced with new irq work */ - if (test_irq_work_pending()) - set_dec(1); + timer_rearm_host_dec(tb); mtspr(SPRN_SPRG_VDSO_WRITE, local_paca->sprg_vdso); kvmhv_load_host_pmu(); -- 2.23.0
next prev parent reply other threads:[~2021-04-01 15:17 UTC|newest] Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-01 15:02 [PATCH v5 00/48] KVM: PPC: Book3S: C-ify the P9 entry/exit code Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 01/48] KVM: PPC: Book3S HV: Nested move LPCR sanitising to sanitise_hv_regs Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 02/48] KVM: PPC: Book3S HV: Add a function to filter guest LPCR bits Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 03/48] KVM: PPC: Book3S HV: Disallow LPCR[AIL] to be set to 1 or 2 Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 04/48] KVM: PPC: Book3S HV: Prevent radix guests setting LPCR[TC] Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 05/48] KVM: PPC: Book3S HV: Remove redundant mtspr PSPB Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 06/48] KVM: PPC: Book3S HV: remove unused kvmppc_h_protect argument Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 07/48] KVM: PPC: Book3S HV: Fix CONFIG_SPAPR_TCE_IOMMU=n default hcalls Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 08/48] powerpc/64s: Remove KVM handler support from CBE_RAS interrupts Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 09/48] powerpc/64s: remove KVM SKIP test from instruction breakpoint handler Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 10/48] KVM: PPC: Book3S HV: Ensure MSR[ME] is always set in guest MSR Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 11/48] KVM: PPC: Book3S HV: Ensure MSR[HV] is always clear " Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 12/48] KVM: PPC: Book3S 64: move KVM interrupt entry to a common entry point Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 13/48] KVM: PPC: Book3S 64: Move GUEST_MODE_SKIP test into KVM Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 14/48] KVM: PPC: Book3S 64: add hcall interrupt handler Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 15/48] KVM: PPC: Book3S 64: Move hcall early register setup to KVM Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 16/48] KVM: PPC: Book3S 64: Move interrupt " Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 17/48] KVM: PPC: Book3S 64: move bad_host_intr check to HV handler Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 18/48] KVM: PPC: Book3S 64: Minimise hcall handler calling convention differences Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 19/48] KVM: PPC: Book3S HV P9: Move radix MMU switching instructions together Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 20/48] KVM: PPC: Book3S HV P9: implement kvmppc_xive_pull_vcpu in C Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 21/48] KVM: PPC: Book3S HV P9: Move xive vcpu context management into kvmhv_p9_guest_entry Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:02 ` [PATCH v5 22/48] KVM: PPC: Book3S HV P9: Stop handling hcalls in real-mode in the P9 path Nicholas Piggin 2021-04-01 15:02 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 23/48] KVM: PPC: Book3S HV P9: Move setting HDEC after switching to guest LPCR Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 24/48] KVM: PPC: Book3S HV P9: Use large decrementer for HDEC Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 25/48] KVM: PPC: Book3S HV P9: Use host timer accounting to avoid decrementer read Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-02 4:19 ` kernel test robot 2021-04-02 4:19 ` kernel test robot 2021-04-02 4:19 ` kernel test robot 2021-04-01 15:03 ` [PATCH v5 26/48] KVM: PPC: Book3S HV P9: Reduce mftb per guest entry/exit Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 27/48] KVM: PPC: Book3S HV P9: Reduce irq_work vs guest decrementer races Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 28/48] KMV: PPC: Book3S HV: Use set_dec to set decrementer to host Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin [this message] 2021-04-01 15:03 ` [PATCH v5 29/48] powerpc: add set_dec_or_work API for safely updating decrementer Nicholas Piggin 2021-04-02 11:04 ` Nicholas Piggin 2021-04-02 11:04 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 30/48] KVM: PPC: Book3S HV P9: Implement the rest of the P9 path in C Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 31/48] KVM: PPC: Book3S HV P9: inline kvmhv_load_hv_regs_and_go into __kvmhv_vcpu_entry_p9 Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-02 20:58 ` kernel test robot 2021-04-02 20:58 ` [PATCH v5 31/48] KVM: PPC: Book3S HV P9: inline kvmhv_load_hv_regs_and_go into __kvmhv_vcpu_entr kernel test robot 2021-04-02 20:58 ` [PATCH v5 31/48] KVM: PPC: Book3S HV P9: inline kvmhv_load_hv_regs_and_go into __kvmhv_vcpu_entry_p9 kernel test robot 2021-04-01 15:03 ` [PATCH v5 32/48] KVM: PPC: Book3S HV P9: Read machine check registers while MSR[RI] is 0 Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 33/48] KVM: PPC: Book3S HV P9: Improve exit timing accounting coverage Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 34/48] KVM: PPC: Book3S HV P9: Move SPR loading after expiry time check Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 35/48] KVM: PPC: Book3S HV P9: Add helpers for OS SPR handling Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 36/48] KVM: PPC: Book3S HV P9: Switch to guest MMU context as late as possible Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 37/48] KVM: PPC: Book3S HV: Implement radix prefetch workaround by disabling MMU Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 38/48] KVM: PPC: Book3S HV: Remove support for dependent threads mode on P9 Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 39/48] KVM: PPC: Book3S HV: Remove radix guest support from P7/8 path Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 40/48] KVM: PPC: Book3S HV: Remove virt mode checks from real mode handlers Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 41/48] KVM: PPC: Book3S HV: Remove unused nested HV tests in XICS emulation Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-02 15:28 ` kernel test robot 2021-04-02 15:28 ` kernel test robot 2021-04-02 15:28 ` kernel test robot 2021-04-02 16:32 ` Cédric Le Goater 2021-04-02 16:32 ` Cédric Le Goater 2021-04-04 0:48 ` Nicholas Piggin 2021-04-04 0:48 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 42/48] KVM: PPC: Book3S HV: Radix guests should not have userspace hcalls reflected to them Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 42/48] KVM: PPC: Book3S HV: Radix guests should not have userspace hcalls reflected to the Nicholas Piggin 2021-04-02 0:07 ` [PATCH v5 42/48] KVM: PPC: Book3S HV: Radix guests should not have userspace hcalls reflected to them Nicholas Piggin 2021-04-02 0:07 ` [PATCH v5 42/48] KVM: PPC: Book3S HV: Radix guests should not have userspace hcalls reflected to Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 43/48] KVM: PPC: Book3S HV P9: Allow all P9 processors to enable nested HV Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 44/48] KVM: PPC: Book3S HV: small pseries_do_hcall cleanup Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 45/48] KVM: PPC: Book3S HV: add virtual mode handlers for HPT hcalls and page faults Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 46/48] KVM: PPC: Book3S HV P9: implement hash guest support Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 47/48] KVM: PPC: Book3S HV P9: implement hash host / " Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-01 15:03 ` [PATCH v5 48/48] KVM: PPC: Book3S HV: remove ISA v3.0 and v3.1 support from P7/8 path Nicholas Piggin 2021-04-01 15:03 ` Nicholas Piggin 2021-04-02 0:11 ` Nicholas Piggin 2021-04-02 0:11 ` Nicholas Piggin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210401150325.442125-30-npiggin@gmail.com \ --to=npiggin@gmail.com \ --cc=aik@ozlabs.ru \ --cc=kvm-ppc@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.