Message ID | 20210401150325.442125-26-npiggin@gmail.com |
---|---|
State | New |
Headers | show |
Series | KVM: PPC: Book3S: C-ify the P9 entry/exit code | expand |
Hi Nicholas, I love your patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on v5.12-rc5 next-20210401] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/KVM-PPC-Book3S-C-ify-the-P9-entry-exit-code/20210401-232743 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-s031-20210401 (attached as .config) compiler: powerpc64-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.3-279-g6d5d9b42-dirty # https://github.com/0day-ci/linux/commit/4c3e837b20a4ebe406d7b8fddbec2f6fa86755a2 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Nicholas-Piggin/KVM-PPC-Book3S-C-ify-the-P9-entry-exit-code/20210401-232743 git checkout 4c3e837b20a4ebe406d7b8fddbec2f6fa86755a2 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=powerpc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) >> arch/powerpc/kernel/time.c:877:9: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:877:9: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:877:9: sparse: got unsigned long long * >> arch/powerpc/kernel/time.c:877:9: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:877:9: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:877:9: sparse: got unsigned long long * >> arch/powerpc/kernel/time.c:877:9: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:877:9: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:877:9: sparse: got unsigned long long * >> arch/powerpc/kernel/time.c:877:9: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:877:9: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:877:9: sparse: got unsigned long long * >> arch/powerpc/kernel/time.c:877:9: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:877:9: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:877:9: sparse: got unsigned long long * arch/powerpc/kernel/time.c:130:1: sparse: sparse: symbol 'rtc_lock' was not declared. Should it be static? arch/powerpc/kernel/time.c:649:24: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:649:24: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:649:24: sparse: got unsigned long long * arch/powerpc/kernel/time.c:580:24: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got unsigned long long * @@ arch/powerpc/kernel/time.c:580:24: sparse: expected void const [noderef] __percpu *__vpp_verify arch/powerpc/kernel/time.c:580:24: sparse: got unsigned long long * vim +877 arch/powerpc/kernel/time.c 4a4cfe3836916e Tony Breeds 2007-09-22 873 d831d0b83f2058 Tony Breeds 2007-09-21 874 static int decrementer_set_next_event(unsigned long evt, d831d0b83f2058 Tony Breeds 2007-09-21 875 struct clock_event_device *dev) d831d0b83f2058 Tony Breeds 2007-09-21 876 { 6601ec1c2ba929 Christophe Leroy 2020-09-29 @877 __this_cpu_write(decrementers_next_tb, get_tb() + evt); d831d0b83f2058 Tony Breeds 2007-09-21 878 set_dec(evt); 0215f7d8c53fb1 Benjamin Herrenschmidt 2014-01-14 879 0215f7d8c53fb1 Benjamin Herrenschmidt 2014-01-14 880 /* We may have raced with new irq work */ 0215f7d8c53fb1 Benjamin Herrenschmidt 2014-01-14 881 if (test_irq_work_pending()) 0215f7d8c53fb1 Benjamin Herrenschmidt 2014-01-14 882 set_dec(1); 0215f7d8c53fb1 Benjamin Herrenschmidt 2014-01-14 883 d831d0b83f2058 Tony Breeds 2007-09-21 884 return 0; d831d0b83f2058 Tony Breeds 2007-09-21 885 } d831d0b83f2058 Tony Breeds 2007-09-21 886 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 68d94711811e..0128cd9769bc 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h @@ -101,6 +101,11 @@ extern void __init time_init(void); DECLARE_PER_CPU(u64, decrementers_next_tb); +static inline u64 timer_get_next_tb(void) +{ + return __this_cpu_read(decrementers_next_tb); +} + /* 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 fc42594c8223..8b9b38a8ce57 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -109,6 +109,7 @@ struct clock_event_device decrementer_clockevent = { EXPORT_SYMBOL(decrementer_clockevent); DEFINE_PER_CPU(u64, decrementers_next_tb); +EXPORT_SYMBOL_GPL(decrementers_next_tb); static DEFINE_PER_CPU(struct clock_event_device, decrementers); #define XSEC_PER_SEC (1024*1024) diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 7afa2e7a2867..dc1232d2a198 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3697,16 +3697,15 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long host_amr = mfspr(SPRN_AMR); unsigned long host_fscr = mfspr(SPRN_FSCR); s64 dec; - u64 tb; + u64 tb, next_timer; int trap, save_pmu; - dec = mfspr(SPRN_DEC); tb = mftb(); - if (dec < 0) + next_timer = timer_get_next_tb(); + if (tb >= next_timer) return BOOK3S_INTERRUPT_HV_DECREMENTER; - local_paca->kvm_hstate.dec_expires = dec + tb; - if (local_paca->kvm_hstate.dec_expires < time_limit) - time_limit = local_paca->kvm_hstate.dec_expires; + if (next_timer < time_limit) + time_limit = next_timer; vcpu->arch.ceded = 0; @@ -3889,7 +3888,8 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, vc->entry_exit_map = 0x101; vc->in_guest = 0; - mtspr(SPRN_DEC, local_paca->kvm_hstate.dec_expires - mftb()); + next_timer = timer_get_next_tb(); + mtspr(SPRN_DEC, next_timer - mftb()); mtspr(SPRN_SPRG_VDSO_WRITE, local_paca->sprg_vdso); kvmhv_load_host_pmu();
There is no need to save away the host DEC value, as it is derived from the host timer subsystem, which maintains the next timer time. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/include/asm/time.h | 5 +++++ arch/powerpc/kernel/time.c | 1 + arch/powerpc/kvm/book3s_hv.c | 14 +++++++------- 3 files changed, 13 insertions(+), 7 deletions(-)