[libvirt] [PATCH 2/4] qemu: Use same model when adding hostdev SCSI controller
Eric Farman
farman at linux.vnet.ibm.com
Wed Dec 13 23:51:40 UTC 2017
On 12/13/2017 02:39 PM, John Ferlan wrote:
>
>
> On 12/13/2017 10:43 AM, Eric Farman wrote:
>>
>>
>> On 12/06/2017 08:08 AM, John Ferlan wrote:
>>> When qemuDomainFindOrCreateSCSIDiskController adds a controller,
>>> let's use the same model as a currently found controller under the
>>> assumption that the reason to add the controller in hotplug is
>>> because virDomainHostdevAssignAddress determined that there were
>>> too many devices on the existing controller, but only assigned a
>>> new controller index and did not add a new controller and we
>>> desire to use the same controller model as any existing conroller
>>
>> s/conroller/controller
>>
>>> and not take a chance that qemuDomainSetSCSIControllerModel would
>>> use a default that may be incompatible.
>>>
>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>> ---
>>> src/qemu/qemu_hotplug.c | 14 ++++++++++----
>>> 1 file changed, 10 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>>> index 9317e134a..90d50e7b1 100644
>>> --- a/src/qemu/qemu_hotplug.c
>>> +++ b/src/qemu/qemu_hotplug.c
>>> @@ -587,6 +587,7 @@
>>> qemuDomainFindOrCreateSCSIDiskController(virQEMUDriverPtr driver,
>>> {
>>> size_t i;
>>> virDomainControllerDefPtr cont;
>>> + virDomainControllerModelSCSI model = -1;
>>>
>>> for (i = 0; i < vm->def->ncontrollers; i++) {
>>> cont = vm->def->controllers[i];
>>> @@ -596,6 +597,12 @@
>>> qemuDomainFindOrCreateSCSIDiskController(virQEMUDriverPtr driver,
>>>
>>> if (cont->idx == controller)
>>> return cont;
>>> +
>>> + /* Save off the model - if we end up creating a controller it's
>>> + * because the user didn't provide one and we need to
>>> automagically
>>> + * create one because the existing one is full - so let's be
>>> sure
>>> + * to keep the same model in that case. */
>>> + model = cont->model;
>>
>> Hrm... I'm missing something...
>>
>> This is confusing, because nothing in this loop tells us the controller
>> we find is full, just that we have a TYPE_SCSI controller and the index
>> isn't found. And if the index WAS found, we would've exited before this
>> line anyway so we don't know if it was full or not.
>
> Does this explanation help:
>
> /* Because virDomainHostdevAssignAddress called during
> * virDomainHostdevDefPostParse cannot add a new controller
> * it will assign a controller index to a controller that doesn't
> * exist leaving this code to perform the magic of adding the
> * controller. Because that code would be attempting to add a
> * SCSI disk to an existing controller, let's save off the model
> * of the "last" SCSI controller we find so that if we end up
> * creating a controller below it uses the same controller model. */
>
Yeah, that helps considerably.
> The magic key is in patch 4 where it's noted that for
> virDomainHostdevAssignAddress we need to assign a controller index to an
> <address> element where the controller itself doesn't yet exist.
I never got that far. :( But with the above clarification, consider
this patch
Reviewed-by: Eric Farman <farman at linux.vnet.ibm.com>
>
>>
>> Nothing in a <hostdev> tag says what type of controller we want, so what
>> happens when controller[1] is virtio-scsi, and controller[2] is LSI?
>> This will create a second LSI controller which wouldn't help if we're
>> hotplugging another virtio-scsi device and controller[1] was full. (Is
>> mixing SCSI controller types common? I don't know, I stay in a little
>> virtio-scsi playpen.)
>
> Yes, true, and that I think ends up being the perhaps unavoidable tragic
> flaw because after all how do you really know which model to use? I'm
> not opposed to adding that truth to the comment, but wording it could be
> a bit tricky...
>
> Ironically I do have patches that would "prefer" virtio-scsi for hostdev
> paths that I considered adding to this series, but wasn't sure it'd be
> accepted. Something that I'm reconsidering now that I've read Michal's
> patch on qemu-devel:
>
> http://lists.nongnu.org/archive/html/qemu-devel/2017-12/msg01125.html
>
> I also have another patch that would prefer virtio-scsi as the default
> for new SCSI controllers by swapping the QEMU_CAPS_VIRTIO_SCSI and
> QEMU_CAPS_SCSI_LSI if logic in qemuDomainSetSCSIControllerModel in the }
> else { condition. That way we'd choose virtio-scsi over lsi if it
> exists (at least for non pseries).
That is certainly interesting, though I get worried when defaults change
since I don't understand the other options. In my environment, only
"auto" and "virtio-scsi" will boot as type=scsi controllers. Everything
else gives me some variation of an invalid configuration message. But
that doesn't mean that's the case for other setups.
>
> That conceivably would make this patch unnecessary other than this patch
> would force the model value for the controller to be filled in rather
> than it being empty (e.g. -1) and then allowing the default code to take
> over. That's a different can of worms, but the answer to that is in one
> of your follow-up questions.
>
> Of course for the consumer that's being smart ;-) they would create
> enough virtio-scsi controllers for the number of SCSI LUN's they are
> adding and none of this matters.
Oh my guest configs ALWAYS have a controller tag. Definitely. I
totally never forget to add one. :-)
>
>>
>> And I'm still trying to figure out how qemuDomainSetSCSIControllerModel
>> plays into this and other codepaths.
>>
>
> It's awful... If a controller model isn't provided, then we need to
> determine some value so that we create the correct command line. The
> code doesn't really change or set the default in the domain XML, just in
> the temporary @model variable used to generate the command line.
>
> Ironically I have another series posted regarding moving controller
> validation out of command line processing and into domain def validation
> processing. One of the patches there, Jan I believe asked why not set
> the model in post parse processing. Quite honestly I'm not sure, but I'm
> making a supposition based on a few years working on the project and
> that historically changing defaults or attempting to set some sort of
> policy has been a bit of an uphill battle. So for this series, I just
> took the path of least resistance.
>
> Now, I'm not opposed to setting the model in PostParse processing as
> long as we set it "smartly", but how do you do that without knowledge of
> the consumers intentions (or perhaps lack of knowledge).
Agreed. I can foresee host devices going to wrong controllers because
of copy/paste errors, so trying to provide educated guesses in a
scenario where the controller is auto-generated would be equally tough.
>
> If we set during post parse processing, then we've set model policy
> going forward for the future for the domain since we'll save the value
> in the permanent/config file. This is opposed to perhaps allowing the
> future be able to "choose" the default that is the "most recent" and
> perhaps a better selection. Once we set/save it though - we're stuck
> with it. I'm not going to make *that* decision alone!
>
>> Sorry, just sending my questions because this code is more fresh in your
>> mind than my own.
>>
>
> Good thing you asked this close to working on the code; my short term
> memory seems to fade faster each day ;-)
>
> And sorry for the long winded response - it's a be careful for what you ask!
No, I appreciate the insight! I saw your vhost-scsi series this morning
and thought I'd take that opportunity. I didn't see this series until
your ping, so opted to follow this trail for a while too. Will pick up
on other patches later methinks.
- Eric
>
>
>>
>>> }
>>>
>>> /* No SCSI controller present, for backward compatibility we
>>> @@ -604,11 +611,10 @@
>>> qemuDomainFindOrCreateSCSIDiskController(virQEMUDriverPtr driver,
>>> return NULL;
>>> cont->type = VIR_DOMAIN_CONTROLLER_TYPE_SCSI;
>>> cont->idx = controller;
>>> - cont->model = -1;
>>> + cont->model = model;
>>>
>>> - VIR_INFO("No SCSI controller present, hotplugging one");
>>> - if (qemuDomainAttachControllerDevice(driver,
>>> - vm, cont) < 0) {
>>> + VIR_INFO("No SCSI controller present, hotplugging one model=%d",
>>> model);
>>
>> Seems like a good use for
>> virDomainControllerModelSCSITypeToString(model) perhaps?
>>
>
> That could be done too...
>
> Tks -
>
> John
>
>>> + if (qemuDomainAttachControllerDevice(driver, vm, cont) < 0) {
>>> VIR_FREE(cont);
>>> return NULL;
>>> }
>>>
>>
>
More information about the libvir-list
mailing list