From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>,
kvm@vger.kernel.org, qemu-devel@nongnu.org
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Subject: Re: [Qemu-devel] [QEMU patch 2/2] kvm: allow configuration of tsc deadline timer advancement
Date: Wed, 10 Dec 2014 18:01:21 +0100 [thread overview]
Message-ID: <54887C61.80008@redhat.com> (raw)
In-Reply-To: <20141210162420.218207164@amt.cnet>
On 10/12/2014 17:23, Marcelo Tosatti wrote:
> Add machine option and QMP commands to configure TSC deadline
> timer advancement.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> ---
> monitor.c | 15 ++++++++++
> qapi-schema.json | 29 +++++++++++++++++++
> qmp-commands.hx | 48 ++++++++++++++++++++++++++++++++
> target-i386/kvm.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> vl.c | 4 ++
> 5 files changed, 176 insertions(+)
>
> Index: qemu.tscdeadline/qapi-schema.json
> ===================================================================
> --- qemu.tscdeadline.orig/qapi-schema.json
> +++ qemu.tscdeadline/qapi-schema.json
> @@ -3515,3 +3515,32 @@
> # Since: 2.1
> ##
> { 'command': 'rtc-reset-reinjection' }
> +
> +##
> +# @set-lapic-tscdeadline-advance
> +#
> +# This command sets the TSC deadline timer advancement.
> +# This value will be subtracted from the expiration time
> +# of the high resolution timer which emulates
> +# TSC deadline timer.
> +#
> +# Useful to achieve low timer latencies.
> +#
> +# Only supported by KVM acceleration.
> +#
> +# Since: 2.3
> +##
> +{ 'command': 'set-lapic-tscdeadline-advance',
> + 'data': { 'advance':'int' }
> +}
> +
> +##
> +# @get-lapic-tscdeadline-advance
> +#
> +# This command gets the TSC deadline timer advancement.
> +#
> +# Only supported by KVM acceleration.
> +#
> +# Since: 2.3
> +##
> +{ 'command': 'get-lapic-tscdeadline-advance', 'returns': 'int' }
Please add an object property to the x86 CPU object. It can then be
configured with "-global" on the command line.
> + ret = kvm_vm_ioctl(s, KVM_SET_TSCDEADLINE_ADVANCE, &adv);
> + if (ret < 0) {
> + return ret;
> + }
Please use KVM_GET/SET_ONE_REG instead of introducing a new set of ioctls.
Paolo
> + lapic_tscdeadline_advance.advance_ns = advance;
> +
> + return ret;
> +}
> +
> int kvm_arch_init(KVMState *s)
> {
> uint64_t identity_base = 0xfffbc000;
> uint64_t shadow_mem;
> int ret;
> struct utsname utsname;
> + uint32_t lapic_advance_ns;
>
> ret = kvm_get_supported_msrs(s);
> if (ret < 0) {
> @@ -894,9 +919,40 @@ int kvm_arch_init(KVMState *s)
> return ret;
> }
> }
> +
> + lapic_advance_ns = qemu_opt_get_number(qemu_get_machine_opts(),
> + "lapic-tscdeadline-advance",
> + 0);
> + if (lapic_advance_ns) {
> + ret = kvm_set_lapic_tscdeadline(s, lapic_advance_ns);
> + if (ret) {
> + fprintf(stderr, "Set tscdeadline advance failed: %s\n",
> + strerror(-ret));
> + return ret;
> + }
> + }
> +
> +
> return 0;
> }
>
> +int64_t qmp_get_lapic_tscdeadline_advance(Error **errp)
> +{
> + return lapic_tscdeadline_advance.advance_ns;
> +}
> +
> +void qmp_set_lapic_tscdeadline_advance(int64_t advance, Error **errp)
> +{
> + KVMState *s = kvm_state;
> + int ret;
> +
> + ret = kvm_set_lapic_tscdeadline(s, advance);
> + if (ret) {
> + error_setg_errno(errp, ret, "set lapic tscdeadline failed");
> + return;
> + }
> +}
> +
> static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
> {
> lhs->selector = rhs->selector;
> Index: qemu.tscdeadline/monitor.c
> ===================================================================
> --- qemu.tscdeadline.orig/monitor.c
> +++ qemu.tscdeadline/monitor.c
> @@ -5447,3 +5447,18 @@ void qmp_rtc_reset_reinjection(Error **e
> error_set(errp, QERR_FEATURE_DISABLED, "rtc-reset-reinjection");
> }
> #endif
> +
> +#if !defined (TARGET_I386) || !defined (CONFIG_KVM)
> +int64_t qmp_get_lapic_tscdeadline_advance(Error **errp)
> +{
> + error_set(errp, QERR_FEATURE_DISABLED, "get-lapic-tscdeadline-advance");
> +
> + return 0;
> +}
> +
> +void qmp_set_lapic_tscdeadline_advance(int64_t advance, Error **errp)
> +{
> + error_set(errp, QERR_FEATURE_DISABLED, "set-lapic-tscdeadline-advance");
> +}
> +#endif
> +
> Index: qemu.tscdeadline/include/hw/boards.h
> ===================================================================
> --- qemu.tscdeadline.orig/include/hw/boards.h
> +++ qemu.tscdeadline/include/hw/boards.h
> @@ -133,6 +133,7 @@ struct MachineState {
> bool usb;
> char *firmware;
> bool iommu;
> + int lapi_tscdeadline_advance;
>
> ram_addr_t ram_size;
> ram_addr_t maxram_size;
> Index: qemu.tscdeadline/qemu-options.hx
> ===================================================================
> --- qemu.tscdeadline.orig/qemu-options.hx
> +++ qemu.tscdeadline/qemu-options.hx
> @@ -37,7 +37,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_mach
> " kvm_shadow_mem=size of KVM shadow MMU\n"
> " dump-guest-core=on|off include guest memory in a core dump (default=on)\n"
> " mem-merge=on|off controls memory merge support (default: on)\n"
> - " iommu=on|off controls emulated Intel IOMMU (VT-d) support (default=off)\n",
> + " iommu=on|off controls emulated Intel IOMMU (VT-d) support (default=off)\n"
> + " lapic-tscdeadline-advance=value controls LAPIC tscdeadline timer advancement (default=0)\n",
> QEMU_ARCH_ALL)
> STEXI
> @item -machine [type=]@var{name}[,prop=@var{value}[,...]]
> @@ -66,6 +67,8 @@ the host, de-duplicates identical memory
> (enabled by default).
> @item iommu=on|off
> Enables or disables emulated Intel IOMMU (VT-d) support. The default is off.
> +@item lapic-tscdeadline-advance=value
> +Defines the advancement of LAPIC TSC deadline timer, in nanoseconds.
> @end table
> ETEXI
>
> Index: qemu.tscdeadline/hw/core/machine.c
> ===================================================================
> --- qemu.tscdeadline.orig/hw/core/machine.c
> +++ qemu.tscdeadline/hw/core/machine.c
> @@ -72,6 +72,35 @@ static void machine_set_kvm_shadow_mem(O
> ms->kvm_shadow_mem = value;
> }
>
> +static void machine_get_lapic_tscdeadline_advance(Object *obj, Visitor *v,
> + void *opaque,
> + const char *name,
> + Error **errp)
> +{
> + MachineState *ms = MACHINE(obj);
> + int64_t value = ms->kvm_shadow_mem;
> +
> + visit_type_int(v, &value, name, errp);
> +}
> +
> +static void machine_set_lapic_tscdeadline_advance(Object *obj, Visitor *v,
> + void *opaque,
> + const char *name,
> + Error **errp)
> +{
> + MachineState *ms = MACHINE(obj);
> + Error *error = NULL;
> + int64_t value;
> +
> + visit_type_int(v, &value, name, &error);
> + if (error) {
> + error_propagate(errp, error);
> + return;
> + }
> +
> + ms->lapi_tscdeadline_advance = value;
> +}
> +
> static char *machine_get_kernel(Object *obj, Error **errp)
> {
> MachineState *ms = MACHINE(obj);
> @@ -299,6 +328,10 @@ static void machine_initfn(Object *obj)
> machine_get_kvm_shadow_mem,
> machine_set_kvm_shadow_mem,
> NULL, NULL, NULL);
> + object_property_add(obj, "lapic-tscdeadline-advance", "int",
> + machine_get_lapic_tscdeadline_advance,
> + machine_set_lapic_tscdeadline_advance,
> + NULL, NULL, NULL);
> object_property_add_str(obj, "kernel",
> machine_get_kernel, machine_set_kernel, NULL);
> object_property_add_str(obj, "initrd",
>
>
next prev parent reply other threads:[~2014-12-10 17:01 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-10 16:23 [Qemu-devel] [QEMU patch 0/2] QEMU lapic tsc deadline advancement Marcelo Tosatti
2014-12-10 16:23 ` [Qemu-devel] [QEMU patch 1/2] kvm: sync kernel headers Marcelo Tosatti
2014-12-10 16:23 ` [Qemu-devel] [QEMU patch 2/2] kvm: allow configuration of tsc deadline timer advancement Marcelo Tosatti
2014-12-10 17:01 ` Paolo Bonzini [this message]
2014-12-10 17:04 ` Marcelo Tosatti
2014-12-10 17:09 ` Paolo Bonzini
2014-12-10 17:27 ` Marcelo Tosatti
2014-12-10 17:29 ` Paolo Bonzini
2014-12-10 17:35 ` Marcelo Tosatti
2014-12-10 17:55 ` Paolo Bonzini
2014-12-10 18:39 ` Radim Krčmář
2014-12-10 18:59 ` Paolo Bonzini
2014-12-10 17:06 ` Eric Blake
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=54887C61.80008@redhat.com \
--to=pbonzini@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=lcapitulino@redhat.com \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.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 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).