[libvirt] [PATCH 1/1] Assign spapr-vio address value to VIO devices without hardcode
Li Zhang
zhlcindy at linux.vnet.ibm.com
Fri May 18 06:05:53 UTC 2012
On 05/18/2012 06:41 AM, Eric Blake wrote:
> On 05/17/2012 12:16 AM, Li Zhang wrote:
>> Hardcode address will cause conflicts when there are a lot of VIO
>> devices.
>>
>> This patch is to remove the harcode of the address, and assign
>> a variable to it, which is cnt * 0x1000UL. And assign spapr-vio
>> address to VIO devices, such as spapr-vlan and spapr-vty. Several
>> test cases are modified.
>
>> /* Default values match QEMU. See spapr_(llan|vscsi|vty).c */
>>
>> for (i = 0 ; i< def->nnets; i++) {
>> - rc = qemuAssignSpaprVIOAddress(def,&def->nets[i]->info,
>> - 0x1000ul);
>
> Isn't the point of qemuAssignSpaprVIOAddress to start at 0x1000 and
> increment until it finds a gap? If so, then the caller shouldn't also
> be incrementing.
Yes, I didn't realize that. Sorry.
My way is to resolve the same problem with that.
Now it is not necessary to do this. :)
>
>> - if (rc)
>> - return rc;
>> + if (!def->nets[i]->model&&
>
> This says def->nets[i]->model is NULL...
>
>> + STREQ(def->os.arch, "ppc64")&&
>> + STREQ(def->os.machine, "pseries"))
>> + strcpy(def->nets[i]->model, "spapr-vlan");
>
> and this tells strcpy() to dereference it. You can't have possibly
> tested this line of code, since it will crash. Did you mean to do a
> strdup() instead?
Sorry for my stupid mistake. It needs to malloc memory to the string.
or use strdup() to do that.
>
>> + if (def->nets[i]->model&&
>> + STREQ(def->nets[i]->model, "spapr-vlan")) {
>> + cnt ++;
>
> Style nit - no spacing between ++ or -- operator and the variable it
> modifies.
Got it. Thanks for your comments.
>
>> + def->nets[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
>> + rc = qemuAssignSpaprVIOAddress(def,&def->nets[i]->info,
>> + cnt * 0x1000ul);
>
> Indentation is off.
>
>> + if (rc)
>> + return rc;
>> + }
>> +
>> }
>>
>> for (i = 0 ; i< def->ncontrollers; i++) {
>> @@ -797,19 +808,28 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def)
>> model = qemuDefaultScsiControllerModel(def);
>> if (model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI&&
>> def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
>> + cnt ++;
>> def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
>> rc = qemuAssignSpaprVIOAddress(def,&def->controllers[i]->info,
>> - 0x2000ul);
>> + cnt * 0x1000ul);
>
> About the only difference I can see is that if you skipped the first
> loop entirely, this would let the second loop start at 0x1000 instead of
> 0x2000. But again, since qemuAssignSpaprVIOAddress is supposed to
> auto-increment until it finds a gap, wouldn't that mean you can just
> change this to start at 0x1000 without needing 'cnt'?
>
You are right.
>> if (rc)
>> return rc;
>> }
>> }
>>
>> for (i = 0 ; i< def->nserials; i++) {
>> - rc = qemuAssignSpaprVIOAddress(def,&def->serials[i]->info,
>> - 0x30000000ul);
>> - if (rc)
>> - return rc;
>> + if (STREQ(def->os.arch, "ppc64")&&
>> + STREQ(def->os.machine, "pseries"))
>> + def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
>> +
>> + if (def->serials[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
>> + cnt ++;
>> + rc = qemuAssignSpaprVIOAddress(def,&def->serials[i]->info,
>> + cnt * 0x1000ul);
>
> This changes the default value from 0x30000000 to the first gap after
> 0x1000. Can you please justify this change by pointing to the qemu
> commit that shows how qemu assigns addresses, to make sure libvirt is
> picking the same defaults as qemu?
>
I will check this in Qemu. Thanks. :)
--
Best Regards
Li
IBM LTC, China System&Technology Lab, Beijing
More information about the libvir-list
mailing list