[libvirt] [PATCH 1/2 v3] Fix virDomainChrDefParseTargetXML() to parse the target port if available

Michal Novotny minovotn at redhat.com
Mon Feb 21 09:13:27 UTC 2011


On 02/18/2011 05:49 PM, Eric Blake wrote:
> On 02/18/2011 07:11 AM, Michal Novotny wrote:
>> Hi,
>> this is the patch to fix the virDomainChrDefParseTargetXML() functionality
>> to parse the target port from XML if available. This is necessary for
>> multiple serial port support which is the second part of this patch.
>>
>> Michal
>>
>> Signed-off-by: Michal Novotny<minovotn at redhat.com>
>> ---
>>   src/conf/domain_conf.c |    7 +++++--
>>   1 files changed, 5 insertions(+), 2 deletions(-)
>> @@ -5566,7 +5568,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>>           if (!chr)
>>               goto error;
>>
>> -        chr->target.port = i;
>> +        if (chr->target.port<  0)
>> +            chr->target.port = i;
>>           def->serials[def->nserials++] = chr;
> I think this fails to reject collisions, if two<serial>  devices request
> the same port number.
>
> Also, I think it mis-handles the case where things are interleaved out
> of order:
>
> <devices>
>    <serial type='dev'>
>      <source .../>
>      <target port='1'/>
>    </serial>
>    <serial type='dev'>
>      <source .../>
>      <target type='serial'/>
>    <serial/>
> </devices>
>
> The second serial device should default to the first available port
> number (0), but it looks like this patch will assign it to port 1 and
> cause a duplicate.


Well, if such definition should be valid then it may present the issue 
you stated above. Honestly I don't know why there was port attribute in 
the target node since with the code it was having it's unlikely it was 
used ever so I guess I should go through all the serial ports to check 
whether the target port is used or not starting from zero (first 
position as it's zero based). Like when you have:
  1. You have definition like target.port = 1 and another 2 definitions 
with target.port missing
  2. Create first device with target.port = 1
  3. Second serial port is missing target.port so start from 0 -> this 
is still free so assign target.port = 0
  4. Third serial port is missing target.port, again start from 0 -> 
both 0 and 1 are assigned so use next, i.e. target.port = 2

This way it should be working fine, right?


> Also, def->parallels shares virDomainDefParseXML, so it probably needs
> the same treatment.  That is, I think this side of the patch still needs
> a bit of work.


Ok, I was thinking that this kind of treatment may be necessary there 
for the future as well but currently I don't know whether any hypervisor 
supports multiple parallel ports. But I have to agree it's good to have 
this fixed the very same time like serial ports handling so I'll fix 
this as well.


> We've got other code in domain_conf.c that assigns ports
> to the first available slot; for example, look near line 5628 at how
> virtio-serial ports are assigned using maxport and traversal of all
> previously assigned ports.

Oh, thanks. I think that's basically similar to steps I wrote above 
since it's describing traversal lookup of all previously assigned ports 
as well but the solution in domain_conf.c may be better :) Also, I think 
there are no maxports constant identifying maximum number of serial 
ports to be available for the domain so I'll skip this one probably. I 
didn't have a look at the code yet so maybe maxports means something else.

Michal

-- 
Michal Novotny<minovotn at redhat.com>, RHCE
Virtualization Team (xen userspace), Red Hat




More information about the libvir-list mailing list