[libvirt] [PATCH 6/8] Pass activeDevs and inactiveDevs to virPCIDeviceUnbindFromStub and virPCIDeviceBindToStub
Shivaprasad bhat
shivaprasadbhat at gmail.com
Mon Nov 2 04:28:20 UTC 2015
On Fri, Oct 30, 2015 at 9:13 PM, Andrea Bolognani <abologna at redhat.com> wrote:
> On Fri, 2015-10-30 at 05:00 +0530, Shivaprasad G Bhat wrote:
>> The inactiveDevs need to be selectively altered for more than one
>> device in case of vfio devices. So, pass the whole list.
>>
>> Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
>> ---
>> src/util/virpci.c | 38 +++++++++++++++++++++-----------------
>> 1 file changed, 21 insertions(+), 17 deletions(-)
>>
>> diff --git a/src/util/virpci.c b/src/util/virpci.c
>> index 2709ddd..6c24a81 100644
>> --- a/src/util/virpci.c
>> +++ b/src/util/virpci.c
>> @@ -1129,7 +1129,9 @@ static int virPCIDeviceReprobeHostDriver(virPCIDevicePtr dev, char *driver, char
>> }
>>
>> static int
>> -virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
>> +virPCIDeviceUnbindFromStub(virPCIDevicePtr dev,
>> + virPCIDeviceListPtr activeDevs ATTRIBUTE_UNUSED,
>> + virPCIDeviceListPtr inactiveDevs)
>> {
>> int result = -1;
>> char *drvdir = NULL;
>> @@ -1177,6 +1179,9 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
>> reprobe:
>> if (virPCIDeviceReprobeHostDriver(dev, driver, drvdir) < 0)
>> goto cleanup;
>> + /* Steal the dev from list inactiveDevs */
>> + if (inactiveDevs)
>> + virPCIDeviceListDel(inactiveDevs, dev);
>>
>> result = 0;
>>
>> @@ -1195,7 +1200,9 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
>>
>> static int
>> virPCIDeviceBindToStub(virPCIDevicePtr dev,
>> - const char *stubDriverName)
>> + const char *stubDriverName,
>> + virPCIDeviceListPtr activeDevs,
>> + virPCIDeviceListPtr inactiveDevs)
>> {
>> int result = -1;
>> bool reprobe = false;
>> @@ -1317,6 +1324,14 @@ virPCIDeviceBindToStub(virPCIDevicePtr dev,
>> goto cleanup;
>> }
>>
>> + /* Add *a copy of* the dev into list inactiveDevs, if
>> + * it's not already there.
>> + */
>
> Just close the comment in the previous line.
>
>> + if (inactiveDevs && !virPCIDeviceListFind(inactiveDevs, dev) &&
>> + virPCIDeviceListAddCopy(inactiveDevs, dev) < 0) {
>
> Really weird alignment here...
>
>> + result = -1;
>> + }
>> +
>> cleanup:
>> VIR_FREE(stubDriverPath);
>> VIR_FREE(driverLink);
>> @@ -1324,7 +1339,7 @@ virPCIDeviceBindToStub(virPCIDevicePtr dev,
>>
>> if (result < 0) {
>> VIR_FREE(newDriverName);
>> - virPCIDeviceUnbindFromStub(dev);
>> + virPCIDeviceUnbindFromStub(dev, activeDevs, NULL);
>
> Why pass NULL instead of inactiveDevs here?
>
Correct. Will Pass the inactiveDevs. The devices are removed from
inactiveDevs before coming here. We need to restore if going on
error path.
>
>> } else {
>> VIR_FREE(dev->stubDriver);
>> dev->stubDriver = newDriverName;
>> @@ -1371,16 +1386,9 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
>> return -1;
>> }
>>
>> - if (virPCIDeviceBindToStub(dev, dev->stubDriver) < 0)
>> - return -1;
>> -
>> - /* Add *a copy of* the dev into list inactiveDevs, if
>> - * it's not already there.
>> - */
>> - if (inactiveDevs && !virPCIDeviceListFind(inactiveDevs, dev) &&
>> - virPCIDeviceListAddCopy(inactiveDevs, dev) < 0) {
>> + if (virPCIDeviceBindToStub(dev, dev->stubDriver,
>> + activeDevs, inactiveDevs) < 0)
>> return -1;
>> - }
>>
>> return 0;
>> }
>> @@ -1396,13 +1404,9 @@ virPCIDeviceReattach(virPCIDevicePtr dev,
>> return -1;
>> }
>>
>> - if (virPCIDeviceUnbindFromStub(dev) < 0)
>> + if (virPCIDeviceUnbindFromStub(dev, activeDevs, inactiveDevs) < 0)
>> return -1;
>>
>> - /* Steal the dev from list inactiveDevs */
>> - if (inactiveDevs)
>> - virPCIDeviceListDel(inactiveDevs, dev);
>> -
>> return 0;
>> }
>
> Cheers.
>
> --
> Andrea Bolognani
> Software Engineer - Virtualization Team
More information about the libvir-list
mailing list