[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [Patch] adjust the cpu-affinity to more than 64 cpus
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.c Wed Mar 10 14:01:32 2010 +0800 >+++ b/tools/libxc/xc_domain.c Thu 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.h Wed Mar 10 14:01:32 2010 +0800 >+++ b/tools/libxc/xenctrl.h Thu 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.c Wed Mar 10 14:01:32 2010 +0800 >+++ b/tools/python/xen/lowlevel/xc/xc.c Thu 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |