[libvirt] [PATCH 2/2] qemu: Don't fail if the SCSI host device is shareable between domains

Osier Yang jyang at redhat.com
Tue Jan 7 11:17:18 UTC 2014


On 06/01/14 23:54, John Ferlan wrote:
>
> On 01/02/2014 09:45 AM, Osier Yang wrote:
>> It doesn't make sense to fail if the SCSI host device is specified
>> as "shareable" explicitly between domains (NB, it works if and only
>> if the device is specified as "shareable" for *all* domains,
>> otherwise it fails).
>>
>> Also don't try to add the device to the activeScsiHostdevs list if
>> it's already there.
>> ---
>>   src/qemu/qemu_hostdev.c | 33 ++++++++++++++++++---------------
>>   1 file changed, 18 insertions(+), 15 deletions(-)
>>
>> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
>> index 86a463a..8536499 100644
>> --- a/src/qemu/qemu_hostdev.c
>> +++ b/src/qemu/qemu_hostdev.c
>> @@ -1120,22 +1120,25 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,
>>           if ((tmp = virSCSIDeviceListFind(driver->activeScsiHostdevs, scsi))) {
>>               const char *other_name = virSCSIDeviceGetUsedBy(tmp);
>>   
>> -            if (other_name)
>> -                virReportError(VIR_ERR_OPERATION_INVALID,
>> -                               _("SCSI device %s is in use by domain %s"),
>> -                               virSCSIDeviceGetName(tmp), other_name);
>> -            else
>> -                virReportError(VIR_ERR_OPERATION_INVALID,
>> -                               _("SCSI device %s is already in use"),
>> -                               virSCSIDeviceGetName(tmp));
>> -            goto error;
>> -        }
>> -
>> -        virSCSIDeviceSetUsedBy(scsi, name);
>> -        VIR_DEBUG("Adding %s to activeScsiHostdevs", virSCSIDeviceGetName(scsi));
>> +            if (!(virSCSIDeviceGetShareable(scsi) &&
>> +                  virSCSIDeviceGetShareable(tmp))) {
>> +                if (other_name)
>> +                    virReportError(VIR_ERR_OPERATION_INVALID,
>> +                                   _("SCSI device %s is in use by domain %s"),
>> +                                   virSCSIDeviceGetName(tmp), other_name);
>> +                else
>> +                    virReportError(VIR_ERR_OPERATION_INVALID,
>> +                                   _("SCSI device %s is already in use"),
>> +                                   virSCSIDeviceGetName(tmp));
>> +                goto error;
>> +            }
>> +        } else {
>> +            virSCSIDeviceSetUsedBy(scsi, name);
>> +            VIR_DEBUG("Adding %s to activeScsiHostdevs", virSCSIDeviceGetName(scsi));
>>   
>> -        if (virSCSIDeviceListAdd(driver->activeScsiHostdevs, scsi) < 0)
>> -            goto error;
>> +            if (virSCSIDeviceListAdd(driver->activeScsiHostdevs, scsi) < 0)
>> +                goto error;
>> +        }
>
> Something doesn't feel right here...
>
> Prior code:
>
> if find device on some other drivers active list
>      fail
> set name of who device is used by
> add device to host active list
>    (NOTE: will error if found on list already)
>
>
> New code
>
> if find device on some other drivers active list
>      if both devices not marked shareable
>          fail
> else
>      set name of who device is used by
>      add device to host active list
>
>
> So now theoretically with a shareable device, the device could be on the
> active list and it's OK to use it because it's marked shareable.

Yes, as long as the later domain(s) specify the device as shareable
too.

>
> So my question/issue becomes what to do with the "dev->used_by" (eg,
> virSCSIDeviceSetUsedBy() result) value.  In fact, since we're now
> shareable it seems to me that we'd need to keep this up to date even
> going so far as to clear usage it when virSCSIDeviceListDel() is called.
> Should the list become a "list" of those using it?

/Alarm....

Yes, thanks for pointing it out...

> The first domain
> that claims usage could eventually remove their usage, then what? It
> would be strange to report domain X has the device in use if the domain
> is down or doesn't exist.

It actually won't report error. Since the "dev->used_by" is freed
along with the domain destroying. E.g.

% start domain A with sg7 as shareable.

% start domain B with sg7 as shareable

% Destroy domain A

% start domain C with sg7 as non-shareable.

Starting Domain C is expected to fail, but it will succeed.

I will post the v2.

>   Use cscope and check the callers/users of
> "used_by" to see what my concern is.
>
> Remember prior to this point in time we cannot share, so it didn't
> matter. However, from this point on since we can share we need to keep
> track of who has it, right?  What becomes even more interesting perhaps
> is the impact on migration (if that's even possible with a shared hostdev).

It should be fine for migration, as long as we make the "used_by"
correct.

Regards,
Osier





More information about the libvir-list mailing list