[libvirt] [PATCH] qemu: Allow cpu pinning for all logical CPUs, not just physical

Cole Robinson crobinso at redhat.com
Fri Nov 6 15:13:56 UTC 2009


On 11/06/2009 05:27 AM, Daniel Veillard wrote:
> On Thu, Nov 05, 2009 at 01:04:27PM -0500, Cole Robinson wrote:
>> This is what virsh already expects when printing output, and what
>> 'man cpuset' claims to support.
>>
>> Signed-off-by: Cole Robinson <crobinso at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c |   23 +++++++++++++----------
>>  1 files changed, 13 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 1f3a0e4..5463951 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -1222,7 +1222,7 @@ qemudInitCpus(virConnectPtr conn,
>>                const char *migrateFrom) {
>>  #if HAVE_SCHED_GETAFFINITY
>>      cpu_set_t mask;
>> -    int i, maxcpu = QEMUD_CPUMASK_LEN;
>> +    int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
>>      virNodeInfo nodeinfo;
>>  
>>      if (nodeGetInfo(conn, &nodeinfo) < 0)
>> @@ -1230,8 +1230,9 @@ qemudInitCpus(virConnectPtr conn,
>>  
>>      /* setaffinity fails if you set bits for CPUs which
>>       * aren't present, so we have to limit ourselves */
>> -    if (maxcpu > nodeinfo.cpus)
>> -        maxcpu = nodeinfo.cpus;
>> +    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
>> +    if (maxcpu > hostcpus)
>> +        maxcpu = hostcpus;
>>  
>>      CPU_ZERO(&mask);
>>      if (vm->def->cpumask) {
>> @@ -3339,7 +3340,7 @@ qemudDomainPinVcpu(virDomainPtr dom,
>>      struct qemud_driver *driver = dom->conn->privateData;
>>      virDomainObjPtr vm;
>>      cpu_set_t mask;
>> -    int i, maxcpu;
>> +    int i, maxcpu, hostcpus;
>>      virNodeInfo nodeinfo;
>>      int ret = -1;
>>  
>> @@ -3371,13 +3372,14 @@ qemudDomainPinVcpu(virDomainPtr dom,
>>      if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
>>          goto cleanup;
>>  
>> +    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
>>      maxcpu = maplen * 8;
>> -    if (maxcpu > nodeinfo.cpus)
>> -        maxcpu = nodeinfo.cpus;
>> +    if (maxcpu > hostcpus)
>> +        maxcpu = hostcpus;
>>  
>>      CPU_ZERO(&mask);
>>      for (i = 0 ; i < maxcpu ; i++) {
>> -        if ((cpumap[i/8] >> (i % 8)) & 1)
>> +        if (VIR_CPU_USABLE(cpumap, maplen, 0, i))
>>              CPU_SET(i, &mask);
>>      }
>>  
>> @@ -3409,7 +3411,7 @@ qemudDomainGetVcpus(virDomainPtr dom,
>>      struct qemud_driver *driver = dom->conn->privateData;
>>      virDomainObjPtr vm;
>>      virNodeInfo nodeinfo;
>> -    int i, v, maxcpu;
>> +    int i, v, maxcpu, hostcpus;
>>      int ret = -1;
>>  
>>      qemuDriverLock(driver);
>> @@ -3434,9 +3436,10 @@ qemudDomainGetVcpus(virDomainPtr dom,
>>      if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
>>          goto cleanup;
>>  
>> +    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
>>      maxcpu = maplen * 8;
>> -    if (maxcpu > nodeinfo.cpus)
>> -        maxcpu = nodeinfo.cpus;
>> +    if (maxcpu > hostcpus)
>> +        maxcpu = hostcpus;
>>  
>>      /* Clamp to actual number of vcpus */
>>      if (maxinfo > vm->nvcpupids)
> 
>   ACK, 
> 
> Daniel
> 

Thanks, pushed now.

- Cole




More information about the libvir-list mailing list