qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Vitaly Kuznetsov <vkuznets@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [PATCH v3 18/19] i386: provide simple 'hv-default=on' option
Date: Thu, 21 Jan 2021 17:23:53 +0100	[thread overview]
Message-ID: <20210121172353.4649bb18@redhat.com> (raw)
In-Reply-To: <20210121142704.1a150cac@redhat.com>

On Thu, 21 Jan 2021 14:27:04 +0100
Igor Mammedov <imammedo@redhat.com> wrote:

> On Wed, 20 Jan 2021 15:49:09 -0500
> Eduardo Habkost <ehabkost@redhat.com> wrote:
> 
> > On Wed, Jan 20, 2021 at 08:08:32PM +0100, Igor Mammedov wrote:  
> > > On Wed, 20 Jan 2021 15:38:33 +0100
> > > Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
> > >     
> > > > Igor Mammedov <imammedo@redhat.com> writes:
> > > >     
> > > > > On Fri, 15 Jan 2021 10:20:23 +0100
> > > > > Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
> > > > >      
> > > > >> Igor Mammedov <imammedo@redhat.com> writes:
> > > > >>       
> > > > >> > On Thu,  7 Jan 2021 16:14:49 +0100
> > > > >> > Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
> > > > >> >        
> > > > >> >> Enabling Hyper-V emulation for a Windows VM is a tiring experience as it
> > > > >> >> requires listing all currently supported enlightenments ("hv-*" CPU
> > > > >> >> features) explicitly. We do have 'hv-passthrough' mode enabling
> > > > >> >> everything but it can't be used in production as it prevents migration.
> > > > >> >> 
> > > > >> >> Introduce a simple 'hv-default=on' CPU flag enabling all currently supported
> > > > >> >> Hyper-V enlightenments. Later, when new enlightenments get implemented,
> > > > >> >> compat_props mechanism will be used to disable them for legacy machine types,
> > > > >> >> this will keep 'hv-default=on' configurations migratable.
> > > > >> >> 
> > > > >> >> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
> > > > >> >> ---
> > > > >> >>  docs/hyperv.txt   | 16 +++++++++++++---
> > > > >> >>  target/i386/cpu.c | 38 ++++++++++++++++++++++++++++++++++++++
> > > > >> >>  target/i386/cpu.h |  5 +++++
> > > > >> >>  3 files changed, 56 insertions(+), 3 deletions(-)
> > > > >> >> 
> > > > >> >> diff --git a/docs/hyperv.txt b/docs/hyperv.txt
> > > > >> >> index 5df00da54fc4..a54c066cab09 100644
> > > > >> >> --- a/docs/hyperv.txt
> > > > >> >> +++ b/docs/hyperv.txt
> > > > >> >> @@ -17,10 +17,20 @@ compatible hypervisor and use Hyper-V specific features.
> > > > >> >>  
> > > > >> >>  2. Setup
> > > > >> >>  =========
> > > > >> >> -No Hyper-V enlightenments are enabled by default by either KVM or QEMU. In
> > > > >> >> -QEMU, individual enlightenments can be enabled through CPU flags, e.g:
> > > > >> >> +All currently supported Hyper-V enlightenments can be enabled by specifying
> > > > >> >> +'hv-default=on' CPU flag:
> > > > >> >>  
> > > > >> >> -  qemu-system-x86_64 --enable-kvm --cpu host,hv_relaxed,hv_vpindex,hv_time, ...
> > > > >> >> +  qemu-system-x86_64 --enable-kvm --cpu host,hv-default ...
> > > > >> >> +
> > > > >> >> +Alternatively, it is possible to do fine-grained enablement through CPU flags,
> > > > >> >> +e.g:
> > > > >> >> +
> > > > >> >> +  qemu-system-x86_64 --enable-kvm --cpu host,hv-relaxed,hv-vpindex,hv-time ...        
> > > > >> >
> > > > >> > I'd put here not '...' but rather recommended list of flags, and update
> > > > >> > it every time when new feature added if necessary.
> > > > >> >        
> > > > >
> > > > > 1)
> > > > >        
> > > > >> This is an example of fine-grained enablement, there is no point to put
> > > > >> all the existing flags there (hv-default is the only recommended way
> > > > >> now, the rest is 'expert'/'debugging').      
> > > > > so users are kept in dark what hv-default disables/enables (and it might depend
> > > > > on machine version on top that). Doesn't look like a good documentation to me
> > > > > (sure everyone can go and read source code for it and try to figure out how
> > > > > it's supposed to work)      
> > > > 
> > > > 'hv-default' enables *all* currently supported enlightenments. When
> > > > using with an old machine type, it will enable *all* Hyper-V
> > > > enlightenmnets which were supported when the corresponding machine type
> > > > was released. I don't think we document all other cases when a machine
> > > > type is modified (i.e. where can I read how pc-q35-5.1 is different from
> > > > pc-q35-5.0 if I refuse to read the source code?)
> > > >     
> > > > >      
> > > > >>      
> > > > >> > (not to mention that if we had it to begin with, then new 'hv-default' won't
> > > > >> > be necessary, I still see it as functionality duplication but I will not oppose it)
> > > > >> >        
> > > > >> 
> > > > >> Unfortunately, upper layer tools don't read this doc and update
> > > > >> themselves to enable new features when they appear.      
> > > > > rant: (just merge all libvirt into QEMU, and make VM configuration less low-level.
> > > > > why stop there, just merge with yet another upper layer, it would save us a lot
> > > > > on communication protocols and simplify VM creation even more,
> > > > > and no one will have to read docs and write anything new on top.)
> > > > > There should be limit somewhere, where QEMU job ends and others pile hw abstraction
> > > > > layers on top of it.      
> > > > 
> > > > We have '-machine q35' and we don't require to list all the devices from
> > > > it. We have '-cpu Skylake-Server' and we don't require to configure all
> > > > the features manually. Why can't we have similar enablement for Hyper-V
> > > > emulation where we can't even see a real need for anything but 'enable
> > > > everything' option?
> > > > 
> > > > There is no 'one libvirt to rule them all' (fortunately or
> > > > unfortunately). And sometimes QEMU is the uppermost layer and there's no
> > > > 'libvirt' on top of it, this is also a perfectly valid use-case.
> > > >     
> > > > >      
> > > > >> Similarly, if when these tools use '-machine q35' they get all the new features we add
> > > > >> automatically, right?      
> > > > > it depends, in case of CPUs, new features usually 'off' by default
> > > > > for existing models. In case of bugs, features sometimes could be
> > > > > flipped and versioned machines were used to keep broken CPU models
> > > > > on old machine types.
> > > > >      
> > > > 
> > > > That's why I was saying that Hyper-V enlightenments hardly resemble
> > > > 'hardware' CPU features.    
> > > Well, Microsoft chose to implement them as hardware concept (CPUID leaf),
> > > and I prefer to treat them the same way as any other CPUID bits.
> > >     
> > > >     
> > > > >          
> > > > >> >> +It is also possible to disable individual enlightenments from the default list,
> > > > >> >> +this can be used for debugging purposes:
> > > > >> >> +
> > > > >> >> +  qemu-system-x86_64 --enable-kvm --cpu host,hv-default=on,hv-evmcs=off ...
> > > > >> >>  
> > > > >> >>  Sometimes there are dependencies between enlightenments, QEMU is supposed to
> > > > >> >>  check that the supplied configuration is sane.
> > > > >> >> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> > > > >> >> index 48007a876e32..99338de00f78 100644
> > > > >> >> --- a/target/i386/cpu.c
> > > > >> >> +++ b/target/i386/cpu.c
> > > > >> >> @@ -4552,6 +4552,24 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
> > > > >> >>      cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
> > > > >> >>  }
> > > > >> >>  
> > > > >> >> +static bool x86_hv_default_get(Object *obj, Error **errp)
> > > > >> >> +{
> > > > >> >> +    X86CPU *cpu = X86_CPU(obj);
> > > > >> >> +
> > > > >> >> +    return cpu->hyperv_default;
> > > > >> >> +}
> > > > >> >> +
> > > > >> >> +static void x86_hv_default_set(Object *obj, bool value, Error **errp)
> > > > >> >> +{
> > > > >> >> +    X86CPU *cpu = X86_CPU(obj);
> > > > >> >> +
> > > > >> >> +    cpu->hyperv_default = value;
> > > > >> >> +
> > > > >> >> +    if (value) {
> > > > >> >> +        cpu->hyperv_features |= cpu->hyperv_default_features;        
> > > > >> >
> > > > >> > s/|="/=/ please,
> > > > >> > i.e. no option overrides whatever was specified before to keep semantics consistent.
> > > > >> >        
> > > > >> 
> > > > >> Hm,
> > > > >>       
> > > > >      
> > > > >> this doesn't matter for the most recent machine type as
> > > > >> hyperv_default_features has all the features but imagine you're running
> > > > >> an older machine type which doesn't have 'hv_feature'. Now your      
> > > > > normally one shouldn't use new feature with old machine type as it makes
> > > > > VM non-migratable to older QEMU that has this machine type but not this feature.
> > > > >
> > > > > nitpicking:
> > > > >   according to (1) user should not use 'hv_feature' on old machine since
> > > > >   hv_default should cover all their needs (well they don't know what
> > > > > hv_default actually is).      
> > > > 
> > > > Normally yes but I can imagine sticking to some old machine type for
> > > > other-than-hyperv-enlightenments purposes and still wanting to add a
> > > > newly introduced enlightenment. Migration is not always a must.
> > > >     
> > > > >      
> > > > >> suggestion is 
> > > > >> 
> > > > >> if I do:
> > > > >> 
> > > > >> 'hv_default,hv_feature=on' I will get "hyperv_default_features | hv_feature"
> > > > >> 
> > > > >> but if I do
> > > > >> 
> > > > >> 'hv_feature=on,hv_default' I will just get 'hyperv_default_features'
> > > > >> (as hv_default enablement will overwrite everything)
> > > > >> 
> > > > >> How is this consistent?      
> > > > > usual semantics for properties, is that the latest property overwrites,
> > > > > the previous property value parsed from left to right.
> > > > > (i.e. if one asked for hv_default, one gets it related CPUID bit set/unset,
> > > > > if one needs more than that one should add more related features after that.
> > > > >      
> > > > 
> > > > This semantics probably doesn't apply to 'hv-default' case IMO as my
> > > > brain refuses to accept the fact that    
> > > it's difficult probably because 'hv-default' is 'alias' property 
> > > that covers all individual hv-foo features in one go and that individual
> > > features are exposed to user, but otherwise it is just a property that
> > > sets CPUID features or like any other property, and should be treated like such.
> > >     
> > > > 'hv_default,hv_feature' != 'hv_feature,hv_default'
> > > >
> > > > which should express the same desire 'the default set PLUS the feature I
> > > > want'.    
> > > if hv_default were touching different data, I'd agree.
> > > But in the end hv_default boils down to the same CPUID bits as individual
> > > features:
> > > 
> > >   hv_default,hv_f2 => (hv_f1=on,hv_f2=off),hv_f2=on
> > >          !=
> > >   hv_f2,hv_default => hv_f2=on,(hv_f1=on,hv_f2=off)    
> > 
> > I don't know why you chose to define "hv_default" as
> > hv_f1=on,hv_f2=off.  If hv_f2 is not enabled by hv_default, it
> > doesn't need to be touched by hv_default at all.  
> 
> Essentially I was thinking about hv_default=on as setting default value
> of hv CPUID leaf i.e. like doc claims, 'all' hv_* features (including
> turned off and unused bits) which always sets leaf to its default state.
> 
> Now lets consider following possible situation
> using combine' approach (leaf |= some_bits):
> 
> QEMU-6.0: initially we have all possible features enabled
>                 hv_default = (hv_f1=on,hv_f2=on)
> 
> hv_f2=on,hv_default=on == hv_f1=on,hv_f2=on
> 
> QEMU-6.1: disabled hv_f2=off that was causing problems
> 
> hv_default = (hv_f1=on,hv_f2=off)
> 
> however due to ORing hv_default doesn't fix issue for the same CLI
> (i.e. it doesn't have expected effect)
> 
> hv_f2=on,hv_default=on => hv_f1=on,hv_f2=on
> 
> if one would use usual 'set' semantics (leaf = all_bits),
> then new hv_default value will have desired effect despite of botched CLI,
> just by virtue of property following typical 'last set' semantics:
> 
>  => hv_f1=on,hv_f2=off  
> 
> If we assume that we 'never ever' will need to disable feature bits
> than it doesn't matter which approach to use, however a look at
> pc_compat arrays shows that features are being enabled/disabled
> all the time.

Also there should be a good reason for adding new semantics and
deviating from typical property behavior.




  reply	other threads:[~2021-01-21 16:26 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-07 15:06 [PATCH v3 00/19] i386: KVM: expand Hyper-V features early and provide simple 'hv-default=on' option Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 01/19] linux-headers: update against 5.11-rc2 Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 02/19] i386: introduce kvm_hv_evmcs_available() Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 03/19] i386: keep hyperv_vendor string up-to-date Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 04/19] i386: invert hyperv_spinlock_attempts setting logic with hv_passthrough Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 05/19] i386: always fill Hyper-V CPUID feature leaves from X86CPU data Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 06/19] i386: stop using env->features[] for filling Hyper-V CPUIDs Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 07/19] i386: introduce hyperv_feature_supported() Vitaly Kuznetsov
2021-01-07 15:06 ` [PATCH v3 08/19] i386: introduce hv_cpuid_get_host() Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 09/19] i386: drop FEAT_HYPERV feature leaves Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 10/19] i386: introduce hv_cpuid_cache Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 11/19] i386: split hyperv_handle_properties() into hyperv_expand_features()/hyperv_fill_cpuids() Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 12/19] i386: move eVMCS enablement to hyperv_init_vcpu() Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 13/19] i386: switch hyperv_expand_features() to using error_setg() Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 14/19] i386: adjust the expected KVM_GET_SUPPORTED_HV_CPUID array size Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 15/19] i386: prefer system KVM_GET_SUPPORTED_HV_CPUID ioctl over vCPU's one Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 16/19] i386: use global kvm_state in hyperv_enabled() check Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 17/19] i386: expand Hyper-V features during CPU feature expansion time Vitaly Kuznetsov
2021-01-07 15:14 ` [PATCH v3 18/19] i386: provide simple 'hv-default=on' option Vitaly Kuznetsov
2021-01-15  2:11   ` Igor Mammedov
2021-01-15  9:20     ` Vitaly Kuznetsov
2021-01-20 13:13       ` Igor Mammedov
2021-01-20 14:38         ` Vitaly Kuznetsov
2021-01-20 19:08           ` Igor Mammedov
2021-01-20 20:49             ` Eduardo Habkost
2021-01-21 13:27               ` Igor Mammedov
2021-01-21 16:23                 ` Igor Mammedov [this message]
2021-01-21 17:08                 ` Eduardo Habkost
2021-01-25 13:42                   ` David Edmondson
2021-01-21  8:45             ` Vitaly Kuznetsov
2021-01-21 13:49               ` Igor Mammedov
2021-01-21 16:51                 ` Vitaly Kuznetsov
2021-01-20 19:55         ` Eduardo Habkost
2021-01-07 15:14 ` [PATCH v3 19/19] qtest/hyperv: Introduce a simple hyper-v test Vitaly Kuznetsov

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=20210121172353.4649bb18@redhat.com \
    --to=imammedo@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=vkuznets@redhat.com \
    /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).