On 08/09/2016 05:21, Paul Mackerras wrote: > Paolo (and others), > > Are you OK with me taking the patch below via my kvm-ppc-next tree? Yes, but send a pull request to me as soon as possible, without waiting just before the merge window. Thanks, Paolo > Thanks, > Paul. > > On Tue, Aug 02, 2016 at 02:03:22PM +1000, Suraj Jitindar Singh wrote: >> vms and vcpus have statistics associated with them which can be viewed >> within the debugfs. Currently it is assumed within the vcpu_stat_get() and >> vm_stat_get() functions that all of these statistics are represented as >> u32s, however the next patch adds some u64 vcpu statistics. >> >> Change all vcpu statistics to u64 and modify vcpu_stat_get() accordingly. >> Since vcpu statistics are per vcpu, they will only be updated by a single >> vcpu at a time so this shouldn't present a problem on 32-bit machines >> which can't atomically increment 64-bit numbers. However vm statistics >> could potentially be updated by multiple vcpus from that vm at a time. >> To avoid the overhead of atomics make all vm statistics ulong such that >> they are 64-bit on 64-bit systems where they can be atomically incremented >> and are 32-bit on 32-bit systems which may not be able to atomically >> increment 64-bit numbers. Modify vm_stat_get() to expect ulongs. >> >> Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@xxxxxxxxx> >> Reviewed-by: David Matlack <dmatlack@xxxxxxxxxx> >> Acked-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> >> >> --- >> Change Log: >> >> V2 -> V3: >> - Instead of implementing separate u32 and u64 functions keep the >> generic functions and modify them to expect u64s. Thus update all >> vm and vcpu statistics to u64s accordingly. >> V3 -> V4: >> - Change vm_stats from u64 to ulong >> --- >> arch/arm/include/asm/kvm_host.h | 12 ++-- >> arch/arm64/include/asm/kvm_host.h | 12 ++-- >> arch/mips/include/asm/kvm_host.h | 46 ++++++------- >> arch/powerpc/include/asm/kvm_host.h | 60 ++++++++--------- >> arch/s390/include/asm/kvm_host.h | 128 ++++++++++++++++++------------------ >> arch/x86/include/asm/kvm_host.h | 72 ++++++++++---------- >> virt/kvm/kvm_main.c | 4 +- >> 7 files changed, 167 insertions(+), 167 deletions(-) >> >> diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h >> index 96387d4..c8e55b3b 100644 >> --- a/arch/arm/include/asm/kvm_host.h >> +++ b/arch/arm/include/asm/kvm_host.h >> @@ -183,15 +183,15 @@ struct kvm_vcpu_arch { >> }; >> >> struct kvm_vm_stat { >> - u32 remote_tlb_flush; >> + ulong remote_tlb_flush; >> }; >> >> struct kvm_vcpu_stat { >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> - u32 hvc_exit_stat; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> + u64 hvc_exit_stat; >> u64 wfe_exit_stat; >> u64 wfi_exit_stat; >> u64 mmio_exit_user; >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h >> index 49095fc..b14c8bc 100644 >> --- a/arch/arm64/include/asm/kvm_host.h >> +++ b/arch/arm64/include/asm/kvm_host.h >> @@ -291,15 +291,15 @@ struct kvm_vcpu_arch { >> #endif >> >> struct kvm_vm_stat { >> - u32 remote_tlb_flush; >> + ulong remote_tlb_flush; >> }; >> >> struct kvm_vcpu_stat { >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> - u32 hvc_exit_stat; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> + u64 hvc_exit_stat; >> u64 wfe_exit_stat; >> u64 wfi_exit_stat; >> u64 mmio_exit_user; >> diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h >> index 36a391d..9704888 100644 >> --- a/arch/mips/include/asm/kvm_host.h >> +++ b/arch/mips/include/asm/kvm_host.h >> @@ -98,32 +98,32 @@ extern void (*kvm_mips_release_pfn_clean)(kvm_pfn_t pfn); >> extern bool (*kvm_mips_is_error_pfn)(kvm_pfn_t pfn); >> >> struct kvm_vm_stat { >> - u32 remote_tlb_flush; >> + ulong remote_tlb_flush; >> }; >> >> struct kvm_vcpu_stat { >> - u32 wait_exits; >> - u32 cache_exits; >> - u32 signal_exits; >> - u32 int_exits; >> - u32 cop_unusable_exits; >> - u32 tlbmod_exits; >> - u32 tlbmiss_ld_exits; >> - u32 tlbmiss_st_exits; >> - u32 addrerr_st_exits; >> - u32 addrerr_ld_exits; >> - u32 syscall_exits; >> - u32 resvd_inst_exits; >> - u32 break_inst_exits; >> - u32 trap_inst_exits; >> - u32 msa_fpe_exits; >> - u32 fpe_exits; >> - u32 msa_disabled_exits; >> - u32 flush_dcache_exits; >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> + u64 wait_exits; >> + u64 cache_exits; >> + u64 signal_exits; >> + u64 int_exits; >> + u64 cop_unusable_exits; >> + u64 tlbmod_exits; >> + u64 tlbmiss_ld_exits; >> + u64 tlbmiss_st_exits; >> + u64 addrerr_st_exits; >> + u64 addrerr_ld_exits; >> + u64 syscall_exits; >> + u64 resvd_inst_exits; >> + u64 break_inst_exits; >> + u64 trap_inst_exits; >> + u64 msa_fpe_exits; >> + u64 fpe_exits; >> + u64 msa_disabled_exits; >> + u64 flush_dcache_exits; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> }; >> >> enum kvm_mips_exit_types { >> diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h >> index 610f393..f6304c5 100644 >> --- a/arch/powerpc/include/asm/kvm_host.h >> +++ b/arch/powerpc/include/asm/kvm_host.h >> @@ -95,41 +95,41 @@ struct kvmppc_vcpu_book3s; >> struct kvmppc_book3s_shadow_vcpu; >> >> struct kvm_vm_stat { >> - u32 remote_tlb_flush; >> + ulong remote_tlb_flush; >> }; >> >> struct kvm_vcpu_stat { >> - u32 sum_exits; >> - u32 mmio_exits; >> - u32 signal_exits; >> - u32 light_exits; >> + u64 sum_exits; >> + u64 mmio_exits; >> + u64 signal_exits; >> + u64 light_exits; >> /* Account for special types of light exits: */ >> - u32 itlb_real_miss_exits; >> - u32 itlb_virt_miss_exits; >> - u32 dtlb_real_miss_exits; >> - u32 dtlb_virt_miss_exits; >> - u32 syscall_exits; >> - u32 isi_exits; >> - u32 dsi_exits; >> - u32 emulated_inst_exits; >> - u32 dec_exits; >> - u32 ext_intr_exits; >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> - u32 dbell_exits; >> - u32 gdbell_exits; >> - u32 ld; >> - u32 st; >> + u64 itlb_real_miss_exits; >> + u64 itlb_virt_miss_exits; >> + u64 dtlb_real_miss_exits; >> + u64 dtlb_virt_miss_exits; >> + u64 syscall_exits; >> + u64 isi_exits; >> + u64 dsi_exits; >> + u64 emulated_inst_exits; >> + u64 dec_exits; >> + u64 ext_intr_exits; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> + u64 dbell_exits; >> + u64 gdbell_exits; >> + u64 ld; >> + u64 st; >> #ifdef CONFIG_PPC_BOOK3S >> - u32 pf_storage; >> - u32 pf_instruc; >> - u32 sp_storage; >> - u32 sp_instruc; >> - u32 queue_intr; >> - u32 ld_slow; >> - u32 st_slow; >> + u64 pf_storage; >> + u64 pf_instruc; >> + u64 sp_storage; >> + u64 sp_instruc; >> + u64 queue_intr; >> + u64 ld_slow; >> + u64 st_slow; >> #endif >> }; >> >> diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h >> index ac82e8e..bdacd9c 100644 >> --- a/arch/s390/include/asm/kvm_host.h >> +++ b/arch/s390/include/asm/kvm_host.h >> @@ -238,69 +238,69 @@ struct sie_page { >> } __packed; >> >> struct kvm_vcpu_stat { >> - u32 exit_userspace; >> - u32 exit_null; >> - u32 exit_external_request; >> - u32 exit_external_interrupt; >> - u32 exit_stop_request; >> - u32 exit_validity; >> - u32 exit_instruction; >> - u32 exit_pei; >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> - u32 instruction_lctl; >> - u32 instruction_lctlg; >> - u32 instruction_stctl; >> - u32 instruction_stctg; >> - u32 exit_program_interruption; >> - u32 exit_instr_and_program; >> - u32 deliver_external_call; >> - u32 deliver_emergency_signal; >> - u32 deliver_service_signal; >> - u32 deliver_virtio_interrupt; >> - u32 deliver_stop_signal; >> - u32 deliver_prefix_signal; >> - u32 deliver_restart_signal; >> - u32 deliver_program_int; >> - u32 deliver_io_int; >> - u32 exit_wait_state; >> - u32 instruction_pfmf; >> - u32 instruction_stidp; >> - u32 instruction_spx; >> - u32 instruction_stpx; >> - u32 instruction_stap; >> - u32 instruction_storage_key; >> - u32 instruction_ipte_interlock; >> - u32 instruction_stsch; >> - u32 instruction_chsc; >> - u32 instruction_stsi; >> - u32 instruction_stfl; >> - u32 instruction_tprot; >> - u32 instruction_essa; >> - u32 instruction_sigp_sense; >> - u32 instruction_sigp_sense_running; >> - u32 instruction_sigp_external_call; >> - u32 instruction_sigp_emergency; >> - u32 instruction_sigp_cond_emergency; >> - u32 instruction_sigp_start; >> - u32 instruction_sigp_stop; >> - u32 instruction_sigp_stop_store_status; >> - u32 instruction_sigp_store_status; >> - u32 instruction_sigp_store_adtl_status; >> - u32 instruction_sigp_arch; >> - u32 instruction_sigp_prefix; >> - u32 instruction_sigp_restart; >> - u32 instruction_sigp_init_cpu_reset; >> - u32 instruction_sigp_cpu_reset; >> - u32 instruction_sigp_unknown; >> - u32 diagnose_10; >> - u32 diagnose_44; >> - u32 diagnose_9c; >> - u32 diagnose_258; >> - u32 diagnose_308; >> - u32 diagnose_500; >> + u64 exit_userspace; >> + u64 exit_null; >> + u64 exit_external_request; >> + u64 exit_external_interrupt; >> + u64 exit_stop_request; >> + u64 exit_validity; >> + u64 exit_instruction; >> + u64 exit_pei; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> + u64 instruction_lctl; >> + u64 instruction_lctlg; >> + u64 instruction_stctl; >> + u64 instruction_stctg; >> + u64 exit_program_interruption; >> + u64 exit_instr_and_program; >> + u64 deliver_external_call; >> + u64 deliver_emergency_signal; >> + u64 deliver_service_signal; >> + u64 deliver_virtio_interrupt; >> + u64 deliver_stop_signal; >> + u64 deliver_prefix_signal; >> + u64 deliver_restart_signal; >> + u64 deliver_program_int; >> + u64 deliver_io_int; >> + u64 exit_wait_state; >> + u64 instruction_pfmf; >> + u64 instruction_stidp; >> + u64 instruction_spx; >> + u64 instruction_stpx; >> + u64 instruction_stap; >> + u64 instruction_storage_key; >> + u64 instruction_ipte_interlock; >> + u64 instruction_stsch; >> + u64 instruction_chsc; >> + u64 instruction_stsi; >> + u64 instruction_stfl; >> + u64 instruction_tprot; >> + u64 instruction_essa; >> + u64 instruction_sigp_sense; >> + u64 instruction_sigp_sense_running; >> + u64 instruction_sigp_external_call; >> + u64 instruction_sigp_emergency; >> + u64 instruction_sigp_cond_emergency; >> + u64 instruction_sigp_start; >> + u64 instruction_sigp_stop; >> + u64 instruction_sigp_stop_store_status; >> + u64 instruction_sigp_store_status; >> + u64 instruction_sigp_store_adtl_status; >> + u64 instruction_sigp_arch; >> + u64 instruction_sigp_prefix; >> + u64 instruction_sigp_restart; >> + u64 instruction_sigp_init_cpu_reset; >> + u64 instruction_sigp_cpu_reset; >> + u64 instruction_sigp_unknown; >> + u64 diagnose_10; >> + u64 diagnose_44; >> + u64 diagnose_9c; >> + u64 diagnose_258; >> + u64 diagnose_308; >> + u64 diagnose_500; >> }; >> >> #define PGM_OPERATION 0x01 >> @@ -563,7 +563,7 @@ struct kvm_vcpu_arch { >> }; >> >> struct kvm_vm_stat { >> - u32 remote_tlb_flush; >> + ulong remote_tlb_flush; >> }; >> >> struct kvm_arch_memory_slot { >> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >> index 69e62862..c30462f 100644 >> --- a/arch/x86/include/asm/kvm_host.h >> +++ b/arch/x86/include/asm/kvm_host.h >> @@ -782,45 +782,45 @@ struct kvm_arch { >> }; >> >> struct kvm_vm_stat { >> - u32 mmu_shadow_zapped; >> - u32 mmu_pte_write; >> - u32 mmu_pte_updated; >> - u32 mmu_pde_zapped; >> - u32 mmu_flooded; >> - u32 mmu_recycled; >> - u32 mmu_cache_miss; >> - u32 mmu_unsync; >> - u32 remote_tlb_flush; >> - u32 lpages; >> + ulong mmu_shadow_zapped; >> + ulong mmu_pte_write; >> + ulong mmu_pte_updated; >> + ulong mmu_pde_zapped; >> + ulong mmu_flooded; >> + ulong mmu_recycled; >> + ulong mmu_cache_miss; >> + ulong mmu_unsync; >> + ulong remote_tlb_flush; >> + ulong lpages; >> }; >> >> struct kvm_vcpu_stat { >> - u32 pf_fixed; >> - u32 pf_guest; >> - u32 tlb_flush; >> - u32 invlpg; >> - >> - u32 exits; >> - u32 io_exits; >> - u32 mmio_exits; >> - u32 signal_exits; >> - u32 irq_window_exits; >> - u32 nmi_window_exits; >> - u32 halt_exits; >> - u32 halt_successful_poll; >> - u32 halt_attempted_poll; >> - u32 halt_poll_invalid; >> - u32 halt_wakeup; >> - u32 request_irq_exits; >> - u32 irq_exits; >> - u32 host_state_reload; >> - u32 efer_reload; >> - u32 fpu_reload; >> - u32 insn_emulation; >> - u32 insn_emulation_fail; >> - u32 hypercalls; >> - u32 irq_injections; >> - u32 nmi_injections; >> + u64 pf_fixed; >> + u64 pf_guest; >> + u64 tlb_flush; >> + u64 invlpg; >> + >> + u64 exits; >> + u64 io_exits; >> + u64 mmio_exits; >> + u64 signal_exits; >> + u64 irq_window_exits; >> + u64 nmi_window_exits; >> + u64 halt_exits; >> + u64 halt_successful_poll; >> + u64 halt_attempted_poll; >> + u64 halt_poll_invalid; >> + u64 halt_wakeup; >> + u64 request_irq_exits; >> + u64 irq_exits; >> + u64 host_state_reload; >> + u64 efer_reload; >> + u64 fpu_reload; >> + u64 insn_emulation; >> + u64 insn_emulation_fail; >> + u64 hypercalls; >> + u64 irq_injections; >> + u64 nmi_injections; >> }; >> >> struct x86_instruction_info; >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >> index 48bd520..37a6530 100644 >> --- a/virt/kvm/kvm_main.c >> +++ b/virt/kvm/kvm_main.c >> @@ -3531,7 +3531,7 @@ static int vm_stat_get_per_vm(void *data, u64 *val) >> { >> struct kvm_stat_data *stat_data = (struct kvm_stat_data *)data; >> >> - *val = *(u32 *)((void *)stat_data->kvm + stat_data->offset); >> + *val = *(ulong *)((void *)stat_data->kvm + stat_data->offset); >> >> return 0; >> } >> @@ -3561,7 +3561,7 @@ static int vcpu_stat_get_per_vm(void *data, u64 *val) >> *val = 0; >> >> kvm_for_each_vcpu(i, vcpu, stat_data->kvm) >> - *val += *(u32 *)((void *)vcpu + stat_data->offset); >> + *val += *(u64 *)((void *)vcpu + stat_data->offset); >> >> return 0; >> } >> -- >> 2.5.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html