int xc_vcpu_setaffinity(int xc_handle, uint32_t domid, int vcpu, uint64_t cpumap) { DECLARE_DOMCTL; int ret = -1; uint8_t local[sizeof (cpumap)]; domctl.cmd = XEN_DOMCTL_setvcpuaffinity; domctl.domain = (domid_t)domid; domctl.u.vcpuaffinity.vcpu = vcpu; bitmap_64_to_byte(local, &cpumap, sizeof(cpumap) * 8); set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; if ( lock_pages(local, sizeof(local)) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); goto out; } ret = do_domctl(xc_handle, &domctl); unlock_pages(local, sizeof(local)); out: return ret; }
int xc_tbuf_set_cpu_mask(xc_interface *xch, uint32_t mask) { DECLARE_SYSCTL; DECLARE_HYPERCALL_BUFFER(uint8_t, bytemap); int ret = -1; uint64_t mask64 = mask; bytemap = xc_hypercall_buffer_alloc(xch, bytemap, sizeof(mask64)); if (bytemap == NULL) { PERROR("Could not allocate memory for xc_tbuf_set_cpu_mask hypercall"); goto out; } sysctl.cmd = XEN_SYSCTL_tbuf_op; sysctl.interface_version = XEN_SYSCTL_INTERFACE_VERSION; sysctl.u.tbuf_op.cmd = XEN_SYSCTL_TBUFOP_set_cpu_mask; bitmap_64_to_byte(bytemap, &mask64, sizeof (mask64) * 8); set_xen_guest_handle(sysctl.u.tbuf_op.cpu_mask.bitmap, bytemap); sysctl.u.tbuf_op.cpu_mask.nr_cpus = sizeof(bytemap) * 8; ret = do_sysctl(xch, &sysctl); xc_hypercall_buffer_free(xch, bytemap); out: return ret; }
int xc_tbuf_set_cpu_mask(int xc_handle, uint32_t mask) { DECLARE_SYSCTL; int ret = -1; uint64_t mask64 = mask; uint8_t bytemap[sizeof(mask64)]; sysctl.cmd = XEN_SYSCTL_tbuf_op; sysctl.interface_version = XEN_SYSCTL_INTERFACE_VERSION; sysctl.u.tbuf_op.cmd = XEN_SYSCTL_TBUFOP_set_cpu_mask; bitmap_64_to_byte(bytemap, &mask64, sizeof (mask64) * 8); set_xen_guest_handle(sysctl.u.tbuf_op.cpu_mask.bitmap, bytemap); sysctl.u.tbuf_op.cpu_mask.nr_cpus = sizeof(bytemap) * 8; if ( lock_pages(&bytemap, sizeof(bytemap)) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); goto out; } ret = do_sysctl(xc_handle, &sysctl); unlock_pages(&bytemap, sizeof(bytemap)); out: return ret; }
int xc_vcpu_setaffinity(int xc_handle, uint32_t domid, int vcpu, uint64_t *cpumap, int cpusize) { DECLARE_DOMCTL; int ret = -1; 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, cpusize * 8); set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); domctl.u.vcpuaffinity.cpumap.nr_cpus = cpusize * 8; if ( lock_pages(local, cpusize) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); goto out; } ret = do_domctl(xc_handle, &domctl); unlock_pages(local, cpusize); out: free(local); return ret; }