All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Liran Alon <liran.alon@oracle.com>
Cc: ehabkost@redhat.com, qemu-devel@nongnu.org,
	Nikita Leshenko <nikita.leshchenko@oracle.com>,
	pbonzini@redhat.com, rth@twiddle.net
Subject: Re: [PATCH 05/14] hw/i386/vmport: Report VMX type in CMD_GETVERSION
Date: Tue, 10 Mar 2020 11:10:59 -0400	[thread overview]
Message-ID: <20200310104713-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <6d3c248f-f8fe-754d-59e5-8f2740a55263@oracle.com>

On Tue, Mar 10, 2020 at 04:46:19PM +0200, Liran Alon wrote:
> 
> On 10/03/2020 16:08, Michael S. Tsirkin wrote:
> > On Tue, Mar 10, 2020 at 03:35:25PM +0200, Liran Alon wrote:
> > > On 10/03/2020 14:53, Michael S. Tsirkin wrote:
> > > > On Tue, Mar 10, 2020 at 02:43:51PM +0200, Liran Alon wrote:
> > > > > On 10/03/2020 14:35, Michael S. Tsirkin wrote:
> > > > > > On Tue, Mar 10, 2020 at 02:25:28PM +0200, Liran Alon wrote:
> > > > > > > On 10/03/2020 14:14, Michael S. Tsirkin wrote:
> > > > > > > > On Tue, Mar 10, 2020 at 01:54:02AM +0200, Liran Alon wrote:
> > > > > > > > > As can be seen from VmCheck_GetVersion() in open-vm-tools code,
> > > > > > > > > CMD_GETVERSION should return VMX type in ECX register.
> > > > > > > > > 
> > > > > > > > > Default is to fake host as VMware ESX server. But user can control
> > > > > > > > > this value by "-global vmport.vmx-type=X".
> > > > > > > > > 
> > > > > > > > > Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
> > > > > > > > > Signed-off-by: Liran Alon <liran.alon@oracle.com>
> > > > > > > > > ---
> > > > > > > > >      hw/i386/vmport.c | 13 +++++++++++++
> > > > > > > > >      1 file changed, 13 insertions(+)
> > > > > > > > > 
> > > > > > > > > diff --git a/hw/i386/vmport.c b/hw/i386/vmport.c
> > > > > > > > > index a2c8ff4b59cf..c03f57f2f636 100644
> > > > > > > > > --- a/hw/i386/vmport.c
> > > > > > > > > +++ b/hw/i386/vmport.c
> > > > > > > > > @@ -36,6 +36,15 @@
> > > > > > > > >      #define VMPORT_ENTRIES 0x2c
> > > > > > > > >      #define VMPORT_MAGIC   0x564D5868
> > > > > > > > > +typedef enum {
> > > > > > > > > +   VMX_TYPE_UNSET = 0,
> > > > > > > > > +   VMX_TYPE_EXPRESS,    /* Deprecated type used for VMware Express */
> > > > > > > > > +   VMX_TYPE_SCALABLE_SERVER,    /* VMware ESX server */
> > > > > > > > > +   VMX_TYPE_WGS,        /* Deprecated type used for VMware Server */
> > > > > > > > > +   VMX_TYPE_WORKSTATION,
> > > > > > > > > +   VMX_TYPE_WORKSTATION_ENTERPRISE /* Deprecated type used for ACE 1.x */
> > > > > > > > > +} VMX_Type;
> > > > > > > > > +
> > > > > > > > Is this really VMX type? And do users care what it is?
> > > > > > > This enum is copied from open-vm-tools source code
> > > > > > > (lib/include/vm_version.h). This is how it's called in VMware Tools
> > > > > > > terminology... Don't blame me :)
> > > > > > I don't even want to go look at it to check license compatibility, but
> > > > > > IMHO that's just another reason to avoid copying it.
> > > > > > Copying bad code isn't a good idea unless needed for
> > > > > > compatibility.
> > > > > Preserving original VMware terminology makes sense and is preferred in my
> > > > > opinion. I think diverging from it is more confusing.
> > > > Yea tell it to people who got in hot water because they copied
> > > > some variable names to avoid confusion. Oh wait.
> > > > 
> > > > This is not an official terminology I think.
> > > Maybe it wasn't clear from my previous messages, but open-vm-tools is an
> > > official VMware open-source project...
> > > VMX is the official name of the VMware Userspace-VMM and VMX-Type is an
> > > official name as-well.
> > > 
> > > I'm also not copying code here... I'm copying definitions from relevant
> > > header files to implement a compatible interface.
> > You don't need to have enum have same names to be compatible.
> > And in this case, all we really need is just a single number *2*
> > and a comment saying that's ESX server.
> I don't have to. I want to. It makes code much more clearer to reader. I
> don't see any harm in that.

It's just a bad interface for QEMU to use. Maybe it's good for vmware,
I would not know.

> > 
> > > This is no different than copying constants from a Linux device driver to
> > > implement it's device emulation in QEMU.
> > We really try to avoid stuff like this. If one does this one has to
> > check license etc etc.
> There is no license issue here. It's only definitions. And if you really
> wonder about it, this is the license written in the header files of
> open-vm-tools:
> /*********************************************************
>  * Copyright (C) 2006 VMware, Inc. All rights reserved.
>  *
>  * This program is free software; you can redistribute it and/or modify it
>  * under the terms of the GNU Lesser General Public License as published
>  * by the Free Software Foundation version 2.1 and no later version.

OK that is already a conflict with the license of vmport.c
which is copyleft. Respecting wishes of the original
author is not a legal requirement, but sure is a nice thing to do.

I suggest we keep clear of this.

Refer to it if you like but don't copy.

And "no later version" will conflict with a bunch of other
files which are 2 or later.
We can't avoid GPL v2 but we really shouldn't just add it
without any good reason.

>  * This program is distributed in the hope that it will be useful, but
>  * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY
>  * or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser GNU General Public
>  * License for more details.
>  *
>  * You should have received a copy of the GNU Lesser General Public License
>  * along with this program; if not, write to the Free Software Foundation,
> Inc.,
>  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
>  *
>  *********************************************************/
> > But in this case, the names are confusing,
> > violate our coding style, I could go on.
> The only thing that violates the coding style is "VMX_Type" enum type name
> instead of "VMXType".

All enum names too. Supposed to be CamelCase. Again VMX is 


> And that is right and I will change it in v2. However,
> the rest doesn't violate coding style.
> In addition, I disagree this is confusing. These are official VMX product
> names defined by VMware.

They might make sense in the context of the specific project.
They aren't official names - just internal strings within a file.


> I don't see any value in renaming them. It just
> results in additional confusion.
> > 
> > 
> > > > So please just make it make sense by itself, and make it
> > > > easy to research.
> > > I think I have made it the most easiest to research. Having exactly same
> > > names as VMware official project and pointing to it directly from comments
> > > and commit messages.
> > What good does this do when that code will change tomorrow?
> Why would the enum constants change tomorrow?
> And even if that will happen, it still allows a reader to just search in
> Google the name of the constant and find results.
> Which is better than just making up names that we think our more intuitive
> than the names VMware decided for their own product.
> > 
> > You worry about code being easy to write, I worry about it
> > being easy to read.
> 
> No I don't. This doesn't matter at all for writing code but matters only to
> reading it.
> 
> > 
> > Here are things we can do to make things easier for users and readers:
> > - use full name VM executable instead of VMX
> Why? Searching for "VMware VM executable" in Google provides completely
> unrelated results.
> In contrast, searching for "VMware VMX" provides concrete related results.
> We shouldn't rename terminology given by VMware itself to it's own product.
> It just adds confusion in my opinion.
> > - put in official product names in comments instead of enums
> I don't see how it provides extra value. Especially due to the fact that the
> enum constants have their more common product name next to them in comment.
> I provide both reference that can be searched in other VMware projects and
> web and the more user-friendly well-known name.
> > - write code using our coding style
> Will do. The only coding style violation I see here is the enum type name.
> Will change from "VMX_Type" to "VMXType".
> The rest seems not violating coding convention. Please tell me if I missed
> something.
> > - add a link to where you found a specific number in comments
> Good idea. Will add a link to open-vm-tools git repo in vmport.c comment in
> general.
> > 
> > 
> > 
> > 
> > 
> > 
> > > > > > > > Also, how about friendlier string values so people don't need to
> > > > > > > > figure out code numbers?
> > > > > > > I could have defined a new PropertyInfo struct in hw/core/qdev-properties.c
> > > > > > > for this enum and then define a proper macro in qdev-properties.h.
> > > > > > > But it seems like an overkill for a value that is suppose to rarely be
> > > > > > > changed. So I thought this should suffice for now for user-experience
> > > > > > > perspective.
> > > > > > > If you think otherwise, I can do what I just suggested above.
> > > > > > > 
> > > > > > > -Liran
> > > > > > I think that's better, and this allows you to use official
> > > > > > product names that people can relate to.
> > > > > Ok. Will do...
> > > > > > Alternatively just drop this enum completely.  As far as you are
> > > > > > concerned it's just a number VM executable gives together with the
> > > > > > version, right?  We don't even need the enum, just set it to 2 and add a
> > > > > > code comment saying it's esx server.
> > > > > I could do the latter alternative but why? It just hides information
> > > > > original patch author (myself) know about where this value comes from.
> > > > > I don't see a reason to hide information from future code maintainers.
> > > > > Similar to defining all flags of a given flag-field even if we use only a
> > > > > subset of it.
> > > > > 
> > > > > -Liran
> > > > That belongs in a code comment. Removes need to follow silly names from
> > > > unrelated and possibly incompatible license.
> > > What do you mean "unrelated"? It's an official VMware open-source project
> > > for VMware Tools...
> > > I'm only copying definition of constants...
> > No you also copy names and comments. Which might make sense in the
> > context of the original project but seem to make no sense here.
> > E.g. for vmware a given product is deprecated but why does QEMU care?
> What is the harm in specifying that? It gives more context.
> > enum values are not even listed. What is poor user supposed to do -
> > take out a calculator to figure it out?
> What do you mean by listed?

So imagine: as a user, I want to set this to some reasonable value.

Supposedly this is why you have the enum there in the
1st place right? Let's see how does all this help me:

- first enum is VMX_TYPE_UNSET. Unset? I guess that's
the default. I want to set it, make sure it's a good value.
- next one is VMX_TYPE_EXPRESS. comment says deprecated though.
  I will keep clear.
- Next enum is VMX_TYPE_SCALABLE_SERVER. Hmm that says ESX.
I guess it's good! However what's scalable server?
There's no vmware in sight,
brings up unrelated search results.
Scalable server? No I need to research that.
I guess I will just ignore all this and go by the comments.
Okay! Wait so what is the value I need to supply to the
property?
Oh right I need to recall that enum values are sequential.
So first one it says is 0. Let me count. It's 2 I guess.

Okay I will try ...




> > 
> > > > By comparison dead code is
> > > > dead code.
> > > Right. That's why I think the enum PropertyInfo mechanism is an overkill at
> > > this point.
> > > > But sure, if you want to code up user friendly names, that's
> > > > ok too. But do follow official names then please, not something lifted
> > > > from some piece of code.
> > > These are all official names.
> > Official as in will stick around, not official as in pushed to
> > a github repo.
> > 
> > 
> > > I'm not sure I understand what you are
> > > suggesting.
> > > 
> > > -Liran
> > Something like the below.
> > 
> > /*
> >   * Most guests are fine with the default.
> >   * Some legacy guests hard-code a given type.
> >   * See https://urldefense.com/v3/__https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/lib/include/vm_vmx_type.h__;!!GqivPVa7Brio!M9wko4CSBSs3xFA2QY7MIL_jvAxlU5aRZE1jN2hzG5jnk8rdlpYCDs2ymrkJ8GE$
> >   * for an up-to-date list of values.
> >   *
> >   * Reasonable options:
> >   * 0 - unset?
> >   * 1 - VMware Express (deprecated)
> >   * 2 - VMware ESX server
> >   * 3 - VMware Workstation
> >   * 4 - ACE 1.x (deprecated)
> >   */
> > 
> > DEFINE_PROP_UINT8("vm-executable-type", VMPortState, vm_executable_type, 2 /* VMware ESX server */),
> > 
> Why is it better to specify a list of all options in a comment than an enum?

Because that lets you use english. Look you didn't even list options.
User's supposed to do the math in his/her head. Why is that?
Oh because we lifted this wholesale from some other header.

> Isn't enum invented exactly for enumerating all possible values of a field?

No - it just assigns names to constants. If you then proceed not to use
the names, then it's pointless.

> Note that even in this simple case, you needed to write "VMware ESX server"
> twice instead of referring to an enum constant. It doesn't seem more elegant
> to me.

I felt this bears repetition.
But sure, you can drop it in DEFINE_PROP_UINT8 if you like.
If you really feel you must, do:

#define VM_PORT_DEFAULT_VM_EXECUTABLE 2
near the comment.


> And again, I disagree with renaming the field to "vm-executable-type"
> instead of "vmx-type".
> 
> -Liran

Acronims is a bad idea in user interfaces if avoidable, or unless
universal. Either these interfaces are needed or they aren't.
I question their usefulness, but if they are useful they should
have names that do not require guesswork to understand.

-- 
MST



  reply	other threads:[~2020-03-10 15:15 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-09 23:53 [PATCH 00/14]: hw/i386/vmport: Bug fixes and improvements Liran Alon
2020-03-09 23:53 ` [PATCH 01/14] hw/i386/vmport: Propagate IOPort read to vCPU EAX register Liran Alon
2020-03-09 23:53 ` [PATCH 02/14] hw/i386/vmport: Set EAX to -1 on failed and unsupported commands Liran Alon
2020-03-09 23:54 ` [PATCH 03/14] hw/i386/vmport: Add device properties Liran Alon
2020-03-09 23:54 ` [PATCH 04/14] hw/i386/vmport: Introduce vmx-version property Liran Alon
2020-03-10  9:32   ` Michael S. Tsirkin
2020-03-10 11:05     ` Liran Alon
2020-03-10 11:18       ` Michael S. Tsirkin
2020-03-10 11:28         ` Liran Alon
2020-03-10 11:44           ` Michael S. Tsirkin
2020-03-10 11:53             ` Liran Alon
2020-03-09 23:54 ` [PATCH 05/14] hw/i386/vmport: Report VMX type in CMD_GETVERSION Liran Alon
2020-03-10  9:20   ` Michael S. Tsirkin
2020-03-10 11:18     ` Liran Alon
2020-03-10 11:23       ` Michael S. Tsirkin
2020-03-10 11:40         ` Liran Alon
2020-03-10 11:47           ` Michael S. Tsirkin
2020-03-10 12:14   ` Michael S. Tsirkin
2020-03-10 12:25     ` Liran Alon
2020-03-10 12:35       ` Michael S. Tsirkin
2020-03-10 12:43         ` Liran Alon
2020-03-10 12:53           ` Michael S. Tsirkin
2020-03-10 13:35             ` Liran Alon
2020-03-10 14:08               ` Michael S. Tsirkin
2020-03-10 14:46                 ` Liran Alon
2020-03-10 15:10                   ` Michael S. Tsirkin [this message]
2020-03-10 16:39                     ` Liran Alon
2020-03-10 17:36                       ` Michael S. Tsirkin
2020-03-10 17:58                         ` Liran Alon
2020-03-10 21:16                   ` Michael S. Tsirkin
2020-03-10 21:34                     ` Liran Alon
2020-03-10 21:49                       ` Michael S. Tsirkin
2020-03-10 21:59                         ` Liran Alon
2020-03-10 22:04                           ` Michael S. Tsirkin
2020-03-09 23:54 ` [PATCH 06/14] hw/i386/vmport: Define enum for all commands Liran Alon
2020-03-10  9:28   ` Michael S. Tsirkin
2020-03-10 11:16     ` Liran Alon
2020-03-10 11:23       ` Michael S. Tsirkin
2020-03-10 11:37         ` Liran Alon
2020-03-10 11:46           ` Michael S. Tsirkin
2020-03-10 11:54             ` Liran Alon
2020-03-09 23:54 ` [PATCH 07/14] hw/i386/vmport: Add support for CMD_GETBIOSUUID Liran Alon
2020-03-10  9:22   ` Michael S. Tsirkin
2020-03-10 11:44     ` Liran Alon
2020-03-10 12:01       ` Michael S. Tsirkin
2020-03-10 12:37         ` Liran Alon
2020-03-10 13:01           ` Michael S. Tsirkin
2020-03-10  9:34   ` Michael S. Tsirkin
2020-03-10 11:13     ` Liran Alon
2020-03-10 11:22       ` Michael S. Tsirkin
2020-03-10 11:35         ` Liran Alon
2020-03-10 14:24         ` Liran Alon
2020-03-10 14:39           ` Michael S. Tsirkin
2020-03-10 14:56             ` Liran Alon
2020-03-09 23:54 ` [PATCH 08/14] hw/i386/vmport: Add support for CMD_GETTIME Liran Alon
2020-03-09 23:54 ` [PATCH 09/14] hw/i386/vmport: Add support for CMD_GETTIMEFULL Liran Alon
2020-03-09 23:54 ` [PATCH 10/14] hw/i386/vmport: Add support for CMD_GET_VCPU_INFO Liran Alon
2020-03-09 23:54 ` [PATCH 11/14] hw/i386/vmport: Allow x2apic without IR Liran Alon
2020-03-09 23:54 ` [PATCH 12/14] i386/cpu: Store LAPIC bus frequency in CPU structure Liran Alon
2020-03-10  9:29   ` Michael S. Tsirkin
2020-03-10 10:53     ` Liran Alon
2020-03-10 12:27       ` Michael S. Tsirkin
2020-03-10 12:29         ` Liran Alon
2020-03-09 23:54 ` [PATCH 13/14] hw/i386/vmport: Add support for CMD_GETHZ Liran Alon
2020-03-09 23:54 ` [PATCH 14/14] hw/i386/vmport: Assert vmport initialized before registering commands Liran Alon
2020-03-10  9:30   ` Michael S. Tsirkin
2020-03-10 10:57     ` Liran Alon
2020-03-10  0:13 ` [PATCH 00/14]: hw/i386/vmport: Bug fixes and improvements no-reply
2020-03-10  0:16   ` Liran Alon
2020-03-10  0:53 ` no-reply
2020-03-10  0:54 ` no-reply
2020-03-10  0:57   ` Liran Alon
2020-03-10  1:10 ` no-reply
2020-03-10  1:49 ` no-reply
2020-03-10  1:50 ` no-reply
2020-03-10  2:04 ` no-reply
2020-03-10  2:22 ` no-reply
2020-03-10  2:56 ` no-reply
2020-03-10  2:56 ` no-reply

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=20200310104713-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=liran.alon@oracle.com \
    --cc=nikita.leshchenko@oracle.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /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.