On Wed, 2018-08-22 at 17:39 +0800, Yi Min Zhao wrote:
在 2018/8/21 下午9:19, Andrea Bolognani 写道:
> On Tue, 2018-08-21 at 19:55 +0800, Yi Min Zhao wrote:
> > > > For zPCI address, if we use the same strategy as PCI part and user
> > > > wants to assign fid=0 to the specific device, he might encounter
> > > > assignment failure. At least, according to the doc, 0 shoud be a
valid
> > > > value to assign to fid.
> > >
> > > If the user wants to use a specific zPCI address they can simply
> > > specify both attributes, eg. uid=1,fid=0 will work just fine with
> > > the proposed approach and won't produce errors or cause a new zPCI
> > > address to be automatically assigned.
> > >
> > > If the user only specified fid=0 while leaving uid unspecified,
> > > well, an address is going to be picked for them.
> >
> > This would be an empty zpci address while parsing XML so that we might
> > pick a zpci address with non-zero fid. For example:
> >
> > dev1: fid=0 (this address would be treated as an unassigned zpci address)
> > dev2 (no definition for both fid and uid)
> >
> > Then the process of assigning addresses will iterate devices as type by
> > type.
> > If dev2 is processed before dev1, dev2's fid would be assigned by 0.
> > This causes
> > dev1's fid=1. The result doesn't match what the user wants.
>
> This would be the same as specifying a partial PCI address such as
>
> <address type='pci' slot='0x00'/>
>
> and getting an address with slot != 0x00 back: surprising, perhaps,
> but that's the way it's been with PCI addresses forever so you can
> assume users are familiar with it by now.
>
> For zPCI addresses to be inconsistent with this behavior would be
> utterly confusing; moreover, if the user really needs the uid and
> fid to have certain values, all they have to do is specify both
> and libvirt will not attempt to override them.
I tried as your idea. It makes everything complicated, especially
alloc/reserve/release
zpci address. If the user defines uid=1 and fid=0, we don't know whether
should
reserve fid. (uid=1 fid=0) is the same with (uid=1).
You should reserve it. The user can either
* not specify zPCI information at all: automatic assignment will
be performed, no error should be reported;
* specify a *full* zPCI address: manual assignment, will result
in either that exact address being used or an error;
* specify partial information: missing properties will default
to zero, which will probably cause errors eg. if only the uid
is specified for a bunch of devices.
The last option is less predictable so it should probably never be
used. All of the above is consistent with how the PCI part works.
--
Andrea Bolognani / Red Hat / Virtualization