mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
libxc: allow for explicitly specifying node-affinity
By providing the proper get/set interface and wiring them to the new domctl-s from the previous commit. Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com> Acked-by: Juergen Gross <juergen.gross@ts.fujitsu.com> Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
This commit is contained in:
1 parent
b5b79a12c4
commit
02ec52272f
2 files changed
+103
No files matched your search
@@ -110,6 +110,83 @@ int xc_domain_shutdown(xc_interface *xch,
|
||||
}
|
||||
|
||||
|
||||
int xc_domain_node_setaffinity(xc_interface *xch,
|
||||
uint32_t domid,
|
||||
xc_nodemap_t nodemap)
|
||||
{
|
||||
DECLARE_DOMCTL;
|
||||
DECLARE_HYPERCALL_BUFFER(uint8_t, local);
|
||||
int ret = -1;
|
||||
int nodesize;
|
||||
|
||||
nodesize = xc_get_nodemap_size(xch);
|
||||
if (!nodesize)
|
||||
{
|
||||
PERROR("Could not get number of nodes");
|
||||
goto out;
|
||||
}
|
||||
|
||||
local = xc_hypercall_buffer_alloc(xch, local, nodesize);
|
||||
if ( local == NULL )
|
||||
{
|
||||
PERROR("Could not allocate memory for setnodeaffinity domctl hypercall");
|
||||
goto out;
|
||||
}
|
||||
|
||||
domctl.cmd = XEN_DOMCTL_setnodeaffinity;
|
||||
domctl.domain = (domid_t)domid;
|
||||
|
||||
memcpy(local, nodemap, nodesize);
|
||||
set_xen_guest_handle(domctl.u.nodeaffinity.nodemap.bitmap, local);
|
||||
domctl.u.nodeaffinity.nodemap.nr_bits = nodesize * 8;
|
||||
|
||||
ret = do_domctl(xch, &domctl);
|
||||
|
||||
xc_hypercall_buffer_free(xch, local);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int xc_domain_node_getaffinity(xc_interface *xch,
|
||||
uint32_t domid,
|
||||
xc_nodemap_t nodemap)
|
||||
{
|
||||
DECLARE_DOMCTL;
|
||||
DECLARE_HYPERCALL_BUFFER(uint8_t, local);
|
||||
int ret = -1;
|
||||
int nodesize;
|
||||
|
||||
nodesize = xc_get_nodemap_size(xch);
|
||||
if (!nodesize)
|
||||
{
|
||||
PERROR("Could not get number of nodes");
|
||||
goto out;
|
||||
}
|
||||
|
||||
local = xc_hypercall_buffer_alloc(xch, local, nodesize);
|
||||
if ( local == NULL )
|
||||
{
|
||||
PERROR("Could not allocate memory for getnodeaffinity domctl hypercall");
|
||||
goto out;
|
||||
}
|
||||
|
||||
domctl.cmd = XEN_DOMCTL_getnodeaffinity;
|
||||
domctl.domain = (domid_t)domid;
|
||||
|
||||
set_xen_guest_handle(domctl.u.nodeaffinity.nodemap.bitmap, local);
|
||||
domctl.u.nodeaffinity.nodemap.nr_bits = nodesize * 8;
|
||||
|
||||
ret = do_domctl(xch, &domctl);
|
||||
|
||||
memcpy(nodemap, local, nodesize);
|
||||
|
||||
xc_hypercall_buffer_free(xch, local);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int xc_vcpu_setaffinity(xc_interface *xch,
|
||||
uint32_t domid,
|
||||
int vcpu,
|
||||
|
||||
@@ -526,6 +526,32 @@ int xc_watchdog(xc_interface *xch,
|
||||
uint32_t id,
|
||||
uint32_t timeout);
|
||||
|
||||
/**
|
||||
* This function explicitly sets the host NUMA nodes the domain will
|
||||
* have affinity with.
|
||||
*
|
||||
* @parm xch a handle to an open hypervisor interface.
|
||||
* @parm domid the domain id one wants to set the affinity of.
|
||||
* @parm nodemap the map of the affine nodes.
|
||||
* @return 0 on success, -1 on failure.
|
||||
*/
|
||||
int xc_domain_node_setaffinity(xc_interface *xch,
|
||||
uint32_t domind,
|
||||
xc_nodemap_t nodemap);
|
||||
|
||||
/**
|
||||
* This function retrieves the host NUMA nodes the domain has
|
||||
* affinity with.
|
||||
*
|
||||
* @parm xch a handle to an open hypervisor interface.
|
||||
* @parm domid the domain id one wants to get the node affinity of.
|
||||
* @parm nodemap the map of the affine nodes.
|
||||
* @return 0 on success, -1 on failure.
|
||||
*/
|
||||
int xc_domain_node_getaffinity(xc_interface *xch,
|
||||
uint32_t domind,
|
||||
xc_nodemap_t nodemap);
|
||||
|
||||
int xc_vcpu_setaffinity(xc_interface *xch,
|
||||
uint32_t domid,
|
||||
int vcpu,
|
||||
|
||||