From: Marc Zyngier <maz@kernel.org>
To: Jing Zhang <jingzhangos@google.com>
Cc: KVM <kvm@vger.kernel.org>, KVM ARM <kvmarm@lists.cs.columbia.edu>,
Linux MIPS <linux-mips@vger.kernel.org>,
KVM PPC <kvm-ppc@vger.kernel.org>,
Linux S390 <linux-s390@vger.kernel.org>,
Linux kselftest <linux-kselftest@vger.kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
James Morse <james.morse@arm.com>,
Julien Thierry <julien.thierry.kdev@gmail.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Will Deacon <will@kernel.org>,
Huacai Chen <chenhuacai@kernel.org>,
Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Paul Mackerras <paulus@ozlabs.org>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
David Hildenbrand <david@redhat.com>,
Cornelia Huck <cohuck@redhat.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
Sean Christopherson <seanjc@google.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Jim Mattson <jmattson@google.com>,
Peter Shier <pshier@google.com>, Oliver Upton <oupton@google.com>,
David Rientjes <rientjes@google.com>,
Emanuele Giuseppe Esposito <eesposit@redhat.com>
Subject: Re: [RFC PATCH 3/4] KVM: stats: Add ioctl commands to pull statistics in binary format
Date: Wed, 10 Mar 2021 15:51:06 +0000 [thread overview]
Message-ID: <875z1zxb11.wl-maz@kernel.org> (raw)
In-Reply-To: <20210310003024.2026253-4-jingzhangos@google.com>
On Wed, 10 Mar 2021 00:30:23 +0000,
Jing Zhang <jingzhangos@google.com> wrote:
>
> Three ioctl commands are added to support binary form statistics data
> retrieval. KVM_STATS_GET_INFO, KVM_STATS_GET_NAMES, KVM_STATS_GET_DATA.
> KVM_CAP_STATS_BINARY_FORM indicates the capability.
>
> Signed-off-by: Jing Zhang <jingzhangos@google.com>
> ---
> virt/kvm/kvm_main.c | 115 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 115 insertions(+)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 383df23514b9..87dd62516c8b 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -3464,6 +3464,51 @@ static long kvm_vcpu_ioctl(struct file *filp,
> r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu);
> break;
> }
> + case KVM_STATS_GET_INFO: {
> + struct kvm_stats_info stats_info;
> +
> + r = -EFAULT;
> + stats_info.num_stats = VCPU_STAT_COUNT;
> + if (copy_to_user(argp, &stats_info, sizeof(stats_info)))
> + goto out;
> + r = 0;
> + break;
> + }
> + case KVM_STATS_GET_NAMES: {
> + struct kvm_stats_names stats_names;
> +
> + r = -EFAULT;
> + if (copy_from_user(&stats_names, argp, sizeof(stats_names)))
> + goto out;
> + r = -EINVAL;
> + if (stats_names.size < VCPU_STAT_COUNT * KVM_STATS_NAME_LEN)
> + goto out;
> +
> + r = -EFAULT;
> + if (copy_to_user(argp + sizeof(stats_names),
> + kvm_vcpu_stat_strings,
> + VCPU_STAT_COUNT * KVM_STATS_NAME_LEN))
> + goto out;
> + r = 0;
> + break;
> + }
> + case KVM_STATS_GET_DATA: {
> + struct kvm_stats_data stats_data;
> +
> + r = -EFAULT;
> + if (copy_from_user(&stats_data, argp, sizeof(stats_data)))
> + goto out;
> + r = -EINVAL;
> + if (stats_data.size < sizeof(vcpu->stat))
> + goto out;
> +
> + r = -EFAULT;
> + argp += sizeof(stats_data);
> + if (copy_to_user(argp, &vcpu->stat, sizeof(vcpu->stat)))
> + goto out;
> + r = 0;
> + break;
> + }
> default:
> r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
> }
> @@ -3695,6 +3740,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
> case KVM_CAP_CHECK_EXTENSION_VM:
> case KVM_CAP_ENABLE_CAP_VM:
> case KVM_CAP_HALT_POLL:
> + case KVM_CAP_STATS_BINARY_FORM:
> return 1;
> #ifdef CONFIG_KVM_MMIO
> case KVM_CAP_COALESCED_MMIO:
> @@ -3825,6 +3871,40 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
> }
> }
>
> +static long kvm_vm_ioctl_stats_get_data(struct kvm *kvm, unsigned long arg)
> +{
> + void __user *argp = (void __user *)arg;
> + struct kvm_vcpu *vcpu;
> + struct kvm_stats_data stats_data;
> + u64 *data = NULL, *pdata;
> + int i, j, ret = 0;
> + size_t dsize = (VM_STAT_COUNT + VCPU_STAT_COUNT) * sizeof(*data);
> +
> +
> + if (copy_from_user(&stats_data, argp, sizeof(stats_data)))
> + return -EFAULT;
> + if (stats_data.size < dsize)
> + return -EINVAL;
> + data = kzalloc(dsize, GFP_KERNEL_ACCOUNT);
> + if (!data)
> + return -ENOMEM;
> +
> + for (i = 0; i < VM_STAT_COUNT; i++)
> + *(data + i) = *((ulong *)&kvm->stat + i);
This kind of dance could be avoided if your stats were just an array,
or a union of the current data structure and an array.
> +
> + kvm_for_each_vcpu(j, vcpu, kvm) {
> + pdata = data + VM_STAT_COUNT;
> + for (i = 0; i < VCPU_STAT_COUNT; i++, pdata++)
> + *pdata += *((u64 *)&vcpu->stat + i);
Do you really need the in-kernel copy? Why not directly organise the
data structures in a way that would allow a bulk copy using
copy_to_user()?
Another thing is the atomicity of what you are reporting. Don't you
care about the consistency of the counters?
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Jing Zhang <jingzhangos@google.com>
Cc: KVM <kvm@vger.kernel.org>, David Hildenbrand <david@redhat.com>,
Paul Mackerras <paulus@ozlabs.org>,
Linux kselftest <linux-kselftest@vger.kernel.org>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
Will Deacon <will@kernel.org>,
KVM ARM <kvmarm@lists.cs.columbia.edu>,
Emanuele Giuseppe Esposito <eesposit@redhat.com>,
Linux S390 <linux-s390@vger.kernel.org>,
Janosch Frank <frankja@linux.ibm.com>,
Oliver Upton <oupton@google.com>,
Huacai Chen <chenhuacai@kernel.org>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>,
David Rientjes <rientjes@google.com>,
KVM PPC <kvm-ppc@vger.kernel.org>,
Jim Mattson <jmattson@google.com>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Sean Christopherson <seanjc@google.com>,
Cornelia Huck <cohuck@redhat.com>,
Peter Shier <pshier@google.com>,
Linux MIPS <linux-mips@vger.kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>
Subject: Re: [RFC PATCH 3/4] KVM: stats: Add ioctl commands to pull statistics in binary format
Date: Wed, 10 Mar 2021 15:51:06 +0000 [thread overview]
Message-ID: <875z1zxb11.wl-maz@kernel.org> (raw)
In-Reply-To: <20210310003024.2026253-4-jingzhangos@google.com>
On Wed, 10 Mar 2021 00:30:23 +0000,
Jing Zhang <jingzhangos@google.com> wrote:
>
> Three ioctl commands are added to support binary form statistics data
> retrieval. KVM_STATS_GET_INFO, KVM_STATS_GET_NAMES, KVM_STATS_GET_DATA.
> KVM_CAP_STATS_BINARY_FORM indicates the capability.
>
> Signed-off-by: Jing Zhang <jingzhangos@google.com>
> ---
> virt/kvm/kvm_main.c | 115 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 115 insertions(+)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 383df23514b9..87dd62516c8b 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -3464,6 +3464,51 @@ static long kvm_vcpu_ioctl(struct file *filp,
> r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu);
> break;
> }
> + case KVM_STATS_GET_INFO: {
> + struct kvm_stats_info stats_info;
> +
> + r = -EFAULT;
> + stats_info.num_stats = VCPU_STAT_COUNT;
> + if (copy_to_user(argp, &stats_info, sizeof(stats_info)))
> + goto out;
> + r = 0;
> + break;
> + }
> + case KVM_STATS_GET_NAMES: {
> + struct kvm_stats_names stats_names;
> +
> + r = -EFAULT;
> + if (copy_from_user(&stats_names, argp, sizeof(stats_names)))
> + goto out;
> + r = -EINVAL;
> + if (stats_names.size < VCPU_STAT_COUNT * KVM_STATS_NAME_LEN)
> + goto out;
> +
> + r = -EFAULT;
> + if (copy_to_user(argp + sizeof(stats_names),
> + kvm_vcpu_stat_strings,
> + VCPU_STAT_COUNT * KVM_STATS_NAME_LEN))
> + goto out;
> + r = 0;
> + break;
> + }
> + case KVM_STATS_GET_DATA: {
> + struct kvm_stats_data stats_data;
> +
> + r = -EFAULT;
> + if (copy_from_user(&stats_data, argp, sizeof(stats_data)))
> + goto out;
> + r = -EINVAL;
> + if (stats_data.size < sizeof(vcpu->stat))
> + goto out;
> +
> + r = -EFAULT;
> + argp += sizeof(stats_data);
> + if (copy_to_user(argp, &vcpu->stat, sizeof(vcpu->stat)))
> + goto out;
> + r = 0;
> + break;
> + }
> default:
> r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
> }
> @@ -3695,6 +3740,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
> case KVM_CAP_CHECK_EXTENSION_VM:
> case KVM_CAP_ENABLE_CAP_VM:
> case KVM_CAP_HALT_POLL:
> + case KVM_CAP_STATS_BINARY_FORM:
> return 1;
> #ifdef CONFIG_KVM_MMIO
> case KVM_CAP_COALESCED_MMIO:
> @@ -3825,6 +3871,40 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
> }
> }
>
> +static long kvm_vm_ioctl_stats_get_data(struct kvm *kvm, unsigned long arg)
> +{
> + void __user *argp = (void __user *)arg;
> + struct kvm_vcpu *vcpu;
> + struct kvm_stats_data stats_data;
> + u64 *data = NULL, *pdata;
> + int i, j, ret = 0;
> + size_t dsize = (VM_STAT_COUNT + VCPU_STAT_COUNT) * sizeof(*data);
> +
> +
> + if (copy_from_user(&stats_data, argp, sizeof(stats_data)))
> + return -EFAULT;
> + if (stats_data.size < dsize)
> + return -EINVAL;
> + data = kzalloc(dsize, GFP_KERNEL_ACCOUNT);
> + if (!data)
> + return -ENOMEM;
> +
> + for (i = 0; i < VM_STAT_COUNT; i++)
> + *(data + i) = *((ulong *)&kvm->stat + i);
This kind of dance could be avoided if your stats were just an array,
or a union of the current data structure and an array.
> +
> + kvm_for_each_vcpu(j, vcpu, kvm) {
> + pdata = data + VM_STAT_COUNT;
> + for (i = 0; i < VCPU_STAT_COUNT; i++, pdata++)
> + *pdata += *((u64 *)&vcpu->stat + i);
Do you really need the in-kernel copy? Why not directly organise the
data structures in a way that would allow a bulk copy using
copy_to_user()?
Another thing is the atomicity of what you are reporting. Don't you
care about the consistency of the counters?
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
next prev parent reply other threads:[~2021-03-10 15:51 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-10 0:30 [RFC PATCH 0/4] KVM: stats: Retrieve statistics data in binary format Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 0:30 ` [RFC PATCH 1/4] KVM: stats: Separate statistics name strings from debugfs code Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 14:19 ` Marc Zyngier
2021-03-10 14:19 ` Marc Zyngier
2021-03-10 14:19 ` Marc Zyngier
2021-03-10 18:51 ` Jing Zhang
2021-03-10 18:51 ` Jing Zhang
2021-03-10 18:51 ` Jing Zhang
2021-03-10 0:30 ` [RFC PATCH 2/4] KVM: stats: Define APIs for aggregated stats retrieval in binary format Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 14:58 ` Marc Zyngier
2021-03-10 14:58 ` Marc Zyngier
2021-03-10 14:58 ` Marc Zyngier
2021-03-10 19:36 ` Jing Zhang
2021-03-10 19:36 ` Jing Zhang
2021-03-10 19:36 ` Jing Zhang
2021-03-10 0:30 ` [RFC PATCH 3/4] KVM: stats: Add ioctl commands to pull statistics " Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 14:55 ` Paolo Bonzini
2021-03-10 14:55 ` Paolo Bonzini
2021-03-10 14:55 ` Paolo Bonzini
2021-03-10 21:41 ` Jing Zhang
2021-03-10 21:41 ` Jing Zhang
2021-03-10 21:41 ` Jing Zhang
2021-03-12 18:11 ` Paolo Bonzini
2021-03-12 18:11 ` Paolo Bonzini
2021-03-12 18:11 ` Paolo Bonzini
2021-03-12 22:27 ` Jing Zhang
2021-03-12 22:27 ` Jing Zhang
2021-03-12 22:27 ` Jing Zhang
2021-03-13 9:35 ` Paolo Bonzini
2021-03-13 9:35 ` Paolo Bonzini
2021-03-13 9:35 ` Paolo Bonzini
2021-03-15 22:31 ` Jing Zhang
2021-03-15 22:31 ` Jing Zhang
2021-03-15 22:31 ` Jing Zhang
2021-03-16 17:54 ` Paolo Bonzini
2021-03-16 17:54 ` Paolo Bonzini
2021-03-16 17:54 ` Paolo Bonzini
2021-03-10 15:51 ` Marc Zyngier [this message]
2021-03-10 15:51 ` Marc Zyngier
2021-03-10 16:03 ` Paolo Bonzini
2021-03-10 16:03 ` Paolo Bonzini
2021-03-10 16:03 ` Paolo Bonzini
2021-03-10 17:05 ` Marc Zyngier
2021-03-10 17:05 ` Marc Zyngier
2021-03-10 17:11 ` Paolo Bonzini
2021-03-10 17:11 ` Paolo Bonzini
2021-03-10 17:11 ` Paolo Bonzini
2021-03-10 17:31 ` Marc Zyngier
2021-03-10 17:31 ` Marc Zyngier
2021-03-10 17:44 ` Paolo Bonzini
2021-03-10 17:44 ` Paolo Bonzini
2021-03-10 17:44 ` Paolo Bonzini
2021-03-10 21:43 ` Jing Zhang
2021-03-10 21:43 ` Jing Zhang
2021-03-10 21:43 ` Jing Zhang
2021-03-10 0:30 ` [RFC PATCH 4/4] KVM: selftests: Add selftest for KVM binary form statistics interface Jing Zhang
2021-03-10 0:30 ` Jing Zhang
2021-03-10 0:30 ` Jing Zhang
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=875z1zxb11.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=aleksandar.qemu.devel@gmail.com \
--cc=borntraeger@de.ibm.com \
--cc=chenhuacai@kernel.org \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=eesposit@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=james.morse@arm.com \
--cc=jingzhangos@google.com \
--cc=jmattson@google.com \
--cc=julien.thierry.kdev@gmail.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=oupton@google.com \
--cc=paulus@ozlabs.org \
--cc=pbonzini@redhat.com \
--cc=pshier@google.com \
--cc=rientjes@google.com \
--cc=seanjc@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tsbogend@alpha.franken.de \
--cc=vkuznets@redhat.com \
--cc=will@kernel.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: link
Be 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.