Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-27 Thread Eduardo Habkost
On Mon, May 27, 2019 at 06:29:44PM +0200, Andrea Bolognani wrote:
> On Fri, 2019-05-24 at 15:24 -0300, Eduardo Habkost wrote:
> > On Thu, May 23, 2019 at 10:35:24AM +0200, Andrea Bolognani wrote:
> > > [...] the above looks good to
> > > me as a general direction, but note that you'll have to implement at
> > > the very least the query-cpu-model-expansion QMP command for the
> > > introspection to work.
> > 
> > Why is query-cpu-model-expansion needed?  Isn't
> > device-list-properties enough?
> 
> Good question.
> 
> I'll have to check with Jirka, but from playing with both commands
> it looks like the latter returns a superset of what the former does,
> so for the purpose of figuring out which vector lengths the QEMU
> binary recognizes it should be good enough; I suspect, however, that
> query-cpu-model-expansion might be (made to be) smarter and for
> example not report vector lengths that the underlying hardware
> doesn't support, which would be valuable for the purpose of user
> friendly error reporting and allowing applications to decide which
> vector lengths to request when creating guests.

Yes, query-cpu-model-expansion returns additional information, so
it depends on what exactly you are looking for.

If you want to know which properties a given QEMU binary supports
in the command-line, `device-list-properties` is supposed to be
enough.  If you need to know which properties can be really
enabled in a given host (based on QEMU+KVM+hardware
capabilities), you'll need `query-cpu-model-expansion model=max`.

-- 
Eduardo



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-27 Thread Andrea Bolognani
On Fri, 2019-05-24 at 15:24 -0300, Eduardo Habkost wrote:
> On Thu, May 23, 2019 at 10:35:24AM +0200, Andrea Bolognani wrote:
> > [...] the above looks good to
> > me as a general direction, but note that you'll have to implement at
> > the very least the query-cpu-model-expansion QMP command for the
> > introspection to work.
> 
> Why is query-cpu-model-expansion needed?  Isn't
> device-list-properties enough?

Good question.

I'll have to check with Jirka, but from playing with both commands
it looks like the latter returns a superset of what the former does,
so for the purpose of figuring out which vector lengths the QEMU
binary recognizes it should be good enough; I suspect, however, that
query-cpu-model-expansion might be (made to be) smarter and for
example not report vector lengths that the underlying hardware
doesn't support, which would be valuable for the purpose of user
friendly error reporting and allowing applications to decide which
vector lengths to request when creating guests.

I'll try to come back with more than theories soon :)

-- 
Andrea Bolognani / Red Hat / Virtualization




Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-24 Thread Eduardo Habkost
On Thu, May 23, 2019 at 10:35:24AM +0200, Andrea Bolognani wrote:
> On Wed, 2019-05-15 at 13:54 +0200, Andrew Jones wrote:
> > On Wed, May 15, 2019 at 12:52:29PM +0200, Igor Mammedov wrote:
> > > since using magic numbers is not very descriptive
> > > (but if there is some spec where they come from that we could point users 
> > > to
> > > it might be acceptable too, but I'd reserve number approach for values 
> > > only).
> > 
> > The numbers aren't magic, they're part of the name. '1' in the above
> > 'sve1' means one quadword. It would probably have been better to use bits
> > instead in the example, i.e.
> > 
> >   -cpu host,sve128=on,sve256=on,sve384=off,sve512=on
> > 
> > where it's now clear that "sve512" has an analogy with x86's "avx512".
> > 
> [...]
> > 
> > So I set off to convince Igor of the wide word idea (he sits next to me,
> > so I didn't have go far), but he has convinced me of the above property
> > idea. He used the magic phrase: "less code would be needed". If we use
> > the properties like above then we get introspection for free (cpu property
> > listing which libvirt already knows how to do) - so no QMP query needed.
> > The cost is adding several properties (16 to handle the current 2048-bit
> > limit), but I guess that's cheap enough. The command line is verbose, but
> > also much easier for a human to construct and read. I'm pretty sold on
> > this path, but adding Andrea and Eduardo for their input as well.
> 
> Sorry for taking a while to respond. Anyway, the above looks good to
> me as a general direction, but note that you'll have to implement at
> the very least the query-cpu-model-expansion QMP command for the
> introspection to work.

Why is query-cpu-model-expansion needed?  Isn't
device-list-properties enough?

> 
> query-cpu-model-baseline and query-cpu-model-comparison are two more
> QMP command which, while perhaps not immediately applicabile, we will
> want to implement at some point; more in general, what s390x is doing
> with respect to CPU models is a good blueprint, according to the
> libvirt developer who's the most involved with that specific area of
> the project.

Agreed.  Even if not necessary right now, query-cpu-model-* will
probably be needed eventually.

-- 
Eduardo



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-23 Thread Andrea Bolognani
On Wed, 2019-05-15 at 13:54 +0200, Andrew Jones wrote:
> On Wed, May 15, 2019 at 12:52:29PM +0200, Igor Mammedov wrote:
> > since using magic numbers is not very descriptive
> > (but if there is some spec where they come from that we could point users to
> > it might be acceptable too, but I'd reserve number approach for values 
> > only).
> 
> The numbers aren't magic, they're part of the name. '1' in the above
> 'sve1' means one quadword. It would probably have been better to use bits
> instead in the example, i.e.
> 
>   -cpu host,sve128=on,sve256=on,sve384=off,sve512=on
> 
> where it's now clear that "sve512" has an analogy with x86's "avx512".
> 
[...]
> 
> So I set off to convince Igor of the wide word idea (he sits next to me,
> so I didn't have go far), but he has convinced me of the above property
> idea. He used the magic phrase: "less code would be needed". If we use
> the properties like above then we get introspection for free (cpu property
> listing which libvirt already knows how to do) - so no QMP query needed.
> The cost is adding several properties (16 to handle the current 2048-bit
> limit), but I guess that's cheap enough. The command line is verbose, but
> also much easier for a human to construct and read. I'm pretty sold on
> this path, but adding Andrea and Eduardo for their input as well.

Sorry for taking a while to respond. Anyway, the above looks good to
me as a general direction, but note that you'll have to implement at
the very least the query-cpu-model-expansion QMP command for the
introspection to work.

query-cpu-model-baseline and query-cpu-model-comparison are two more
QMP command which, while perhaps not immediately applicabile, we will
want to implement at some point; more in general, what s390x is doing
with respect to CPU models is a good blueprint, according to the
libvirt developer who's the most involved with that specific area of
the project.

-- 
Andrea Bolognani / Red Hat / Virtualization




Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dave Martin
On Wed, May 15, 2019 at 12:09:04PM +0100, Dr. David Alan Gilbert wrote:
> * Dave Martin (dave.mar...@arm.com) wrote:
> > On Wed, May 15, 2019 at 09:18:54AM +0100, Andrew Jones wrote:
> > > On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > > > On Tue, 14 May 2019 11:02:25 +0200
> > > > Andrew Jones  wrote:
> > > > > My thought is primarily machines. If a human wants to use the command
> > > > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > > > figuring out a map they like once and then sticking to it.
> > > > 
> > > > maybe naive question, but why not use a property/bit as user facing 
> > > > interface,
> > > > in line with what we do with CPUID bits. (that's assuming that bits have
> > > > fixed meaning).
> > > > Yes, it's verbose but follows current practice and works fine with -cpu 
> > > > and
> > > > -device.
> > > > (I really hate custom preprocessing of -cpu and we were working hard to 
> > > > remove
> > > > that in favor of canonical properties at the expense of more verbose 
> > > > CLI).
> > > >
> > > 
> > > Are you asking if we should do something like the following?
> > > 
> > >   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> > 
> > Note, there is nothing SVE-specific about this.
> > 
> > Either enabling features on a per-vcpu basis is justified, or it isn't:
> > if it's justified, then it would be better to have a general way of
> > specifying per-vcpu properties, rather than it being reinvented per
> > feature.
> 
> SVE *is* a bit unusual.  In most CPU features they're actually features,
> they're on or off, so we have a big list of features that are
> enabled/disabled.  We've had that type of thing (at least on x86) for
> years and it's OK.
> We've got one or two things where they're numerical
> (e.g. host-physbits) and we struggle a bit with how to handle them.
> 
> SVE is somewhere in between - it's a list of numbers, apparently a
> fairly large arbitrarily set of numbers that could be chosen so you'd
> need lots of feature flags (sve1...sve64 say or more); so that doesn't
> fit the existing things we've had that have worked.

I see what you mean now.  SVE configuration is indeed more than just a
boolean flag.

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dave Martin
On Wed, May 15, 2019 at 12:42:44PM +0100, Andrew Jones wrote:
> On Wed, May 15, 2019 at 12:00:45PM +0100, Dave Martin wrote:
> > On Wed, May 15, 2019 at 09:18:54AM +0100, Andrew Jones wrote:
> > > On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > > > On Tue, 14 May 2019 11:02:25 +0200
> > > > Andrew Jones  wrote:
> > > > > My thought is primarily machines. If a human wants to use the command
> > > > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > > > figuring out a map they like once and then sticking to it.
> > > > 
> > > > maybe naive question, but why not use a property/bit as user facing 
> > > > interface,
> > > > in line with what we do with CPUID bits. (that's assuming that bits have
> > > > fixed meaning).
> > > > Yes, it's verbose but follows current practice and works fine with -cpu 
> > > > and
> > > > -device.
> > > > (I really hate custom preprocessing of -cpu and we were working hard to 
> > > > remove
> > > > that in favor of canonical properties at the expense of more verbose 
> > > > CLI).
> > > >
> > > 
> > > Are you asking if we should do something like the following?
> > > 
> > >   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> > 
> > Note, there is nothing SVE-specific about this.
> 
> In the above example there is some specific SVE stuff there. If the
> command line has sve4=on, then it must also have sve1=on and sve2=on,
> per the architecture requiring all smaller power-of-2 vector lengths.
> Only sve3 is optional, but because it's optional we have to explicitly
> state when it's on or off in order to ensure we can cleanly fail a
> migration to a host that doesn't support that option.
> 
> > 
> > Either enabling features on a per-vcpu basis is justified, or it isn't:
> > if it's justified, then it would be better to have a general way of
> > specifying per-vcpu properties, rather than it being reinvented per
> > feature.
> > 
> > Creating mismatched configurations is allowed by the architecture and so
> > it's useful for testing the kernel, but probably less useful for real-
> > world use cases today.
> > 
> > So it may be a good idea to get the symmetric support sorted out first
> > before thinking about whether and how to specify asymmetric
> > configurations.
> 
> These properties are per-vcpu for KVM only. QEMU doesn't have a way
> to allow per-vcpu features to be described on the command line yet.
> With '-cpu host,...' The '...' applies to all vcpus. So we are "just"
> working on the symmetric support now.

OK, I think I misunderstood what was being proposed here.

Until/unless someone comes up with a compelling use case, I think it's
entirely reasonable for QEMU not to support asymmetry of this sort.

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Andrew Jones
On Wed, May 15, 2019 at 12:52:29PM +0200, Igor Mammedov wrote:
> On Wed, 15 May 2019 10:18:54 +0200
> Andrew Jones  wrote:
> 
> > On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > > On Tue, 14 May 2019 11:02:25 +0200
> > > Andrew Jones  wrote:  
> > > > My thought is primarily machines. If a human wants to use the command
> > > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > > figuring out a map they like once and then sticking to it.  
> > > 
> > > maybe naive question, but why not use a property/bit as user facing 
> > > interface,
> > > in line with what we do with CPUID bits. (that's assuming that bits have
> > > fixed meaning).
> > > Yes, it's verbose but follows current practice and works fine with -cpu 
> > > and
> > > -device.
> > > (I really hate custom preprocessing of -cpu and we were working hard to 
> > > remove
> > > that in favor of canonical properties at the expense of more verbose CLI).
> > >  
> > 
> > Are you asking if we should do something like the following?
> > 
> >   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> > 
> > (Where the numbers represent the number of vector quadwords supported.)
> 
> something like this, but why not replace 1,2,... with more meaning full
>  sve-encrypt/sve-something-else/...
> since using magic numbers is not very descriptive
> (but if there is some spec where they come from that we could point users to
> it might be acceptable too, but I'd reserve number approach for values only).

The numbers aren't magic, they're part of the name. '1' in the above
'sve1' means one quadword. It would probably have been better to use bits
instead in the example, i.e.

  -cpu host,sve128=on,sve256=on,sve384=off,sve512=on

where it's now clear that "sve512" has an analogy with x86's "avx512".

> 
> > Naturally that would work, but it would be super verbose and require
> > adding tons of properties.
> yep, it's not very (human) user friendly but that's what mgmt applications
> are for and well users always can prepare a script for long CLI and use
> whatever abstractions they could think of.
> 

So I set off to convince Igor of the wide word idea (he sits next to me,
so I didn't have go far), but he has convinced me of the above property
idea. He used the magic phrase: "less code would be needed". If we use
the properties like above then we get introspection for free (cpu property
listing which libvirt already knows how to do) - so no QMP query needed.
The cost is adding several properties (16 to handle the current 2048-bit
limit), but I guess that's cheap enough. The command line is verbose, but
also much easier for a human to construct and read. I'm pretty sold on
this path, but adding Andrea and Eduardo for their input as well.

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Andrew Jones
On Wed, May 15, 2019 at 12:00:45PM +0100, Dave Martin wrote:
> On Wed, May 15, 2019 at 09:18:54AM +0100, Andrew Jones wrote:
> > On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > > On Tue, 14 May 2019 11:02:25 +0200
> > > Andrew Jones  wrote:
> > > > My thought is primarily machines. If a human wants to use the command
> > > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > > figuring out a map they like once and then sticking to it.
> > > 
> > > maybe naive question, but why not use a property/bit as user facing 
> > > interface,
> > > in line with what we do with CPUID bits. (that's assuming that bits have
> > > fixed meaning).
> > > Yes, it's verbose but follows current practice and works fine with -cpu 
> > > and
> > > -device.
> > > (I really hate custom preprocessing of -cpu and we were working hard to 
> > > remove
> > > that in favor of canonical properties at the expense of more verbose CLI).
> > >
> > 
> > Are you asking if we should do something like the following?
> > 
> >   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> 
> Note, there is nothing SVE-specific about this.

In the above example there is some specific SVE stuff there. If the
command line has sve4=on, then it must also have sve1=on and sve2=on,
per the architecture requiring all smaller power-of-2 vector lengths.
Only sve3 is optional, but because it's optional we have to explicitly
state when it's on or off in order to ensure we can cleanly fail a
migration to a host that doesn't support that option.

> 
> Either enabling features on a per-vcpu basis is justified, or it isn't:
> if it's justified, then it would be better to have a general way of
> specifying per-vcpu properties, rather than it being reinvented per
> feature.
> 
> Creating mismatched configurations is allowed by the architecture and so
> it's useful for testing the kernel, but probably less useful for real-
> world use cases today.
> 
> So it may be a good idea to get the symmetric support sorted out first
> before thinking about whether and how to specify asymmetric
> configurations.

These properties are per-vcpu for KVM only. QEMU doesn't have a way
to allow per-vcpu features to be described on the command line yet.
With '-cpu host,...' The '...' applies to all vcpus. So we are "just"
working on the symmetric support now.

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dr. David Alan Gilbert
* Dave Martin (dave.mar...@arm.com) wrote:
> On Wed, May 15, 2019 at 09:18:54AM +0100, Andrew Jones wrote:
> > On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > > On Tue, 14 May 2019 11:02:25 +0200
> > > Andrew Jones  wrote:
> > > > My thought is primarily machines. If a human wants to use the command
> > > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > > figuring out a map they like once and then sticking to it.
> > > 
> > > maybe naive question, but why not use a property/bit as user facing 
> > > interface,
> > > in line with what we do with CPUID bits. (that's assuming that bits have
> > > fixed meaning).
> > > Yes, it's verbose but follows current practice and works fine with -cpu 
> > > and
> > > -device.
> > > (I really hate custom preprocessing of -cpu and we were working hard to 
> > > remove
> > > that in favor of canonical properties at the expense of more verbose CLI).
> > >
> > 
> > Are you asking if we should do something like the following?
> > 
> >   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> 
> Note, there is nothing SVE-specific about this.
> 
> Either enabling features on a per-vcpu basis is justified, or it isn't:
> if it's justified, then it would be better to have a general way of
> specifying per-vcpu properties, rather than it being reinvented per
> feature.

SVE *is* a bit unusual.  In most CPU features they're actually features,
they're on or off, so we have a big list of features that are
enabled/disabled.  We've had that type of thing (at least on x86) for
years and it's OK.
We've got one or two things where they're numerical
(e.g. host-physbits) and we struggle a bit with how to handle them.

SVE is somewhere in between - it's a list of numbers, apparently a
fairly large arbitrarily set of numbers that could be chosen so you'd
need lots of feature flags (sve1...sve64 say or more); so that doesn't
fit the existing things we've had that have worked.

Dave

> Creating mismatched configurations is allowed by the architecture and so
> it's useful for testing the kernel, but probably less useful for real-
> world use cases today.
> 
> So it may be a good idea to get the symmetric support sorted out first
> before thinking about whether and how to specify asymmetric
> configurations.
> 
> Cheers
> ---Dave
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dave Martin
On Wed, May 15, 2019 at 09:18:54AM +0100, Andrew Jones wrote:
> On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > On Tue, 14 May 2019 11:02:25 +0200
> > Andrew Jones  wrote:
> > > My thought is primarily machines. If a human wants to use the command
> > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > figuring out a map they like once and then sticking to it.
> > 
> > maybe naive question, but why not use a property/bit as user facing 
> > interface,
> > in line with what we do with CPUID bits. (that's assuming that bits have
> > fixed meaning).
> > Yes, it's verbose but follows current practice and works fine with -cpu and
> > -device.
> > (I really hate custom preprocessing of -cpu and we were working hard to 
> > remove
> > that in favor of canonical properties at the expense of more verbose CLI).
> >
> 
> Are you asking if we should do something like the following?
> 
>   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on

Note, there is nothing SVE-specific about this.

Either enabling features on a per-vcpu basis is justified, or it isn't:
if it's justified, then it would be better to have a general way of
specifying per-vcpu properties, rather than it being reinvented per
feature.

Creating mismatched configurations is allowed by the architecture and so
it's useful for testing the kernel, but probably less useful for real-
world use cases today.

So it may be a good idea to get the symmetric support sorted out first
before thinking about whether and how to specify asymmetric
configurations.

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dr. David Alan Gilbert
* Dave Martin (dave.mar...@arm.com) wrote:
> On Wed, May 15, 2019 at 09:15:20AM +0100, Andrew Jones wrote:
> > On Tue, May 14, 2019 at 03:32:13PM +0200, Markus Armbruster wrote:
> > > Syntax that can support such growth would be nice.
> > > 
> > > To grow a single unsigned number, we can make it wider (but we don't
> > > have infrastructure for numbers wider than 64 bits), or we can add more
> > > numbers (but under what name?).
> > > 
> > > Dotted keys syntax could grow more easily, but it's rather awkward.
> > > 
> > > Looking more closely at your "[PATCH 11/13] target/arm/cpu64: max cpu:
> > > Introduce sve-vls-map"... your syntax reflects your data structure:
> > > property "sve-vls-map" is of type uint64_t, and interpreted as bit set.
> > > This data type would have to grow, too.
> > > 
> > > We could make widen the integer property (but we don't have
> > > infrastructure for integer properties wider than 64 bits), or we can
> > > turn it into an array of integers (compatibility?), or we can add more
> > > properties to hold the additional integers (yet another silly way to
> > > represent a list/array of integers).
> > > 
> > > I'm not asking you to complicate things just to future-proof this.  Just
> > > pause and think whether you can pick a data type that's similarly
> > > convenient now, and easier to grow.
> > > 
> > > Then pick an external syntax for this data type.  You may have to pick a
> > > reasonable compromise between ease of implementation and ease of use.
> > 
> > Widening the integer property sounds good to me. I just hadn't thought of
> > it (implementation tunnel vision affecting my user interface design).
> > Andrea also mentioned that as a possibility in a reply to the series. I
> > think we can leave the property as a uint64_t right now and then, when/if
> > it needs to expand past 64 bits we can change the property to a string
> > and start parsing arbitrarily large integers from it. The internal state,
> > 'uint64_t sve_vls_map' can easily be changed to a 'uint64_t sve_vls_map[]'
> > at that point too. How's that sound?
> 
> Having an arbitrary-width integer should work.
> 
> It will suck a bit for the common case of sparse vector length support
> 
>   0x800080008000808b
> 
> (= [ 1, 2, 4, 8, 16, 32, 64, 128 ] quadwords)

You could allow _'s as a readability feature just to allow you to see
boundaries.

0x8000____8000__8000_808b

(Some might suggest IPv6 address syntax but I could never read that).

Dave

--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Igor Mammedov
On Wed, 15 May 2019 10:18:54 +0200
Andrew Jones  wrote:

> On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> > On Tue, 14 May 2019 11:02:25 +0200
> > Andrew Jones  wrote:  
> > > My thought is primarily machines. If a human wants to use the command
> > > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > > figuring out a map they like once and then sticking to it.  
> > 
> > maybe naive question, but why not use a property/bit as user facing 
> > interface,
> > in line with what we do with CPUID bits. (that's assuming that bits have
> > fixed meaning).
> > Yes, it's verbose but follows current practice and works fine with -cpu and
> > -device.
> > (I really hate custom preprocessing of -cpu and we were working hard to 
> > remove
> > that in favor of canonical properties at the expense of more verbose CLI).
> >  
> 
> Are you asking if we should do something like the following?
> 
>   -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on
> 
> (Where the numbers represent the number of vector quadwords supported.)

something like this, but why not replace 1,2,... with more meaning full
 sve-encrypt/sve-something-else/...
since using magic numbers is not very descriptive
(but if there is some spec where they come from that we could point users to
it might be acceptable too, but I'd reserve number approach for values only).

> Naturally that would work, but it would be super verbose and require
> adding tons of properties.
yep, it's not very (human) user friendly but that's what mgmt applications
are for and well users always can prepare a script for long CLI and use
whatever abstractions they could think of.

> Or maybe you meant something else. If so,
> please provide an example.
> 
> Thanks,
> drew




Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Dave Martin
On Wed, May 15, 2019 at 09:15:20AM +0100, Andrew Jones wrote:
> On Tue, May 14, 2019 at 03:32:13PM +0200, Markus Armbruster wrote:
> > Syntax that can support such growth would be nice.
> > 
> > To grow a single unsigned number, we can make it wider (but we don't
> > have infrastructure for numbers wider than 64 bits), or we can add more
> > numbers (but under what name?).
> > 
> > Dotted keys syntax could grow more easily, but it's rather awkward.
> > 
> > Looking more closely at your "[PATCH 11/13] target/arm/cpu64: max cpu:
> > Introduce sve-vls-map"... your syntax reflects your data structure:
> > property "sve-vls-map" is of type uint64_t, and interpreted as bit set.
> > This data type would have to grow, too.
> > 
> > We could make widen the integer property (but we don't have
> > infrastructure for integer properties wider than 64 bits), or we can
> > turn it into an array of integers (compatibility?), or we can add more
> > properties to hold the additional integers (yet another silly way to
> > represent a list/array of integers).
> > 
> > I'm not asking you to complicate things just to future-proof this.  Just
> > pause and think whether you can pick a data type that's similarly
> > convenient now, and easier to grow.
> > 
> > Then pick an external syntax for this data type.  You may have to pick a
> > reasonable compromise between ease of implementation and ease of use.
> 
> Widening the integer property sounds good to me. I just hadn't thought of
> it (implementation tunnel vision affecting my user interface design).
> Andrea also mentioned that as a possibility in a reply to the series. I
> think we can leave the property as a uint64_t right now and then, when/if
> it needs to expand past 64 bits we can change the property to a string
> and start parsing arbitrarily large integers from it. The internal state,
> 'uint64_t sve_vls_map' can easily be changed to a 'uint64_t sve_vls_map[]'
> at that point too. How's that sound?

Having an arbitrary-width integer should work.

It will suck a bit for the common case of sparse vector length support

0x800080008000808b

(= [ 1, 2, 4, 8, 16, 32, 64, 128 ] quadwords)

Since lengths above 16 quadwords remain theoretical for now though it's
probably OK as a compromise, though.

The most human-compatible approach would be some kind of list
comprehension syntax, but it's hard to justify that adding a whole new
syntax is justified at this point.

[...]

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Andrew Jones
On Tue, May 14, 2019 at 04:48:38PM +0200, Igor Mammedov wrote:
> On Tue, 14 May 2019 11:02:25 +0200
> Andrew Jones  wrote:
> > My thought is primarily machines. If a human wants to use the command
> > line and SVE, then I'm assuming they'll be happy with sve-max-vq or
> > figuring out a map they like once and then sticking to it.
> 
> maybe naive question, but why not use a property/bit as user facing interface,
> in line with what we do with CPUID bits. (that's assuming that bits have
> fixed meaning).
> Yes, it's verbose but follows current practice and works fine with -cpu and
> -device.
> (I really hate custom preprocessing of -cpu and we were working hard to remove
> that in favor of canonical properties at the expense of more verbose CLI).
>

Are you asking if we should do something like the following?

  -cpu host,sve1=on,sve=2=on,sve3=off,sve4=on

(Where the numbers represent the number of vector quadwords supported.)

Naturally that would work, but it would be super verbose and require
adding tons of properties. Or maybe you meant something else. If so,
please provide an example.

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-15 Thread Andrew Jones
On Tue, May 14, 2019 at 03:32:13PM +0200, Markus Armbruster wrote:
> Syntax that can support such growth would be nice.
> 
> To grow a single unsigned number, we can make it wider (but we don't
> have infrastructure for numbers wider than 64 bits), or we can add more
> numbers (but under what name?).
> 
> Dotted keys syntax could grow more easily, but it's rather awkward.
> 
> Looking more closely at your "[PATCH 11/13] target/arm/cpu64: max cpu:
> Introduce sve-vls-map"... your syntax reflects your data structure:
> property "sve-vls-map" is of type uint64_t, and interpreted as bit set.
> This data type would have to grow, too.
> 
> We could make widen the integer property (but we don't have
> infrastructure for integer properties wider than 64 bits), or we can
> turn it into an array of integers (compatibility?), or we can add more
> properties to hold the additional integers (yet another silly way to
> represent a list/array of integers).
> 
> I'm not asking you to complicate things just to future-proof this.  Just
> pause and think whether you can pick a data type that's similarly
> convenient now, and easier to grow.
> 
> Then pick an external syntax for this data type.  You may have to pick a
> reasonable compromise between ease of implementation and ease of use.

Widening the integer property sounds good to me. I just hadn't thought of
it (implementation tunnel vision affecting my user interface design).
Andrea also mentioned that as a possibility in a reply to the series. I
think we can leave the property as a uint64_t right now and then, when/if
it needs to expand past 64 bits we can change the property to a string
and start parsing arbitrarily large integers from it. The internal state,
'uint64_t sve_vls_map' can easily be changed to a 'uint64_t sve_vls_map[]'
at that point too. How's that sound?

> Primarily machines means we can accept more verbosity.
> 
> If I understand the cover letter of your "[PATCH 00/13] target/arm/kvm:
> enable SVE in guests" correctly, then sve-max-vq and sve-vls-map are
> alternative interfaces for the same thing.  The latter is more general,
> but awkward on the command line and verbose everywhere.  The former
> isn't usable with -cpu host.  Correct?
> 
> If there wasn't "not usable with -cpu host", I'd ask whether we really
> need the generality.
>

The 'not usable with -cpu host' was a choice, not a limitation to deal
with. The problem with sve-max-vq is that it doesn't provide enough
information by itself. Multiple vector sets with the same max-vq can be
valid. For migration of KVM guests the exact set needs to be explicitly
requested to ensure the host supports it. For TCG it may be nice to
model sets besides the everything up to max-vq set that sve-max-vq would
choose. sve-max-vq could be used with -cpu host the same way I've
implemented it for -cpu max, which is to take the fully supported vector
set from the KVM query and use that one, but I didn't want to encourage
its use with AArch64's primary KVM cpu type (even if it's -cpu host and
thus not a great choice for migration anyway).

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-14 Thread Dave Martin
On Tue, May 14, 2019 at 05:54:03AM +0100, Markus Armbruster wrote:
> Andrew Jones  writes:
> 
> > On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
> >> Daniel P. Berrangé  writes:
> >> 
> >> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> >> >> Hi all,
> >> >> 
> >> >> First some background:
> >> >> 
> >> >> For the userspace side of AArch64 guest SVE support we need to
> >> >> expose KVM's allowed vector lengths bitmap to the user and allow
> >> >> the user to choose a subset of that bitmap. Since bitmaps are a
> >> >> bit awkward to work with then we'll likely want to expose it as
> >> >> an array of vector lengths instead. Also, assuming we want to
> >> >> expose the lengths as number-of-quadwords (quadword == 128 bits
> >> >> for AArch64 and vector lengths must be multiples of quadwords)
> >> >> rather than number-of-bits, then an example array (which will
> >> >> always be a sequence) might be
> >> >> 
> >> >>  [ 8, 16, 32 ]
> >> >> 
> >> >> The user may choose a subsequence, but only through truncation,
> >> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> >> >> 
> >> >> Furthermore, different hosts may support different sequences
> >> >> which have the same maximum. For example, if the above sequence
> >> >> is for Host_A, then Host_B could be
> >> >> 
> >> >>  [ 8, 16, 24, 32 ]
> >> >> 
> >> >> The host must support all lengths in the sequence, which means
> >> >> that while Host_A supports 32, since it doesn't support 24 and
> >> >> we can only truncate sequences, we must use either [ 8 ] or
> >> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
> >> >> between the hosts.
> >> >> 
> >> >> Now to the $SUBJECT question:
> >> >> 
> >> >> My feeling is that we should require the sequence to be
> >> >> provided on the command line as a cpu property. Something
> >> >> like
> >> >> 
> >> >>   -cpu host,sve-vl-list=8:16
> >> >> 
> >> >> (I chose ':' for the delimiter because ',' can't work, but
> >> >> if there's a better choice, then that's fine by me.)
> >> >> 
> >> >> Afaict a property list like this will require a new parser,
> >> 
> >> We had 20+ of those when I last counted.  Among the more annoying
> >> reasons CLI QAPIfication is hard[1].
> >> 
> >> >> which feels a bit funny since it seems we should already
> >> >> have support for this type of thing somewhere in QEMU. So,
> >> >> the question is: do we? I see we have array properties, but
> >> >> I don't believe that works with the command line. Should we
> >> >> only use QMP for this? We already want some QMP in order to
> >> >> query the supported vector lengths. Maybe we should use QMP
> >> >> to set the selection too? But then what about command line
> >> >> support for developers? And if the property is on the command
> >> >> line then we don't have to add it to the migration stream.
> >> >
> >> > You should be able to use arrays from the CLI with QemuOpts by repeating
> >> > the same option name many times, though I can't say it is a very
> >> > nice approach if you have many values to list as it gets very repetative.
> >> 
> >> Yes, this is one of the ways the current CLI does lists.  It's also one
> >> of the more annoying reasons CLI QAPIfication is hard[2].
> >> 
> >> QemuOpts let the last param=value win the stupidest way that could
> >> possibly work (I respect that): add to the front of the list, search it
> >> front to back.
> >> 
> >> Then somebody discovered that if you search the list manually, you can
> >> see them all, and abuse that to get a list-valued param.  I'm sure that
> >> felt clever at the time.
> >> 
> >> Another way to do lists the funky list feature of string input and opts
> >> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
> >> 
> >> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
> >> looks like we even combine it with the "multiple param=value build up a
> >> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
> >> 
> >> > That's the curse of not having a good CLI syntax for non-scalar data in
> >> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
> >> >
> >> >  -cpu host,sve-vl=8,sve-vl=16
> >> 
> >> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
> >> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
> >> simple cases, then gets uglier as things get more complex, and then it
> >> falls apart: it can't quite express all of JSON.
> >> 
> >> Example: sve-vl.0=8,sve-vl.1=16
> >> gets desugared into {"sve": [8, 16]}
> >> if the QAPI schema has 'sve': ['int'].
> >> 
> >> The comment at the beginning of util/keyval.c explains it in more
> >> detail.
> >> 
> >> It powers -blockdev and -display.  Both options accept either JSON or
> >> dotted keys.  If the option argument starts with '{', it's JSON.
> >> Management applications should stick to JSON.
> >> 
> >> 
> >> [1] Towards a more expressive and introspectable QEMU command line
> >> 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-14 Thread Igor Mammedov
On Tue, 14 May 2019 11:02:25 +0200
Andrew Jones  wrote:

> On Tue, May 14, 2019 at 06:54:03AM +0200, Markus Armbruster wrote:
> > Andrew Jones  writes:
> > 
> > > On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
> > >> Daniel P. Berrangé  writes:
> > >> 
> > >> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > >> >> Hi all,
> > >> >> 
> > >> >> First some background:
> > >> >> 
> > >> >> For the userspace side of AArch64 guest SVE support we need to
> > >> >> expose KVM's allowed vector lengths bitmap to the user and allow
> > >> >> the user to choose a subset of that bitmap. Since bitmaps are a
> > >> >> bit awkward to work with then we'll likely want to expose it as
> > >> >> an array of vector lengths instead. Also, assuming we want to
> > >> >> expose the lengths as number-of-quadwords (quadword == 128 bits
> > >> >> for AArch64 and vector lengths must be multiples of quadwords)
> > >> >> rather than number-of-bits, then an example array (which will
> > >> >> always be a sequence) might be
> > >> >> 
> > >> >>  [ 8, 16, 32 ]
> > >> >> 
> > >> >> The user may choose a subsequence, but only through truncation,
> > >> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > >> >> 
> > >> >> Furthermore, different hosts may support different sequences
> > >> >> which have the same maximum. For example, if the above sequence
> > >> >> is for Host_A, then Host_B could be
> > >> >> 
> > >> >>  [ 8, 16, 24, 32 ]
> > >> >> 
> > >> >> The host must support all lengths in the sequence, which means
> > >> >> that while Host_A supports 32, since it doesn't support 24 and
> > >> >> we can only truncate sequences, we must use either [ 8 ] or
> > >> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
> > >> >> between the hosts.
> > >> >> 
> > >> >> Now to the $SUBJECT question:
> > >> >> 
> > >> >> My feeling is that we should require the sequence to be
> > >> >> provided on the command line as a cpu property. Something
> > >> >> like
> > >> >> 
> > >> >>   -cpu host,sve-vl-list=8:16
> > >> >> 
> > >> >> (I chose ':' for the delimiter because ',' can't work, but
> > >> >> if there's a better choice, then that's fine by me.)
> > >> >> 
> > >> >> Afaict a property list like this will require a new parser,
> > >> 
> > >> We had 20+ of those when I last counted.  Among the more annoying
> > >> reasons CLI QAPIfication is hard[1].
> > >> 
> > >> >> which feels a bit funny since it seems we should already
> > >> >> have support for this type of thing somewhere in QEMU. So,
> > >> >> the question is: do we? I see we have array properties, but
> > >> >> I don't believe that works with the command line. Should we
> > >> >> only use QMP for this? We already want some QMP in order to
> > >> >> query the supported vector lengths. Maybe we should use QMP
> > >> >> to set the selection too? But then what about command line
> > >> >> support for developers? And if the property is on the command
> > >> >> line then we don't have to add it to the migration stream.
> > >> >
> > >> > You should be able to use arrays from the CLI with QemuOpts by 
> > >> > repeating
> > >> > the same option name many times, though I can't say it is a very
> > >> > nice approach if you have many values to list as it gets very 
> > >> > repetative.
> > >> 
> > >> Yes, this is one of the ways the current CLI does lists.  It's also one
> > >> of the more annoying reasons CLI QAPIfication is hard[2].
> > >> 
> > >> QemuOpts let the last param=value win the stupidest way that could
> > >> possibly work (I respect that): add to the front of the list, search it
> > >> front to back.
> > >> 
> > >> Then somebody discovered that if you search the list manually, you can
> > >> see them all, and abuse that to get a list-valued param.  I'm sure that
> > >> felt clever at the time.
> > >> 
> > >> Another way to do lists the funky list feature of string input and opts
> > >> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
> > >> 
> > >> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
> > >> looks like we even combine it with the "multiple param=value build up a
> > >> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
> > >> 
> > >> > That's the curse of not having a good CLI syntax for non-scalar data in
> > >> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
> > >> >
> > >> >  -cpu host,sve-vl=8,sve-vl=16
> > >> 
> > >> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
> > >> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
> > >> simple cases, then gets uglier as things get more complex, and then it
> > >> falls apart: it can't quite express all of JSON.
> > >> 
> > >> Example: sve-vl.0=8,sve-vl.1=16
> > >> gets desugared into {"sve": [8, 16]}
> > >> if the QAPI schema has 'sve': ['int'].
> > >> 
> > >> The comment at the beginning of util/keyval.c explains it in more
> > >> detail.
> > >> 
> 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-14 Thread Markus Armbruster
Andrew Jones  writes:

> On Tue, May 14, 2019 at 06:54:03AM +0200, Markus Armbruster wrote:
>> Andrew Jones  writes:
>> 
>> > On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
>> >> Daniel P. Berrangé  writes:
>> >> 
>> >> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
>> >> >> Hi all,
>> >> >> 
>> >> >> First some background:
>> >> >> 
>> >> >> For the userspace side of AArch64 guest SVE support we need to
>> >> >> expose KVM's allowed vector lengths bitmap to the user and allow
>> >> >> the user to choose a subset of that bitmap. Since bitmaps are a
>> >> >> bit awkward to work with then we'll likely want to expose it as
>> >> >> an array of vector lengths instead. Also, assuming we want to
>> >> >> expose the lengths as number-of-quadwords (quadword == 128 bits
>> >> >> for AArch64 and vector lengths must be multiples of quadwords)
>> >> >> rather than number-of-bits, then an example array (which will
>> >> >> always be a sequence) might be
>> >> >> 
>> >> >>  [ 8, 16, 32 ]
>> >> >> 
>> >> >> The user may choose a subsequence, but only through truncation,
>> >> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
>> >> >> 
>> >> >> Furthermore, different hosts may support different sequences
>> >> >> which have the same maximum. For example, if the above sequence
>> >> >> is for Host_A, then Host_B could be
>> >> >> 
>> >> >>  [ 8, 16, 24, 32 ]
>> >> >> 
>> >> >> The host must support all lengths in the sequence, which means
>> >> >> that while Host_A supports 32, since it doesn't support 24 and
>> >> >> we can only truncate sequences, we must use either [ 8 ] or
>> >> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
>> >> >> between the hosts.
>> >> >> 
>> >> >> Now to the $SUBJECT question:
>> >> >> 
>> >> >> My feeling is that we should require the sequence to be
>> >> >> provided on the command line as a cpu property. Something
>> >> >> like
>> >> >> 
>> >> >>   -cpu host,sve-vl-list=8:16
>> >> >> 
>> >> >> (I chose ':' for the delimiter because ',' can't work, but
>> >> >> if there's a better choice, then that's fine by me.)
>> >> >> 
>> >> >> Afaict a property list like this will require a new parser,
>> >> 
>> >> We had 20+ of those when I last counted.  Among the more annoying
>> >> reasons CLI QAPIfication is hard[1].
>> >> 
>> >> >> which feels a bit funny since it seems we should already
>> >> >> have support for this type of thing somewhere in QEMU. So,
>> >> >> the question is: do we? I see we have array properties, but
>> >> >> I don't believe that works with the command line. Should we
>> >> >> only use QMP for this? We already want some QMP in order to
>> >> >> query the supported vector lengths. Maybe we should use QMP
>> >> >> to set the selection too? But then what about command line
>> >> >> support for developers? And if the property is on the command
>> >> >> line then we don't have to add it to the migration stream.
>> >> >
>> >> > You should be able to use arrays from the CLI with QemuOpts by repeating
>> >> > the same option name many times, though I can't say it is a very
>> >> > nice approach if you have many values to list as it gets very 
>> >> > repetative.
>> >> 
>> >> Yes, this is one of the ways the current CLI does lists.  It's also one
>> >> of the more annoying reasons CLI QAPIfication is hard[2].
>> >> 
>> >> QemuOpts let the last param=value win the stupidest way that could
>> >> possibly work (I respect that): add to the front of the list, search it
>> >> front to back.
>> >> 
>> >> Then somebody discovered that if you search the list manually, you can
>> >> see them all, and abuse that to get a list-valued param.  I'm sure that
>> >> felt clever at the time.
>> >> 
>> >> Another way to do lists the funky list feature of string input and opts
>> >> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
>> >> 
>> >> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
>> >> looks like we even combine it with the "multiple param=value build up a
>> >> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
>> >> 
>> >> > That's the curse of not having a good CLI syntax for non-scalar data in
>> >> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
>> >> >
>> >> >  -cpu host,sve-vl=8,sve-vl=16
>> >> 
>> >> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
>> >> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
>> >> simple cases, then gets uglier as things get more complex, and then it
>> >> falls apart: it can't quite express all of JSON.
>> >> 
>> >> Example: sve-vl.0=8,sve-vl.1=16
>> >> gets desugared into {"sve": [8, 16]}
>> >> if the QAPI schema has 'sve': ['int'].
>> >> 
>> >> The comment at the beginning of util/keyval.c explains it in more
>> >> detail.
>> >> 
>> >> It powers -blockdev and -display.  Both options accept either JSON or
>> >> dotted keys.  If the option argument starts with '{', it's JSON.

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-14 Thread Andrew Jones
On Tue, May 14, 2019 at 06:54:03AM +0200, Markus Armbruster wrote:
> Andrew Jones  writes:
> 
> > On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
> >> Daniel P. Berrangé  writes:
> >> 
> >> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> >> >> Hi all,
> >> >> 
> >> >> First some background:
> >> >> 
> >> >> For the userspace side of AArch64 guest SVE support we need to
> >> >> expose KVM's allowed vector lengths bitmap to the user and allow
> >> >> the user to choose a subset of that bitmap. Since bitmaps are a
> >> >> bit awkward to work with then we'll likely want to expose it as
> >> >> an array of vector lengths instead. Also, assuming we want to
> >> >> expose the lengths as number-of-quadwords (quadword == 128 bits
> >> >> for AArch64 and vector lengths must be multiples of quadwords)
> >> >> rather than number-of-bits, then an example array (which will
> >> >> always be a sequence) might be
> >> >> 
> >> >>  [ 8, 16, 32 ]
> >> >> 
> >> >> The user may choose a subsequence, but only through truncation,
> >> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> >> >> 
> >> >> Furthermore, different hosts may support different sequences
> >> >> which have the same maximum. For example, if the above sequence
> >> >> is for Host_A, then Host_B could be
> >> >> 
> >> >>  [ 8, 16, 24, 32 ]
> >> >> 
> >> >> The host must support all lengths in the sequence, which means
> >> >> that while Host_A supports 32, since it doesn't support 24 and
> >> >> we can only truncate sequences, we must use either [ 8 ] or
> >> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
> >> >> between the hosts.
> >> >> 
> >> >> Now to the $SUBJECT question:
> >> >> 
> >> >> My feeling is that we should require the sequence to be
> >> >> provided on the command line as a cpu property. Something
> >> >> like
> >> >> 
> >> >>   -cpu host,sve-vl-list=8:16
> >> >> 
> >> >> (I chose ':' for the delimiter because ',' can't work, but
> >> >> if there's a better choice, then that's fine by me.)
> >> >> 
> >> >> Afaict a property list like this will require a new parser,
> >> 
> >> We had 20+ of those when I last counted.  Among the more annoying
> >> reasons CLI QAPIfication is hard[1].
> >> 
> >> >> which feels a bit funny since it seems we should already
> >> >> have support for this type of thing somewhere in QEMU. So,
> >> >> the question is: do we? I see we have array properties, but
> >> >> I don't believe that works with the command line. Should we
> >> >> only use QMP for this? We already want some QMP in order to
> >> >> query the supported vector lengths. Maybe we should use QMP
> >> >> to set the selection too? But then what about command line
> >> >> support for developers? And if the property is on the command
> >> >> line then we don't have to add it to the migration stream.
> >> >
> >> > You should be able to use arrays from the CLI with QemuOpts by repeating
> >> > the same option name many times, though I can't say it is a very
> >> > nice approach if you have many values to list as it gets very repetative.
> >> 
> >> Yes, this is one of the ways the current CLI does lists.  It's also one
> >> of the more annoying reasons CLI QAPIfication is hard[2].
> >> 
> >> QemuOpts let the last param=value win the stupidest way that could
> >> possibly work (I respect that): add to the front of the list, search it
> >> front to back.
> >> 
> >> Then somebody discovered that if you search the list manually, you can
> >> see them all, and abuse that to get a list-valued param.  I'm sure that
> >> felt clever at the time.
> >> 
> >> Another way to do lists the funky list feature of string input and opts
> >> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
> >> 
> >> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
> >> looks like we even combine it with the "multiple param=value build up a
> >> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
> >> 
> >> > That's the curse of not having a good CLI syntax for non-scalar data in
> >> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
> >> >
> >> >  -cpu host,sve-vl=8,sve-vl=16
> >> 
> >> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
> >> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
> >> simple cases, then gets uglier as things get more complex, and then it
> >> falls apart: it can't quite express all of JSON.
> >> 
> >> Example: sve-vl.0=8,sve-vl.1=16
> >> gets desugared into {"sve": [8, 16]}
> >> if the QAPI schema has 'sve': ['int'].
> >> 
> >> The comment at the beginning of util/keyval.c explains it in more
> >> detail.
> >> 
> >> It powers -blockdev and -display.  Both options accept either JSON or
> >> dotted keys.  If the option argument starts with '{', it's JSON.
> >> Management applications should stick to JSON.
> >> 
> >> 
> >> [1] Towards a more expressive and introspectable QEMU command line
> >> 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-13 Thread Markus Armbruster
Andrew Jones  writes:

> On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
>> Daniel P. Berrangé  writes:
>> 
>> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
>> >> Hi all,
>> >> 
>> >> First some background:
>> >> 
>> >> For the userspace side of AArch64 guest SVE support we need to
>> >> expose KVM's allowed vector lengths bitmap to the user and allow
>> >> the user to choose a subset of that bitmap. Since bitmaps are a
>> >> bit awkward to work with then we'll likely want to expose it as
>> >> an array of vector lengths instead. Also, assuming we want to
>> >> expose the lengths as number-of-quadwords (quadword == 128 bits
>> >> for AArch64 and vector lengths must be multiples of quadwords)
>> >> rather than number-of-bits, then an example array (which will
>> >> always be a sequence) might be
>> >> 
>> >>  [ 8, 16, 32 ]
>> >> 
>> >> The user may choose a subsequence, but only through truncation,
>> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
>> >> 
>> >> Furthermore, different hosts may support different sequences
>> >> which have the same maximum. For example, if the above sequence
>> >> is for Host_A, then Host_B could be
>> >> 
>> >>  [ 8, 16, 24, 32 ]
>> >> 
>> >> The host must support all lengths in the sequence, which means
>> >> that while Host_A supports 32, since it doesn't support 24 and
>> >> we can only truncate sequences, we must use either [ 8 ] or
>> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
>> >> between the hosts.
>> >> 
>> >> Now to the $SUBJECT question:
>> >> 
>> >> My feeling is that we should require the sequence to be
>> >> provided on the command line as a cpu property. Something
>> >> like
>> >> 
>> >>   -cpu host,sve-vl-list=8:16
>> >> 
>> >> (I chose ':' for the delimiter because ',' can't work, but
>> >> if there's a better choice, then that's fine by me.)
>> >> 
>> >> Afaict a property list like this will require a new parser,
>> 
>> We had 20+ of those when I last counted.  Among the more annoying
>> reasons CLI QAPIfication is hard[1].
>> 
>> >> which feels a bit funny since it seems we should already
>> >> have support for this type of thing somewhere in QEMU. So,
>> >> the question is: do we? I see we have array properties, but
>> >> I don't believe that works with the command line. Should we
>> >> only use QMP for this? We already want some QMP in order to
>> >> query the supported vector lengths. Maybe we should use QMP
>> >> to set the selection too? But then what about command line
>> >> support for developers? And if the property is on the command
>> >> line then we don't have to add it to the migration stream.
>> >
>> > You should be able to use arrays from the CLI with QemuOpts by repeating
>> > the same option name many times, though I can't say it is a very
>> > nice approach if you have many values to list as it gets very repetative.
>> 
>> Yes, this is one of the ways the current CLI does lists.  It's also one
>> of the more annoying reasons CLI QAPIfication is hard[2].
>> 
>> QemuOpts let the last param=value win the stupidest way that could
>> possibly work (I respect that): add to the front of the list, search it
>> front to back.
>> 
>> Then somebody discovered that if you search the list manually, you can
>> see them all, and abuse that to get a list-valued param.  I'm sure that
>> felt clever at the time.
>> 
>> Another way to do lists the funky list feature of string input and opts
>> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
>> 
>> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
>> looks like we even combine it with the "multiple param=value build up a
>> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
>> 
>> > That's the curse of not having a good CLI syntax for non-scalar data in
>> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
>> >
>> >  -cpu host,sve-vl=8,sve-vl=16
>> 
>> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
>> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
>> simple cases, then gets uglier as things get more complex, and then it
>> falls apart: it can't quite express all of JSON.
>> 
>> Example: sve-vl.0=8,sve-vl.1=16
>> gets desugared into {"sve": [8, 16]}
>> if the QAPI schema has 'sve': ['int'].
>> 
>> The comment at the beginning of util/keyval.c explains it in more
>> detail.
>> 
>> It powers -blockdev and -display.  Both options accept either JSON or
>> dotted keys.  If the option argument starts with '{', it's JSON.
>> Management applications should stick to JSON.
>> 
>> 
>> [1] Towards a more expressive and introspectable QEMU command line
>> https://www.linux-kvm.org/images/f/f2/Armbru-qapi-cmdline_1.pdf
>> Slide 34 "Backward compatibility" item 1
>> 
>> [2] ibid, item 4
>> 
>> [3] ibid, item 3
>>
>
> Sorry I forgot to follow up to this earlier. I looked at the examples
> provided and saw they were all for independent 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-05-13 Thread Andrew Jones
On Thu, Apr 18, 2019 at 07:48:09PM +0200, Markus Armbruster wrote:
> Daniel P. Berrangé  writes:
> 
> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> >> Hi all,
> >> 
> >> First some background:
> >> 
> >> For the userspace side of AArch64 guest SVE support we need to
> >> expose KVM's allowed vector lengths bitmap to the user and allow
> >> the user to choose a subset of that bitmap. Since bitmaps are a
> >> bit awkward to work with then we'll likely want to expose it as
> >> an array of vector lengths instead. Also, assuming we want to
> >> expose the lengths as number-of-quadwords (quadword == 128 bits
> >> for AArch64 and vector lengths must be multiples of quadwords)
> >> rather than number-of-bits, then an example array (which will
> >> always be a sequence) might be
> >> 
> >>  [ 8, 16, 32 ]
> >> 
> >> The user may choose a subsequence, but only through truncation,
> >> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> >> 
> >> Furthermore, different hosts may support different sequences
> >> which have the same maximum. For example, if the above sequence
> >> is for Host_A, then Host_B could be
> >> 
> >>  [ 8, 16, 24, 32 ]
> >> 
> >> The host must support all lengths in the sequence, which means
> >> that while Host_A supports 32, since it doesn't support 24 and
> >> we can only truncate sequences, we must use either [ 8 ] or
> >> [ 8, 16 ] for a compatible sequence if we intend to migrate
> >> between the hosts.
> >> 
> >> Now to the $SUBJECT question:
> >> 
> >> My feeling is that we should require the sequence to be
> >> provided on the command line as a cpu property. Something
> >> like
> >> 
> >>   -cpu host,sve-vl-list=8:16
> >> 
> >> (I chose ':' for the delimiter because ',' can't work, but
> >> if there's a better choice, then that's fine by me.)
> >> 
> >> Afaict a property list like this will require a new parser,
> 
> We had 20+ of those when I last counted.  Among the more annoying
> reasons CLI QAPIfication is hard[1].
> 
> >> which feels a bit funny since it seems we should already
> >> have support for this type of thing somewhere in QEMU. So,
> >> the question is: do we? I see we have array properties, but
> >> I don't believe that works with the command line. Should we
> >> only use QMP for this? We already want some QMP in order to
> >> query the supported vector lengths. Maybe we should use QMP
> >> to set the selection too? But then what about command line
> >> support for developers? And if the property is on the command
> >> line then we don't have to add it to the migration stream.
> >
> > You should be able to use arrays from the CLI with QemuOpts by repeating
> > the same option name many times, though I can't say it is a very
> > nice approach if you have many values to list as it gets very repetative.
> 
> Yes, this is one of the ways the current CLI does lists.  It's also one
> of the more annoying reasons CLI QAPIfication is hard[2].
> 
> QemuOpts let the last param=value win the stupidest way that could
> possibly work (I respect that): add to the front of the list, search it
> front to back.
> 
> Then somebody discovered that if you search the list manually, you can
> see them all, and abuse that to get a list-valued param.  I'm sure that
> felt clever at the time.
> 
> Another way to do lists the funky list feature of string input and opts
> visitor.  Yet another annoying reason CLI QAPIfication is hard[3].
> 
> We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
> looks like we even combine it with the "multiple param=value build up a
> list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].
> 
> > That's the curse of not having a good CLI syntax for non-scalar data in
> > QemuOpts & why Markus believes we should switch to JSON for the CLI too
> >
> >  -cpu host,sve-vl=8,sve-vl=16
> 
> We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
> keys are syntactic sugar for JSON.  It looks friendlier than JSON for
> simple cases, then gets uglier as things get more complex, and then it
> falls apart: it can't quite express all of JSON.
> 
> Example: sve-vl.0=8,sve-vl.1=16
> gets desugared into {"sve": [8, 16]}
> if the QAPI schema has 'sve': ['int'].
> 
> The comment at the beginning of util/keyval.c explains it in more
> detail.
> 
> It powers -blockdev and -display.  Both options accept either JSON or
> dotted keys.  If the option argument starts with '{', it's JSON.
> Management applications should stick to JSON.
> 
> 
> [1] Towards a more expressive and introspectable QEMU command line
> https://www.linux-kvm.org/images/f/f2/Armbru-qapi-cmdline_1.pdf
> Slide 34 "Backward compatibility" item 1
> 
> [2] ibid, item 4
> 
> [3] ibid, item 3
>

Sorry I forgot to follow up to this earlier. I looked at the examples
provided and saw they were all for independent command line options,
rather than command line options like '-cpu' that then accepts additional
properties. I couldn't see how I could use ',' 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Laszlo Ersek
On 04/18/19 11:28, Andrew Jones wrote:
> Hi all,
> 
> First some background:
> 
> For the userspace side of AArch64 guest SVE support we need to
> expose KVM's allowed vector lengths bitmap to the user and allow
> the user to choose a subset of that bitmap. Since bitmaps are a
> bit awkward to work with then we'll likely want to expose it as
> an array of vector lengths instead. Also, assuming we want to
> expose the lengths as number-of-quadwords (quadword == 128 bits
> for AArch64 and vector lengths must be multiples of quadwords)
> rather than number-of-bits, then an example array (which will
> always be a sequence) might be
> 
>  [ 8, 16, 32 ]
> 
> The user may choose a subsequence, but only through truncation,
> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> 
> Furthermore, different hosts may support different sequences
> which have the same maximum. For example, if the above sequence
> is for Host_A, then Host_B could be
> 
>  [ 8, 16, 24, 32 ]
> 
> The host must support all lengths in the sequence, which means
> that while Host_A supports 32, since it doesn't support 24 and
> we can only truncate sequences, we must use either [ 8 ] or
> [ 8, 16 ] for a compatible sequence if we intend to migrate
> between the hosts.
> 
> Now to the $SUBJECT question:
> 
> My feeling is that we should require the sequence to be
> provided on the command line as a cpu property. Something
> like
> 
>   -cpu host,sve-vl-list=8:16
> 
> (I chose ':' for the delimiter because ',' can't work, but
> if there's a better choice, then that's fine by me.)
> 
> Afaict a property list like this will require a new parser,
> which feels a bit funny since it seems we should already
> have support for this type of thing somewhere in QEMU. So,
> the question is: do we?

I think so. OptsVisitor can parse repeated properties from an option and
turn them into a list that you define in QAPI schema. More precisely,
you'd define the schema first, subject to "rules" and "restrictions",
and then OptsVisitor would allow you to grab that schema from command
line options. A list of integers qualifies.

See for example:

[Qemu-devel] [PATCH v2 0/8] OptsVisitor: support / flatten integer range
https://lists.gnu.org/archive/html/qemu-devel/2013-08/msg02686.html

(this is actually a feature on top of what you seem to need, but this is
what I could find right now).

Although I worked on this stuff in 2012-2013 (and so I remember
basically nothing about it), it should still function, because the qtest
suite exercises it with good coverage.

So, suggestions:
- git show -s eb7ee2cb
- check how "-numa" is parsed, and steal it :)

If OptsVisitor is hard to combine with existent options that are already
parsed in a different manner (and I do think it would be difficult),
then a new option could be introduced. For example:

  -sve-vector-lengths allow=8,allow=16

which should give you an ordered list of lengths, and you could distill
that manually into a single bitmap.

Thanks,
Laszlo
PS: I do mean I don't remember anything about OptsVisitor :/

> I see we have array properties, but
> I don't believe that works with the command line. Should we
> only use QMP for this? We already want some QMP in order to
> query the supported vector lengths. Maybe we should use QMP
> to set the selection too? But then what about command line
> support for developers? And if the property is on the command
> line then we don't have to add it to the migration stream.
> 
> Thanks,
> drew
> 




Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Markus Armbruster
Daniel P. Berrangé  writes:

> On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
>> Hi all,
>> 
>> First some background:
>> 
>> For the userspace side of AArch64 guest SVE support we need to
>> expose KVM's allowed vector lengths bitmap to the user and allow
>> the user to choose a subset of that bitmap. Since bitmaps are a
>> bit awkward to work with then we'll likely want to expose it as
>> an array of vector lengths instead. Also, assuming we want to
>> expose the lengths as number-of-quadwords (quadword == 128 bits
>> for AArch64 and vector lengths must be multiples of quadwords)
>> rather than number-of-bits, then an example array (which will
>> always be a sequence) might be
>> 
>>  [ 8, 16, 32 ]
>> 
>> The user may choose a subsequence, but only through truncation,
>> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
>> 
>> Furthermore, different hosts may support different sequences
>> which have the same maximum. For example, if the above sequence
>> is for Host_A, then Host_B could be
>> 
>>  [ 8, 16, 24, 32 ]
>> 
>> The host must support all lengths in the sequence, which means
>> that while Host_A supports 32, since it doesn't support 24 and
>> we can only truncate sequences, we must use either [ 8 ] or
>> [ 8, 16 ] for a compatible sequence if we intend to migrate
>> between the hosts.
>> 
>> Now to the $SUBJECT question:
>> 
>> My feeling is that we should require the sequence to be
>> provided on the command line as a cpu property. Something
>> like
>> 
>>   -cpu host,sve-vl-list=8:16
>> 
>> (I chose ':' for the delimiter because ',' can't work, but
>> if there's a better choice, then that's fine by me.)
>> 
>> Afaict a property list like this will require a new parser,

We had 20+ of those when I last counted.  Among the more annoying
reasons CLI QAPIfication is hard[1].

>> which feels a bit funny since it seems we should already
>> have support for this type of thing somewhere in QEMU. So,
>> the question is: do we? I see we have array properties, but
>> I don't believe that works with the command line. Should we
>> only use QMP for this? We already want some QMP in order to
>> query the supported vector lengths. Maybe we should use QMP
>> to set the selection too? But then what about command line
>> support for developers? And if the property is on the command
>> line then we don't have to add it to the migration stream.
>
> You should be able to use arrays from the CLI with QemuOpts by repeating
> the same option name many times, though I can't say it is a very
> nice approach if you have many values to list as it gets very repetative.

Yes, this is one of the ways the current CLI does lists.  It's also one
of the more annoying reasons CLI QAPIfication is hard[2].

QemuOpts let the last param=value win the stupidest way that could
possibly work (I respect that): add to the front of the list, search it
front to back.

Then somebody discovered that if you search the list manually, you can
see them all, and abuse that to get a list-valued param.  I'm sure that
felt clever at the time.

Another way to do lists the funky list feature of string input and opts
visitor.  Yet another annoying reason CLI QAPIfication is hard[3].

We use the opts visitor's list feature for -numa node,cpus=...  Hmm,
looks like we even combine it with the "multiple param=value build up a
list" technique: -smp node,cpus=0-1,cpus=4-5 denotes [0,1,4,5].

> That's the curse of not having a good CLI syntax for non-scalar data in
> QemuOpts & why Markus believes we should switch to JSON for the CLI too
>
>  -cpu host,sve-vl=8,sve-vl=16

We actually have CLI syntax for non-scalar data: dotted keys.  Dotted
keys are syntactic sugar for JSON.  It looks friendlier than JSON for
simple cases, then gets uglier as things get more complex, and then it
falls apart: it can't quite express all of JSON.

Example: sve-vl.0=8,sve-vl.1=16
gets desugared into {"sve": [8, 16]}
if the QAPI schema has 'sve': ['int'].

The comment at the beginning of util/keyval.c explains it in more
detail.

It powers -blockdev and -display.  Both options accept either JSON or
dotted keys.  If the option argument starts with '{', it's JSON.
Management applications should stick to JSON.


[1] Towards a more expressive and introspectable QEMU command line
https://www.linux-kvm.org/images/f/f2/Armbru-qapi-cmdline_1.pdf
Slide 34 "Backward compatibility" item 1

[2] ibid, item 4

[3] ibid, item 3



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Andrew Jones
On Thu, Apr 18, 2019 at 12:26:10PM +0100, Daniel P. Berrangé wrote:
> On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > Hi all,
> > 
> > First some background:
> > 
> > For the userspace side of AArch64 guest SVE support we need to
> > expose KVM's allowed vector lengths bitmap to the user and allow
> > the user to choose a subset of that bitmap. Since bitmaps are a
> > bit awkward to work with then we'll likely want to expose it as
> > an array of vector lengths instead. Also, assuming we want to
> > expose the lengths as number-of-quadwords (quadword == 128 bits
> > for AArch64 and vector lengths must be multiples of quadwords)
> > rather than number-of-bits, then an example array (which will
> > always be a sequence) might be
> > 
> >  [ 8, 16, 32 ]
> > 
> > The user may choose a subsequence, but only through truncation,
> > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > 
> > Furthermore, different hosts may support different sequences
> > which have the same maximum. For example, if the above sequence
> > is for Host_A, then Host_B could be
> > 
> >  [ 8, 16, 24, 32 ]
> > 
> > The host must support all lengths in the sequence, which means
> > that while Host_A supports 32, since it doesn't support 24 and
> > we can only truncate sequences, we must use either [ 8 ] or
> > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > between the hosts.
> > 
> > Now to the $SUBJECT question:
> > 
> > My feeling is that we should require the sequence to be
> > provided on the command line as a cpu property. Something
> > like
> > 
> >   -cpu host,sve-vl-list=8:16
> > 
> > (I chose ':' for the delimiter because ',' can't work, but
> > if there's a better choice, then that's fine by me.)
> > 
> > Afaict a property list like this will require a new parser,
> > which feels a bit funny since it seems we should already
> > have support for this type of thing somewhere in QEMU. So,
> > the question is: do we? I see we have array properties, but
> > I don't believe that works with the command line. Should we
> > only use QMP for this? We already want some QMP in order to
> > query the supported vector lengths. Maybe we should use QMP
> > to set the selection too? But then what about command line
> > support for developers? And if the property is on the command
> > line then we don't have to add it to the migration stream.
> 
> You should be able to use arrays from the CLI with QemuOpts by repeating
> the same option name many times, though I can't say it is a very
> nice approach if you have many values to list as it gets very repetative.
> That's the curse of not having a good CLI syntax for non-scalar data in
> QemuOpts & why Markus believes we should switch to JSON for the CLI too
> 
>  -cpu host,sve-vl=8,sve-vl=16

This might be OK if it integrates nicely with QMP, etc, as the need for
a more verbose command line may be better than adding another parser,
etc. that Markus will have to rework someday :) Can you point me to a
property that needs/uses this already so I can look at its code?

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Dave Martin
On Thu, Apr 18, 2019 at 03:43:06PM +0100, Andrew Jones wrote:
> On Thu, Apr 18, 2019 at 03:03:02PM +0100, Dave Martin wrote:

[...]

> > It's worth nothing that there are two problems to be solved here: one is
> > to specify an exact set unambiguously, which is important for migration
> > scenarios.
> > 
> > The other is to be able to clamp the vector length for user convenience,
> > but without particularly considering migration.  There's no direct way
> > for the user to know the set of vector lengths supported by KVM today,
> > so cooking up the right magic to go on the command line is non-trivial:
> > you have to create a dummy vcpu and read KVM_REG_ARM64_SVE_VLS to find
> > the host's supported set.  Or you just have to know.
> 
> Right, we'll have to query first to know what's available. libvirt will
> do that and tools built on libvirt should help provide the user with
> sane defaults or a relatively painless selection process. The QEMU command
> line is primarily for developers, so they'll likely just know what they
> want.
> 
> > 
> > A separate max-vl option (or whatever) might be a useful alternative.
> 
> Yeah, we could offer this to be nicer to QEMU command line users that
> don't intend to migrate, or don't care if a migration can fail. This
> would be analogous to '-cpu max' which enables all available cpu
> features. Bad for migration, but a nice shorthand if you want your
> guest to have everything.

Sounds reasonable.

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Andrew Jones
On Thu, Apr 18, 2019 at 03:03:02PM +0100, Dave Martin wrote:
> On Thu, Apr 18, 2019 at 12:28:47PM +0100, Andrew Jones wrote:
> > On Thu, Apr 18, 2019 at 11:52:04AM +0100, Dave Martin wrote:
> > > On Thu, Apr 18, 2019 at 10:46:34AM +0100, Andrew Jones wrote:
> > > > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > > > > Hi all,
> > > > > 
> > > > > First some background:
> > > > > 
> > > > > For the userspace side of AArch64 guest SVE support we need to
> > > > > expose KVM's allowed vector lengths bitmap to the user and allow
> > > > > the user to choose a subset of that bitmap. Since bitmaps are a
> > > > > bit awkward to work with then we'll likely want to expose it as
> > > > > an array of vector lengths instead. Also, assuming we want to
> > > > > expose the lengths as number-of-quadwords (quadword == 128 bits
> > > > > for AArch64 and vector lengths must be multiples of quadwords)
> > > > > rather than number-of-bits, then an example array (which will
> > > > > always be a sequence) might be
> > > > > 
> > > > >  [ 8, 16, 32 ]
> > > > > 
> > > > > The user may choose a subsequence, but only through truncation,
> > > > > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > > > > 
> > > > > Furthermore, different hosts may support different sequences
> > > > > which have the same maximum. For example, if the above sequence
> > > > > is for Host_A, then Host_B could be
> > > > > 
> > > > >  [ 8, 16, 24, 32 ]
> > > > 
> > > > It doesn't really matter for this discussion, but I just realized
> > > > that I picked bogus numbers for these examples. 32 would be too
> > > > big. The largest supported is 16. I probably should have just used
> > > > the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
> > > > vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.
> > > 
> > > I'd argue differently from the ABI perspective.
> > > 
> > > If the host supports vq = [ 1,2,3,4 ], then it is entirely valid to ask
> > > for [ 1,2,4 ].  KVM will fail the KVM_REG_ARM64_SVE_VLS write with
> > > EINVAL, but I don't distinguish between a set that is not satisfiable on
> > > this hardware and a set that is not valid at all.  The kernel basically
> > > doesn't check for the latter: an architecturally invalid set will always
> > > not be satisfiable on the hardware.
> > 
> > I agree that 1,2,4 should be a valid set, but how do we avoid the user
> > attempting to select it on a platform that supports 1,2,3,4 now? Until
> > the hardware and KVM will allow it, then I don't think we should try
> > to "support" it in any way. Maybe we should name the property such that
> > it's clear we need to use truncation when constructing a subset now.
> > This would allow us to add another, more generally named, property later
> > when we can select nearly arbitrary subsets.
> > 
> > > 
> > > Ideally, userspace should not preempt this decision, in case the
> > > architecture becomes more flexible someday in what it can virtualise.
> > > 
> > > > > The host must support all lengths in the sequence, which means
> > > > > that while Host_A supports 32, since it doesn't support 24 and
> > > > > we can only truncate sequences, we must use either [ 8 ] or
> > > > > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > > > > between the hosts.
> > > > > 
> > > > > Now to the $SUBJECT question:
> > > > > 
> > > > > My feeling is that we should require the sequence to be
> > > > > provided on the command line as a cpu property. Something
> > > > > like
> > > > > 
> > > > >   -cpu host,sve-vl-list=8:16
> > > 
> > > I can't decide whether it's more or less user-friendly to denote VL in
> > > terms of bytes in this kind of context.
> > 
> > I'm not sure either. Switching to my second take at quadwords this should
> > have been '1:2'. In bytes [ 1, 2 ] would be '16:32'.
> > 
> > > 
> > > Usually when I say "VL" in the kernel ABI I try to mean this.
> > > (KVM_REG_ARM64_SVE_VLS is a special case: here the lengths are fancily
> > > encoded rather than being passed as integers, so the precise unit used
> > > is a more abstract concept here ... or anyway, that's my excuse.
> > > _SVE_VQS felt odd here.)
> > 
> > My thinking is that using the number of quadwords keeps the numbers
> > smaller. But, if people are mostly going to want to think about vector
> > lengths in terms of bits, like the specification does, then maybe we
> > should just let the numbers be bigger: [ 128, 256, 512 ]
> > 
> > > 
> > > For kvmtool I went with quadwords on the command line, but only as a
> > > quick hack to simplify the parser slightly.
> > > 
> > > OTOH, specifying 1,2,4 on the command line is clearly less annoying and
> > > error-prone than 16,32,64.
> > > 
> > > Naming the option with "vq" instead of "vl" is another option, though
> > > "vq" is Linux terminology not endorsed by the architecture.
> > 
> > I think VL is OK as long we document the unit.
> 
> As you wish (and that's basically where I ended up for now with kvmtool).

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Dr. David Alan Gilbert
* Andrew Jones (drjo...@redhat.com) wrote:
> On Thu, Apr 18, 2019 at 03:03:02PM +0100, Dave Martin wrote:
> > On Thu, Apr 18, 2019 at 12:28:47PM +0100, Andrew Jones wrote:
> > > On Thu, Apr 18, 2019 at 11:52:04AM +0100, Dave Martin wrote:
> > > > On Thu, Apr 18, 2019 at 10:46:34AM +0100, Andrew Jones wrote:
> > > > > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > > > > > Hi all,
> > > > > > 
> > > > > > First some background:
> > > > > > 
> > > > > > For the userspace side of AArch64 guest SVE support we need to
> > > > > > expose KVM's allowed vector lengths bitmap to the user and allow
> > > > > > the user to choose a subset of that bitmap. Since bitmaps are a
> > > > > > bit awkward to work with then we'll likely want to expose it as
> > > > > > an array of vector lengths instead. Also, assuming we want to
> > > > > > expose the lengths as number-of-quadwords (quadword == 128 bits
> > > > > > for AArch64 and vector lengths must be multiples of quadwords)
> > > > > > rather than number-of-bits, then an example array (which will
> > > > > > always be a sequence) might be
> > > > > > 
> > > > > >  [ 8, 16, 32 ]
> > > > > > 
> > > > > > The user may choose a subsequence, but only through truncation,
> > > > > > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > > > > > 
> > > > > > Furthermore, different hosts may support different sequences
> > > > > > which have the same maximum. For example, if the above sequence
> > > > > > is for Host_A, then Host_B could be
> > > > > > 
> > > > > >  [ 8, 16, 24, 32 ]
> > > > > 
> > > > > It doesn't really matter for this discussion, but I just realized
> > > > > that I picked bogus numbers for these examples. 32 would be too
> > > > > big. The largest supported is 16. I probably should have just used
> > > > > the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
> > > > > vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.
> > > > 
> > > > I'd argue differently from the ABI perspective.
> > > > 
> > > > If the host supports vq = [ 1,2,3,4 ], then it is entirely valid to ask
> > > > for [ 1,2,4 ].  KVM will fail the KVM_REG_ARM64_SVE_VLS write with
> > > > EINVAL, but I don't distinguish between a set that is not satisfiable on
> > > > this hardware and a set that is not valid at all.  The kernel basically
> > > > doesn't check for the latter: an architecturally invalid set will always
> > > > not be satisfiable on the hardware.
> > > 
> > > I agree that 1,2,4 should be a valid set, but how do we avoid the user
> > > attempting to select it on a platform that supports 1,2,3,4 now? Until
> > > the hardware and KVM will allow it, then I don't think we should try
> > > to "support" it in any way. Maybe we should name the property such that
> > > it's clear we need to use truncation when constructing a subset now.
> > > This would allow us to add another, more generally named, property later
> > > when we can select nearly arbitrary subsets.
> > > 
> > > > 
> > > > Ideally, userspace should not preempt this decision, in case the
> > > > architecture becomes more flexible someday in what it can virtualise.
> > > > 
> > > > > > The host must support all lengths in the sequence, which means
> > > > > > that while Host_A supports 32, since it doesn't support 24 and
> > > > > > we can only truncate sequences, we must use either [ 8 ] or
> > > > > > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > > > > > between the hosts.
> > > > > > 
> > > > > > Now to the $SUBJECT question:
> > > > > > 
> > > > > > My feeling is that we should require the sequence to be
> > > > > > provided on the command line as a cpu property. Something
> > > > > > like
> > > > > > 
> > > > > >   -cpu host,sve-vl-list=8:16
> > > > 
> > > > I can't decide whether it's more or less user-friendly to denote VL in
> > > > terms of bytes in this kind of context.
> > > 
> > > I'm not sure either. Switching to my second take at quadwords this should
> > > have been '1:2'. In bytes [ 1, 2 ] would be '16:32'.
> > > 
> > > > 
> > > > Usually when I say "VL" in the kernel ABI I try to mean this.
> > > > (KVM_REG_ARM64_SVE_VLS is a special case: here the lengths are fancily
> > > > encoded rather than being passed as integers, so the precise unit used
> > > > is a more abstract concept here ... or anyway, that's my excuse.
> > > > _SVE_VQS felt odd here.)
> > > 
> > > My thinking is that using the number of quadwords keeps the numbers
> > > smaller. But, if people are mostly going to want to think about vector
> > > lengths in terms of bits, like the specification does, then maybe we
> > > should just let the numbers be bigger: [ 128, 256, 512 ]
> > > 
> > > > 
> > > > For kvmtool I went with quadwords on the command line, but only as a
> > > > quick hack to simplify the parser slightly.
> > > > 
> > > > OTOH, specifying 1,2,4 on the command line is clearly less annoying and
> > > > error-prone than 16,32,64.
> > > > 
> > > > Naming the option with "vq" 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Dave Martin
On Thu, Apr 18, 2019 at 12:28:47PM +0100, Andrew Jones wrote:
> On Thu, Apr 18, 2019 at 11:52:04AM +0100, Dave Martin wrote:
> > On Thu, Apr 18, 2019 at 10:46:34AM +0100, Andrew Jones wrote:
> > > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > > > Hi all,
> > > > 
> > > > First some background:
> > > > 
> > > > For the userspace side of AArch64 guest SVE support we need to
> > > > expose KVM's allowed vector lengths bitmap to the user and allow
> > > > the user to choose a subset of that bitmap. Since bitmaps are a
> > > > bit awkward to work with then we'll likely want to expose it as
> > > > an array of vector lengths instead. Also, assuming we want to
> > > > expose the lengths as number-of-quadwords (quadword == 128 bits
> > > > for AArch64 and vector lengths must be multiples of quadwords)
> > > > rather than number-of-bits, then an example array (which will
> > > > always be a sequence) might be
> > > > 
> > > >  [ 8, 16, 32 ]
> > > > 
> > > > The user may choose a subsequence, but only through truncation,
> > > > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > > > 
> > > > Furthermore, different hosts may support different sequences
> > > > which have the same maximum. For example, if the above sequence
> > > > is for Host_A, then Host_B could be
> > > > 
> > > >  [ 8, 16, 24, 32 ]
> > > 
> > > It doesn't really matter for this discussion, but I just realized
> > > that I picked bogus numbers for these examples. 32 would be too
> > > big. The largest supported is 16. I probably should have just used
> > > the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
> > > vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.
> > 
> > I'd argue differently from the ABI perspective.
> > 
> > If the host supports vq = [ 1,2,3,4 ], then it is entirely valid to ask
> > for [ 1,2,4 ].  KVM will fail the KVM_REG_ARM64_SVE_VLS write with
> > EINVAL, but I don't distinguish between a set that is not satisfiable on
> > this hardware and a set that is not valid at all.  The kernel basically
> > doesn't check for the latter: an architecturally invalid set will always
> > not be satisfiable on the hardware.
> 
> I agree that 1,2,4 should be a valid set, but how do we avoid the user
> attempting to select it on a platform that supports 1,2,3,4 now? Until
> the hardware and KVM will allow it, then I don't think we should try
> to "support" it in any way. Maybe we should name the property such that
> it's clear we need to use truncation when constructing a subset now.
> This would allow us to add another, more generally named, property later
> when we can select nearly arbitrary subsets.
> 
> > 
> > Ideally, userspace should not preempt this decision, in case the
> > architecture becomes more flexible someday in what it can virtualise.
> > 
> > > > The host must support all lengths in the sequence, which means
> > > > that while Host_A supports 32, since it doesn't support 24 and
> > > > we can only truncate sequences, we must use either [ 8 ] or
> > > > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > > > between the hosts.
> > > > 
> > > > Now to the $SUBJECT question:
> > > > 
> > > > My feeling is that we should require the sequence to be
> > > > provided on the command line as a cpu property. Something
> > > > like
> > > > 
> > > >   -cpu host,sve-vl-list=8:16
> > 
> > I can't decide whether it's more or less user-friendly to denote VL in
> > terms of bytes in this kind of context.
> 
> I'm not sure either. Switching to my second take at quadwords this should
> have been '1:2'. In bytes [ 1, 2 ] would be '16:32'.
> 
> > 
> > Usually when I say "VL" in the kernel ABI I try to mean this.
> > (KVM_REG_ARM64_SVE_VLS is a special case: here the lengths are fancily
> > encoded rather than being passed as integers, so the precise unit used
> > is a more abstract concept here ... or anyway, that's my excuse.
> > _SVE_VQS felt odd here.)
> 
> My thinking is that using the number of quadwords keeps the numbers
> smaller. But, if people are mostly going to want to think about vector
> lengths in terms of bits, like the specification does, then maybe we
> should just let the numbers be bigger: [ 128, 256, 512 ]
> 
> > 
> > For kvmtool I went with quadwords on the command line, but only as a
> > quick hack to simplify the parser slightly.
> > 
> > OTOH, specifying 1,2,4 on the command line is clearly less annoying and
> > error-prone than 16,32,64.
> > 
> > Naming the option with "vq" instead of "vl" is another option, though
> > "vq" is Linux terminology not endorsed by the architecture.
> 
> I think VL is OK as long we document the unit.

As you wish (and that's basically where I ended up for now with kvmtool).

> > 
> > For kvmtool I've considered a range / filtering syntax, but I didn't
> > implement it yet.
> 
> I think we want each VL to be explicitly listed on the command line
> for the compatibility issue described above. On one host the range
> [1,4] can be 

Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Andrew Jones
On Thu, Apr 18, 2019 at 11:52:04AM +0100, Dave Martin wrote:
> On Thu, Apr 18, 2019 at 10:46:34AM +0100, Andrew Jones wrote:
> > On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > > Hi all,
> > > 
> > > First some background:
> > > 
> > > For the userspace side of AArch64 guest SVE support we need to
> > > expose KVM's allowed vector lengths bitmap to the user and allow
> > > the user to choose a subset of that bitmap. Since bitmaps are a
> > > bit awkward to work with then we'll likely want to expose it as
> > > an array of vector lengths instead. Also, assuming we want to
> > > expose the lengths as number-of-quadwords (quadword == 128 bits
> > > for AArch64 and vector lengths must be multiples of quadwords)
> > > rather than number-of-bits, then an example array (which will
> > > always be a sequence) might be
> > > 
> > >  [ 8, 16, 32 ]
> > > 
> > > The user may choose a subsequence, but only through truncation,
> > > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > > 
> > > Furthermore, different hosts may support different sequences
> > > which have the same maximum. For example, if the above sequence
> > > is for Host_A, then Host_B could be
> > > 
> > >  [ 8, 16, 24, 32 ]
> > 
> > It doesn't really matter for this discussion, but I just realized
> > that I picked bogus numbers for these examples. 32 would be too
> > big. The largest supported is 16. I probably should have just used
> > the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
> > vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.
> 
> I'd argue differently from the ABI perspective.
> 
> If the host supports vq = [ 1,2,3,4 ], then it is entirely valid to ask
> for [ 1,2,4 ].  KVM will fail the KVM_REG_ARM64_SVE_VLS write with
> EINVAL, but I don't distinguish between a set that is not satisfiable on
> this hardware and a set that is not valid at all.  The kernel basically
> doesn't check for the latter: an architecturally invalid set will always
> not be satisfiable on the hardware.

I agree that 1,2,4 should be a valid set, but how do we avoid the user
attempting to select it on a platform that supports 1,2,3,4 now? Until
the hardware and KVM will allow it, then I don't think we should try
to "support" it in any way. Maybe we should name the property such that
it's clear we need to use truncation when constructing a subset now.
This would allow us to add another, more generally named, property later
when we can select nearly arbitrary subsets.

> 
> Ideally, userspace should not preempt this decision, in case the
> architecture becomes more flexible someday in what it can virtualise.
> 
> > > The host must support all lengths in the sequence, which means
> > > that while Host_A supports 32, since it doesn't support 24 and
> > > we can only truncate sequences, we must use either [ 8 ] or
> > > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > > between the hosts.
> > > 
> > > Now to the $SUBJECT question:
> > > 
> > > My feeling is that we should require the sequence to be
> > > provided on the command line as a cpu property. Something
> > > like
> > > 
> > >   -cpu host,sve-vl-list=8:16
> 
> I can't decide whether it's more or less user-friendly to denote VL in
> terms of bytes in this kind of context.

I'm not sure either. Switching to my second take at quadwords this should
have been '1:2'. In bytes [ 1, 2 ] would be '16:32'.

> 
> Usually when I say "VL" in the kernel ABI I try to mean this.
> (KVM_REG_ARM64_SVE_VLS is a special case: here the lengths are fancily
> encoded rather than being passed as integers, so the precise unit used
> is a more abstract concept here ... or anyway, that's my excuse.
> _SVE_VQS felt odd here.)

My thinking is that using the number of quadwords keeps the numbers
smaller. But, if people are mostly going to want to think about vector
lengths in terms of bits, like the specification does, then maybe we
should just let the numbers be bigger: [ 128, 256, 512 ]

> 
> For kvmtool I went with quadwords on the command line, but only as a
> quick hack to simplify the parser slightly.
> 
> OTOH, specifying 1,2,4 on the command line is clearly less annoying and
> error-prone than 16,32,64.
> 
> Naming the option with "vq" instead of "vl" is another option, though
> "vq" is Linux terminology not endorsed by the architecture.

I think VL is OK as long we document the unit.

> 
> For kvmtool I've considered a range / filtering syntax, but I didn't
> implement it yet.

I think we want each VL to be explicitly listed on the command line
for the compatibility issue described above. On one host the range
[1,4] can be different than the range [1,4] on anther host, depending
on whether '3' is in there. And syntax like 1-4:-3 would be overly
complicated, IMO. So I'm inclined to just require all of them to be
listed, but of course order wouldn't matter.

Thanks,
drew



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Daniel P . Berrangé
On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> Hi all,
> 
> First some background:
> 
> For the userspace side of AArch64 guest SVE support we need to
> expose KVM's allowed vector lengths bitmap to the user and allow
> the user to choose a subset of that bitmap. Since bitmaps are a
> bit awkward to work with then we'll likely want to expose it as
> an array of vector lengths instead. Also, assuming we want to
> expose the lengths as number-of-quadwords (quadword == 128 bits
> for AArch64 and vector lengths must be multiples of quadwords)
> rather than number-of-bits, then an example array (which will
> always be a sequence) might be
> 
>  [ 8, 16, 32 ]
> 
> The user may choose a subsequence, but only through truncation,
> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> 
> Furthermore, different hosts may support different sequences
> which have the same maximum. For example, if the above sequence
> is for Host_A, then Host_B could be
> 
>  [ 8, 16, 24, 32 ]
> 
> The host must support all lengths in the sequence, which means
> that while Host_A supports 32, since it doesn't support 24 and
> we can only truncate sequences, we must use either [ 8 ] or
> [ 8, 16 ] for a compatible sequence if we intend to migrate
> between the hosts.
> 
> Now to the $SUBJECT question:
> 
> My feeling is that we should require the sequence to be
> provided on the command line as a cpu property. Something
> like
> 
>   -cpu host,sve-vl-list=8:16
> 
> (I chose ':' for the delimiter because ',' can't work, but
> if there's a better choice, then that's fine by me.)
> 
> Afaict a property list like this will require a new parser,
> which feels a bit funny since it seems we should already
> have support for this type of thing somewhere in QEMU. So,
> the question is: do we? I see we have array properties, but
> I don't believe that works with the command line. Should we
> only use QMP for this? We already want some QMP in order to
> query the supported vector lengths. Maybe we should use QMP
> to set the selection too? But then what about command line
> support for developers? And if the property is on the command
> line then we don't have to add it to the migration stream.

You should be able to use arrays from the CLI with QemuOpts by repeating
the same option name many times, though I can't say it is a very
nice approach if you have many values to list as it gets very repetative.
That's the curse of not having a good CLI syntax for non-scalar data in
QemuOpts & why Markus believes we should switch to JSON for the CLI too

 -cpu host,sve-vl=8,sve-vl=16


Regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Dave Martin
On Thu, Apr 18, 2019 at 10:46:34AM +0100, Andrew Jones wrote:
> On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> > Hi all,
> > 
> > First some background:
> > 
> > For the userspace side of AArch64 guest SVE support we need to
> > expose KVM's allowed vector lengths bitmap to the user and allow
> > the user to choose a subset of that bitmap. Since bitmaps are a
> > bit awkward to work with then we'll likely want to expose it as
> > an array of vector lengths instead. Also, assuming we want to
> > expose the lengths as number-of-quadwords (quadword == 128 bits
> > for AArch64 and vector lengths must be multiples of quadwords)
> > rather than number-of-bits, then an example array (which will
> > always be a sequence) might be
> > 
> >  [ 8, 16, 32 ]
> > 
> > The user may choose a subsequence, but only through truncation,
> > i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> > 
> > Furthermore, different hosts may support different sequences
> > which have the same maximum. For example, if the above sequence
> > is for Host_A, then Host_B could be
> > 
> >  [ 8, 16, 24, 32 ]
> 
> It doesn't really matter for this discussion, but I just realized
> that I picked bogus numbers for these examples. 32 would be too
> big. The largest supported is 16. I probably should have just used
> the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
> vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.

I'd argue differently from the ABI perspective.

If the host supports vq = [ 1,2,3,4 ], then it is entirely valid to ask
for [ 1,2,4 ].  KVM will fail the KVM_REG_ARM64_SVE_VLS write with
EINVAL, but I don't distinguish between a set that is not satisfiable on
this hardware and a set that is not valid at all.  The kernel basically
doesn't check for the latter: an architecturally invalid set will always
not be satisfiable on the hardware.

Ideally, userspace should not preempt this decision, in case the
architecture becomes more flexible someday in what it can virtualise.

> > The host must support all lengths in the sequence, which means
> > that while Host_A supports 32, since it doesn't support 24 and
> > we can only truncate sequences, we must use either [ 8 ] or
> > [ 8, 16 ] for a compatible sequence if we intend to migrate
> > between the hosts.
> > 
> > Now to the $SUBJECT question:
> > 
> > My feeling is that we should require the sequence to be
> > provided on the command line as a cpu property. Something
> > like
> > 
> >   -cpu host,sve-vl-list=8:16

I can't decide whether it's more or less user-friendly to denote VL in
terms of bytes in this kind of context.

Usually when I say "VL" in the kernel ABI I try to mean this.
(KVM_REG_ARM64_SVE_VLS is a special case: here the lengths are fancily
encoded rather than being passed as integers, so the precise unit used
is a more abstract concept here ... or anyway, that's my excuse.
_SVE_VQS felt odd here.)

For kvmtool I went with quadwords on the command line, but only as a
quick hack to simplify the parser slightly.

OTOH, specifying 1,2,4 on the command line is clearly less annoying and
error-prone than 16,32,64.

Naming the option with "vq" instead of "vl" is another option, though
"vq" is Linux terminology not endorsed by the architecture.

For kvmtool I've considered a range / filtering syntax, but I didn't
implement it yet.

[...]

Cheers
---Dave



Re: [Qemu-devel] How do we do user input bitmap properties?

2019-04-18 Thread Andrew Jones
On Thu, Apr 18, 2019 at 11:28:41AM +0200, Andrew Jones wrote:
> Hi all,
> 
> First some background:
> 
> For the userspace side of AArch64 guest SVE support we need to
> expose KVM's allowed vector lengths bitmap to the user and allow
> the user to choose a subset of that bitmap. Since bitmaps are a
> bit awkward to work with then we'll likely want to expose it as
> an array of vector lengths instead. Also, assuming we want to
> expose the lengths as number-of-quadwords (quadword == 128 bits
> for AArch64 and vector lengths must be multiples of quadwords)
> rather than number-of-bits, then an example array (which will
> always be a sequence) might be
> 
>  [ 8, 16, 32 ]
> 
> The user may choose a subsequence, but only through truncation,
> i.e. [ 8, 32 ] is not valid, but [ 8, 16 ] is.
> 
> Furthermore, different hosts may support different sequences
> which have the same maximum. For example, if the above sequence
> is for Host_A, then Host_B could be
> 
>  [ 8, 16, 24, 32 ]

It doesn't really matter for this discussion, but I just realized
that I picked bogus numbers for these examples. 32 would be too
big. The largest supported is 16. I probably should have just used
the simple [ 1, 2, 4 ] and [ 1, 2, 3, 4 ] arrays, corresponding to
vector lengths (in bits) 128, 256, 512 and 128, 256, 384, 512.

> 
> The host must support all lengths in the sequence, which means
> that while Host_A supports 32, since it doesn't support 24 and
> we can only truncate sequences, we must use either [ 8 ] or
> [ 8, 16 ] for a compatible sequence if we intend to migrate
> between the hosts.
> 
> Now to the $SUBJECT question:
> 
> My feeling is that we should require the sequence to be
> provided on the command line as a cpu property. Something
> like
> 
>   -cpu host,sve-vl-list=8:16
> 
> (I chose ':' for the delimiter because ',' can't work, but
> if there's a better choice, then that's fine by me.)
> 
> Afaict a property list like this will require a new parser,
> which feels a bit funny since it seems we should already
> have support for this type of thing somewhere in QEMU. So,
> the question is: do we? I see we have array properties, but
> I don't believe that works with the command line. Should we
> only use QMP for this? We already want some QMP in order to
> query the supported vector lengths. Maybe we should use QMP
> to set the selection too? But then what about command line
> support for developers? And if the property is on the command
> line then we don't have to add it to the migration stream.
> 
> Thanks,
> drew