[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
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |