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:
Dario Faggioli authored and Ian Campbell committed 2013-04-17 12:11:14 +01:00
1 parent b5b79a12c4
commit 02ec52272f
2 files changed
+103

No files matched your search

+77
View File
@@ -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,
+26
View File
@@ -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,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.