I update upstream code to c/s 20145. This patch works fine 
and I haven't meet this problem.
>>> Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx> 2010-3-19 
11:14 >>>
Hi James,
I tested xm vcpu-pin command with 
xen-unstable changeset 21044. 
The command failed as follows.  Also 
Time(s) values by xm vcpu-list 
command were strange.  The values were 
same in all VCPUs.
# xm 
vcpu-list
Name                                
ID  VCPU   CPU State   Time(s) CPU 
Affinity
Domain-0                             
0     0     1   
r--     116.5 any 
cpu
Domain-0                             
0     1     1   
r--     116.5 any cpu
# xm vcpu-pin Domain-0 0 
0
Error: Cannot pin vcpu: 0 to cpu: [0] - (22, 'Invalid argument')
Usage: 
xm vcpu-pin <Domain> <VCPU|all> <CPUs|all>
Set which 
CPUs a VCPU can use.
# xm 
vcpu-list
Name                                
ID  VCPU   CPU State   Time(s) CPU 
Affinity
Domain-0                             
0     0     1   
r--     117.0 any 
cpu
Domain-0                             
0     1     1   
r--     117.0 any cpu
I reverted changeset 21044 
and 21040, and then I tested xm vcpu-pin 
command again.  The command 
succeeded as follows. 
# xm 
vcpu-list
Name                                
ID  VCPU   CPU State   Time(s) CPU 
Affinity
Domain-0                             
0     0     0   
r--      60.8 any 
cpu
Domain-0                             
0     1     1   
-b-      42.8 any cpu
# xm vcpu-pin Domain-0 0 
0
# xm 
vcpu-list
Name                                
ID  VCPU   CPU State   Time(s) CPU 
Affinity
Domain-0                             
0     0     0   
r--      61.6 
0
Domain-0                             
0     1     1   
-b-      43.2 any cpu
Best 
regards,
Kan
Wed, 17 Mar 2010 20:41:22 -0700 (PDT), "James (song wei)" 
wrote:
>
>Keir, could you take a look at this issue.
>New 
Patch for this issue:
>Singed-off-by: James (Song Wei) 
<jsong@xxxxxxxxxx>
>
>diff -r 8b269215464b 
tools/libxc/xc_domain.c
>--- a/tools/libxc/xc_domain.cWed Mar 10 14:01:32 
2010 +0800
>+++ b/tools/libxc/xc_domain.cThu Mar 18 11:37:55 2010 
+0800
>@@ -105,23 +105,28 @@
> int xc_vcpu_setaffinity(int 
xc_handle,
>                         
uint32_t 
domid,
>                         
int 
vcpu,
>-                        
uint64_t 
cpumap)
>+                        
uint64_t *cpumap, int cpusize)
> {
>     
DECLARE_DOMCTL;
>     int ret = 
-1;
>-    uint8_t local[sizeof 
(cpumap)];
>+    uint8_t *local = malloc(cpusize); 
> 
>+    if(local == NULL)
>+    
{
>+        PERROR("Could not alloc 
memory for Xen hypercall");
>+        
goto out;
>+    }
>     
domctl.cmd = XEN_DOMCTL_setvcpuaffinity;
>     
domctl.domain = (domid_t)domid;
>     
domctl.u.vcpuaffinity.vcpu    = vcpu;
> 
>-    bitmap_64_to_byte(local, &cpumap, sizeof(cpumap) 
* 8);
>+    bitmap_64_to_byte(local, cpumap, cpusize * 
8);
> 
>     
set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local);
> 
>-    domctl.u.vcpuaffinity.cpumap.nr_cpus = 
sizeof(cpumap) * 8;
>+    
domctl.u.vcpuaffinity.cpumap.nr_cpus = cpusize * 
8;
>     
>-    if ( 
lock_pages(local, sizeof(local)) != 0 )
>+    if ( 
lock_pages(local, cpusize) != 0 )
>     
{
>         PERROR("Could not lock 
memory for Xen 
hypercall");
>         goto 
out;
>@@ -129,9 +134,10 @@
> 
>     ret = 
do_domctl(xc_handle, &domctl);
> 
>-    
unlock_pages(local, sizeof(local));
>+    
unlock_pages(local, cpusize);
> 
>  
out:
>+    free(local);
>     
return ret;
> }
> 
>@@ -139,18 +145,25 @@
> int 
xc_vcpu_getaffinity(int 
xc_handle,
>                         
uint32_t 
domid,
>                         
int 
vcpu,
>-                        
uint64_t 
*cpumap)
>+                        
uint64_t *cpumap, int cpusize)
> {
>     
DECLARE_DOMCTL;
>     int ret = 
-1;
>-    uint8_t local[sizeof 
(cpumap)];
>+    uint8_t * local = 
malloc(cpusize);
>+
>+    if(local == 
NULL)
>+    
{
>+        PERROR("Could not alloc 
memory for Xen hypercall");
>+        
goto out;
>+    }
> 
>     
domctl.cmd = XEN_DOMCTL_getvcpuaffinity;
>     
domctl.domain = (domid_t)domid;
>     
domctl.u.vcpuaffinity.vcpu = vcpu;
> 
>+
>     
set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, 
local);
>-    domctl.u.vcpuaffinity.cpumap.nr_cpus = 
sizeof(cpumap) * 8;
>+    
domctl.u.vcpuaffinity.cpumap.nr_cpus = cpusize * 
8;
>     
>     if ( 
lock_pages(local, sizeof(local)) != 0 )
>     
{
>@@ -161,8 +174,9 @@
>     ret = 
do_domctl(xc_handle, &domctl);
> 
>     
unlock_pages(local, sizeof (local));
>-    
bitmap_byte_to_64(cpumap, local, sizeof(local) * 8);
>- 
out:
>+    bitmap_byte_to_64(cpumap, local, cpusize * 
8);
>+out:
>+    
free(local);
>     return ret;
> }
> 
>diff -r 8b269215464b tools/libxc/xenctrl.h
>--- 
a/tools/libxc/xenctrl.hWed Mar 10 14:01:32 2010 +0800
>+++ 
b/tools/libxc/xenctrl.hThu Mar 18 11:37:55 2010 +0800
>@@ -310,11 +310,13 
@@
> int xc_vcpu_setaffinity(int 
xc_handle,
>                         
uint32_t 
domid,
>                         
int 
vcpu,
>-                        
uint64_t 
cpumap);
>+                        
uint64_t 
*cpumap,
>+                        
int cpusize);
> int xc_vcpu_getaffinity(int 
xc_handle,
>                         
uint32_t 
domid,
>                         
int 
vcpu,
>-                        
uint64_t 
*cpumap);
>+                        
uint64_t 
*cpumap,
>+                        
int cpusize);
> 
> /**
>  * This function will return 
information about one or more domains. It is
>diff -r 8b269215464b 
tools/python/xen/lowlevel/xc/xc.c
>--- 
a/tools/python/xen/lowlevel/xc/xc.cWed Mar 10 14:01:32 2010 +0800
>+++ 
b/tools/python/xen/lowlevel/xc/xc.cThu Mar 18 11:37:55 2010 +0800
>@@ 
-217,8 +217,12 @@
> {
>     uint32_t 
dom;
>     int vcpu = 0, i;
>-    
uint64_t  cpumap = ~0ULL;
>+    uint64_t  
*cpumap;
>     PyObject *cpulist = 
NULL;
>+    int nr_cpus, size;
>+    
xc_physinfo_t info; 
>+    xc_cpu_to_node_t 
map[1];
>+    uint64_t cpumap_size = sizeof(*cpumap); 
> 
>     static char *kwd_list[] = { "domid", 
"vcpu", "cpumap", NULL };
> 
>@@ -226,26 +230,38 
@@
>                                       
&dom, &vcpu, &cpulist) 
)
>         return NULL;
> 
>+    set_xen_guest_handle(info.cpu_to_node, 
map);
>+    info.max_cpu_id = 1;
>+    
if ( xc_physinfo(self->xc_handle, &info) != 0 
)
>+        return 
pyxc_error_to_exception();
>+  
>+    nr_cpus = 
info.nr_cpus;
>+
>+    size = (nr_cpus + cpumap_size 
* 8 - 1)/ (cpumap_size * 8);
>+    cpumap = 
malloc(cpumap_size * size);
>+    if(cpumap == 
NULL)
>+        return 
pyxc_error_to_exception();
>+
>     if ( 
(cpulist != NULL) && PyList_Check(cpulist) 
)
>     
{
>-        cpumap = 
0ULL;
>+        for ( i = 0; i < 
size; i++)
>+        
{
>+            
cpumap[i] = 0ULL;
>+        
}
>         for ( i = 0; i < 
PyList_Size(cpulist); i++ ) 
>         
{
>             
long cpu = PyInt_AsLong(PyList_GetItem(cpulist, 
i));
>-            
if ( cpu >= 64 
)
>-            
{
>-                
errno = 
EINVAL;
>-                
PyErr_SetFromErrno(xc_error_obj);
>-                
return 
NULL;
>-            
}
>-            
cpumap |= (uint64_t)1 << 
cpu;
>+            
cpumap[cpu / (cpumap_size * 8)] |= (uint64_t)1 << (cpu 
%
>(cpumap_size * 
8));
>         
}
>     }
>   
>-    if ( xc_vcpu_setaffinity(self->xc_handle, dom, 
vcpu, cpumap) != 0 )
>+    if ( 
xc_vcpu_setaffinity(self->xc_handle, dom, vcpu, cpumap, size 
*
>cpumap_size) != 0 )
>+    
{
>+        
free(cpumap);
>         return 
pyxc_error_to_exception();
>-    
>+    }
>     
Py_INCREF(zero);
>+    free(cpumap); 
>     return zero;
> }
> 
>@@ 
-365,7 +381,11 @@
>     uint32_t dom, vcpu = 
0;
>     xc_vcpuinfo_t 
info;
>     int rc, i;
>-    
uint64_t cpumap;
>+    uint64_t 
*cpumap;
>+    int nr_cpus, 
size;
>+    xc_physinfo_t pinfo = { 0 
};
>+    xc_cpu_to_node_t 
map[1];
>+    uint64_t cpumap_size = 
sizeof(*cpumap);
> 
>     static char 
*kwd_list[] = { "domid", "vcpu", NULL };
>     
>@@ -373,12 +393,25 
@@
>                                       
&dom, &vcpu) )
>         
return NULL;
> 
>+    
set_xen_guest_handle(pinfo.cpu_to_node, map);
>+    
pinfo.max_cpu_id = 1;
>+    if ( 
xc_physinfo(self->xc_handle, &pinfo) != 0 ) 
>+        return 
pyxc_error_to_exception();
>+    nr_cpus = 
pinfo.nr_cpus;
>     rc = 
xc_vcpu_getinfo(self->xc_handle, dom, vcpu, 
&info);
>     if ( rc < 0 
)
>         return 
pyxc_error_to_exception();
>-    rc = 
xc_vcpu_getaffinity(self->xc_handle, dom, vcpu, 
&cpumap);
>+    size = (nr_cpus + cpumap_size * 8 - 1)/ 
(cpumap_size * 8); 
>+
>+    if((cpumap = 
malloc(cpumap_size * size)) == 
NULL)
>+        return 
pyxc_error_to_exception(); 
>+
>+    rc = 
xc_vcpu_getaffinity(self->xc_handle, dom, vcpu, cpumap,
>cpumap_size * 
size);
>     if ( rc < 0 
)
>+    
{
>+        
free(cpumap);
>         return 
pyxc_error_to_exception();
>+    }
> 
>     info_dict = 
Py_BuildValue("{s:i,s:i,s:i,s:L,s:i}",
>                               
"online",   info.online,
>@@ -386,19 +419,19 
@@
>                               
"running",  
info.running,
>                               
"cpu_time", 
info.cpu_time,
>                               
"cpu",      
info.cpu);
>-
>     cpulist = 
PyList_New(0);
>-    for ( i = 0; cpumap != 0; i++ 
)
>+    for ( i = 0; i < nr_cpus; i++ 
)
>     
{
>-        if ( cpumap & 1 ) 
{
>+        if (*(cpumap + i / 
(cpumap_size * 8)) & 1 ) 
{
>             
PyObject *pyint = 
PyInt_FromLong(i);
>             
PyList_Append(cpulist, 
pyint);
>             
Py_DECREF(pyint);
>         
}
>-        cpumap >>= 
1;
>+        cpumap[i / (cpumap_size * 
8)] >>= 1;
>     
}
>     PyDict_SetItemString(info_dict, "cpumap", 
cpulist);
>     
Py_DECREF(cpulist);
>+    
free(cpumap);
>     return info_dict;
> 
}
> 
>  
http://old.nabble.com/file/p27941371/adjust_vcpuaffinity_more_cpu.patch>adjust_vcpuaffinity_more_cpu.patch 
> 
>
>
>-- 
>View this message in context: 
http://old.nabble.com/-Patch--adjust-the-cpu->affinity-to-more-than-64-cpus-tp27928229p27941371.html
>Sent 
from the Xen - Dev mailing list archive at 
Nabble.com.
>
>
>_______________________________________________
>Xen-devel 
mailing list
>Xen-devel@xxxxxxxxxxxxxxxxxxx
>
http://lists.xensource.com/xen-devel