
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