[Libvir] Re: Virtual CPU functions

Daniel Veillard veillard at redhat.com
Tue Aug 1 19:29:58 UTC 2006


On Tue, Aug 01, 2006 at 07:05:49PM +0200, Philippe Berthault wrote:
>>unsigned char *cpuMaps[]; /* 1st dimension = per virtual cpu, 2nd
>>dimension = per physical cpu */
...
> >>virDomainGetVcpus(pDomain, pVcpuInfos, domInfo.nrVirtCpu, cpuMaps, 
> >>oneCpuMapLen);
> >>for (vcpu = 0; vcpu < domInfo.nrVirtCpu; vcpu++) {
> >>   for (cpu = 0; cpu < nbPhysCpus; cpu++) {
> >>       int byteCpu = cpu / 8;
> >>       int bitCpu = cpu % 8;
> >>       int mask = 1 >> bitCpu; /* lowest CPU number is least 
> >>significant bit as M.Ponceau said */
> >>    
> >
> >  
> >>       int cpuUsable = cpuMaps[vcpu][byteCpu] & mask;
> >>       ...
> >>       /* or */
> >>       int cpuUsable = CPU_USABLE(cpuMaps, vcpu, cpu);
> >>       ...
> >>    
> >
> >    both are wrong IMHO :-)
> >one need to compute the index based on domInfo.nrVirtCpu
> >
> >  
> I don't understand why you think both are wrong. The first 'for' loop 
> index is based on domInfo.nrVirtCpu.

  Just a C implem nitpick, but that can lead to interesting debugging
sessions (I think I got beaten by that a couple of time).
  Nowhere the compiler can guess that you're accessing a 2 dimentional array
with a row of length domInfo.nrVirtCpu, it's a one dimension array so I
think cpuMaps[vcpu][byteCpu] is equivalent to cpuMaps[vcpu + byteCpu] there
and unless I misunderstood both case that won't work as expected. This is
also why I suggested a macro this can of code is easy to get wrong.

Daniel

-- 
Daniel Veillard      | Red Hat http://redhat.com/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/




More information about the libvir-list mailing list