mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/manage: Expose domain capabilities
Add an additional "caps" argument to the libxenmanage functions to obtain a domains capabilities - control, hardware, and xenstore. Update the xenstored callers at the same time. Signed-off-by: Jason Andryuk <jason.andryuk@amd.com> Reviewed-by: Juergen Gross <jgross@suse.com> Acked-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
1 parent
0ba439b942
commit
d885b9daf4
3 files changed
+33
-10
No files matched your search
@@ -45,6 +45,12 @@ int xenmanage_close(xenmanage_handle *hdl);
|
||||
#define XENMANAGE_GETDOMSTATE_STATE_DYING 0x0004 /* Domain dying. */
|
||||
#define XENMANAGE_GETDOMSTATE_STATE_DEAD 0x0008 /* Domain dead. */
|
||||
|
||||
/* Control Domain capability. */
|
||||
#define XENMANAGE_GETDOMSTATE_CAP_CONTROL 0x0001
|
||||
/* Hardware Domain capability. */
|
||||
#define XENMANAGE_GETDOMSTATE_CAP_HARDWARE 0x0002
|
||||
/* Xenstore Domain capability. */
|
||||
#define XENMANAGE_GETDOMSTATE_CAP_XENSTORE 0x0004
|
||||
/*
|
||||
* Return state information of an existing domain.
|
||||
*
|
||||
@@ -59,7 +65,8 @@ int xenmanage_close(xenmanage_handle *hdl);
|
||||
* Return value: 0 if information was stored, -1 else (errno is set)
|
||||
*/
|
||||
int xenmanage_get_domain_info(xenmanage_handle *hdl, unsigned int domid,
|
||||
unsigned int *state, uint64_t *unique_id);
|
||||
unsigned int *state, unsigned int *caps,
|
||||
uint64_t *unique_id);
|
||||
|
||||
/*
|
||||
* Return information of a domain having changed state recently.
|
||||
@@ -73,12 +80,15 @@ int xenmanage_get_domain_info(xenmanage_handle *hdl, unsigned int domid,
|
||||
* domid: where to store the domid of the domain (not NULL)
|
||||
* state: where to store the state (XENMANAGE_GETDOMSTATE_STATE_ flags,
|
||||
* nothing stored if NULL)
|
||||
* caps: where to store the capabilities (XENMANAGE_GETDOMSTATE_CAP_
|
||||
* flags, nothing stored if NULL)
|
||||
* unique_id: where to store the unique id of the domain (nothing stored if
|
||||
* NULL)
|
||||
* Return value: 0 if information was stored, -1 else (errno is set)
|
||||
*/
|
||||
int xenmanage_poll_changed_domain(xenmanage_handle *hdl, unsigned int *domid,
|
||||
unsigned int *state, uint64_t *unique_id);
|
||||
unsigned int *state, unsigned int *caps,
|
||||
uint64_t *unique_id);
|
||||
#endif /* XENMANAGE_H */
|
||||
|
||||
/*
|
||||
|
||||
@@ -92,6 +92,7 @@ static int xenmanage_do_domctl_get_domain_state(xenmanage_handle *hdl,
|
||||
unsigned int domid_in,
|
||||
unsigned int *domid_out,
|
||||
unsigned int *state,
|
||||
unsigned int *caps,
|
||||
uint64_t *unique_id)
|
||||
{
|
||||
struct xen_domctl *buf;
|
||||
@@ -130,6 +131,16 @@ static int xenmanage_do_domctl_get_domain_state(xenmanage_handle *hdl,
|
||||
if ( st->state & XEN_DOMCTL_GETDOMSTATE_STATE_DEAD )
|
||||
*state |= XENMANAGE_GETDOMSTATE_STATE_DEAD;
|
||||
}
|
||||
if ( caps )
|
||||
{
|
||||
*caps = 0;
|
||||
if ( st->caps & XEN_DOMCTL_GETDOMSTATE_CAP_CONTROL )
|
||||
*caps |= XENMANAGE_GETDOMSTATE_CAP_CONTROL;
|
||||
if ( st->caps & XEN_DOMCTL_GETDOMSTATE_CAP_HARDWARE )
|
||||
*caps |= XENMANAGE_GETDOMSTATE_CAP_HARDWARE;
|
||||
if ( st->caps & XEN_DOMCTL_GETDOMSTATE_CAP_XENSTORE )
|
||||
*caps |= XENMANAGE_GETDOMSTATE_CAP_XENSTORE;
|
||||
}
|
||||
if ( unique_id )
|
||||
*unique_id = st->unique_id;
|
||||
}
|
||||
@@ -142,7 +153,8 @@ static int xenmanage_do_domctl_get_domain_state(xenmanage_handle *hdl,
|
||||
}
|
||||
|
||||
int xenmanage_get_domain_info(xenmanage_handle *hdl, unsigned int domid,
|
||||
unsigned int *state, uint64_t *unique_id)
|
||||
unsigned int *state, unsigned int *caps,
|
||||
uint64_t *unique_id)
|
||||
{
|
||||
if ( !hdl || domid >= DOMID_FIRST_RESERVED )
|
||||
{
|
||||
@@ -150,12 +162,13 @@ int xenmanage_get_domain_info(xenmanage_handle *hdl, unsigned int domid,
|
||||
return -1;
|
||||
}
|
||||
|
||||
return xenmanage_do_domctl_get_domain_state(hdl, domid, NULL, state,
|
||||
return xenmanage_do_domctl_get_domain_state(hdl, domid, NULL, state, caps,
|
||||
unique_id);
|
||||
}
|
||||
|
||||
int xenmanage_poll_changed_domain(xenmanage_handle *hdl, unsigned int *domid,
|
||||
unsigned int *state, uint64_t *unique_id)
|
||||
unsigned int *state, unsigned int *caps,
|
||||
uint64_t *unique_id)
|
||||
{
|
||||
if ( !hdl || !domid )
|
||||
{
|
||||
@@ -164,5 +177,5 @@ int xenmanage_poll_changed_domain(xenmanage_handle *hdl, unsigned int *domid,
|
||||
}
|
||||
|
||||
return xenmanage_do_domctl_get_domain_state(hdl, DOMID_INVALID, domid,
|
||||
state, unique_id);
|
||||
state, caps, unique_id);
|
||||
}
|
||||
@@ -673,7 +673,7 @@ static int check_domain(const void *k, void *v, void *arg)
|
||||
unsigned int state;
|
||||
uint64_t unique_id;
|
||||
|
||||
if (xenmanage_get_domain_info(xm_handle, domain->domid, &state,
|
||||
if (xenmanage_get_domain_info(xm_handle, domain->domid, &state, NULL,
|
||||
&unique_id)) {
|
||||
unique_id = 0;
|
||||
state = 0;
|
||||
@@ -706,7 +706,7 @@ static void do_check_domains(void)
|
||||
struct domain *domain;
|
||||
bool notify = false;
|
||||
|
||||
while (!xenmanage_poll_changed_domain(xm_handle, &domid, &state,
|
||||
while (!xenmanage_poll_changed_domain(xm_handle, &domid, &state, NULL,
|
||||
&unique_id)) {
|
||||
domain = find_domain_struct(domid);
|
||||
if (domain)
|
||||
@@ -836,7 +836,7 @@ static struct domain *find_or_alloc_existing_domain(unsigned int domid)
|
||||
domain = find_domain_struct(domid);
|
||||
if (!domain || !domain->unique_id)
|
||||
dom_valid = !xenmanage_get_domain_info(xm_handle, domid,
|
||||
NULL, &unique_id);
|
||||
NULL, NULL, &unique_id);
|
||||
|
||||
if (dom_valid) {
|
||||
if (!domain)
|
||||
@@ -1447,7 +1447,7 @@ int domain_alloc_permrefs(struct node_perms *perms)
|
||||
domid = perms->p[i].id;
|
||||
d = find_domain_struct(domid);
|
||||
if (!d) {
|
||||
if (xenmanage_get_domain_info(xm_handle, domid,
|
||||
if (xenmanage_get_domain_info(xm_handle, domid, NULL,
|
||||
NULL, &unique_id))
|
||||
perms->p[i].perms |= XS_PERM_IGNORE;
|
||||
else if (!alloc_domain(NULL, domid, unique_id))
|
||||
|
||||