在 2018/8/22 下午6:09, Andrea Bolognani 写道:
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.
And then, zpci address instance could be a member of pci address structure?
I mean not using pointer at all?