Add domainMemoryStats support to remote driver

Use a dynamically sized xdr_array to pass memory stats on the wire.  This
supports the addition of future memory stats and reduces the message size
since only supported statistics are returned.

* src/remote/remote_protocol.x: provide defines for the new entry point
* src/remote/remote_driver.c daemon/remote.c: implement the client and
  server side
* daemon/remote_dispatch_args.h daemon/remote_dispatch_prototypes.h
  daemon/remote_dispatch_ret.h daemon/remote_dispatch_table.h
  src/remote/remote_protocol.c src/remote/remote_protocol.h: generated
  stubs
This commit is contained in:
Adam Litke 2009-12-20 13:43:19 +01:00 committed by Daniel Veillard
parent c7523b410a
commit 841d50358f
9 changed files with 199 additions and 2 deletions

View File

@ -707,6 +707,62 @@ remoteDispatchDomainInterfaceStats (struct qemud_server *server ATTRIBUTE_UNUSED
return 0;
}
static int
remoteDispatchDomainMemoryStats (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client ATTRIBUTE_UNUSED,
virConnectPtr conn,
remote_message_header *hdr ATTRIBUTE_UNUSED,
remote_error *rerr,
remote_domain_memory_stats_args *args,
remote_domain_memory_stats_ret *ret)
{
virDomainPtr dom;
struct _virDomainMemoryStat *stats;
unsigned int nr_stats, i;
if (args->maxStats > REMOTE_DOMAIN_MEMORY_STATS_MAX) {
remoteDispatchFormatError (rerr, "%s",
_("maxStats > REMOTE_DOMAIN_MEMORY_STATS_MAX"));
return -1;
}
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
remoteDispatchConnError(rerr, conn);
return -1;
}
/* Allocate stats array for making dispatch call */
if (VIR_ALLOC_N(stats, args->maxStats) < 0) {
remoteDispatchOOMError(rerr);
return -1;
}
nr_stats = virDomainMemoryStats (dom, stats, args->maxStats, 0);
virDomainFree (dom);
if (nr_stats == -1) {
VIR_FREE(stats);
remoteDispatchConnError(rerr, conn);
return -1;
}
/* Allocate return buffer */
if (VIR_ALLOC_N(ret->stats.stats_val, args->maxStats) < 0) {
VIR_FREE(stats);
remoteDispatchOOMError(rerr);
return -1;
}
/* Copy the stats into the xdr return structure */
for (i = 0; i < nr_stats; i++) {
ret->stats.stats_val[i].tag = stats[i].tag;
ret->stats.stats_val[i].val = stats[i].val;
}
ret->stats.stats_len = nr_stats;
VIR_FREE(stats);
return 0;
}
static int
remoteDispatchDomainBlockPeek (struct qemud_server *server ATTRIBUTE_UNUSED,
struct qemud_client *client ATTRIBUTE_UNUSED,

View File

@ -134,3 +134,4 @@
remote_storage_pool_is_persistent_args val_remote_storage_pool_is_persistent_args;
remote_interface_is_active_args val_remote_interface_is_active_args;
remote_cpu_compare_args val_remote_cpu_compare_args;
remote_domain_memory_stats_args val_remote_domain_memory_stats_args;

View File

@ -282,6 +282,14 @@ static int remoteDispatchDomainMemoryPeek(
remote_error *err,
remote_domain_memory_peek_args *args,
remote_domain_memory_peek_ret *ret);
static int remoteDispatchDomainMemoryStats(
struct qemud_server *server,
struct qemud_client *client,
virConnectPtr conn,
remote_message_header *hdr,
remote_error *err,
remote_domain_memory_stats_args *args,
remote_domain_memory_stats_ret *ret);
static int remoteDispatchDomainMigrateFinish(
struct qemud_server *server,
struct qemud_client *client,

View File

@ -116,3 +116,4 @@
remote_interface_is_active_ret val_remote_interface_is_active_ret;
remote_get_lib_version_ret val_remote_get_lib_version_ret;
remote_cpu_compare_ret val_remote_cpu_compare_ret;
remote_domain_memory_stats_ret val_remote_domain_memory_stats_ret;

View File

@ -797,3 +797,8 @@
.args_filter = (xdrproc_t) xdr_remote_cpu_compare_args,
.ret_filter = (xdrproc_t) xdr_remote_cpu_compare_ret,
},
{ /* DomainMemoryStats => 159 */
.fn = (dispatch_fn) remoteDispatchDomainMemoryStats,
.args_filter = (xdrproc_t) xdr_remote_domain_memory_stats_args,
.ret_filter = (xdrproc_t) xdr_remote_domain_memory_stats_ret,
},

View File

@ -3365,6 +3365,49 @@ done:
return rv;
}
static int
remoteDomainMemoryStats (virDomainPtr domain,
struct _virDomainMemoryStat *stats,
unsigned int nr_stats)
{
int rv = -1;
remote_domain_memory_stats_args args;
remote_domain_memory_stats_ret ret;
struct private_data *priv = domain->conn->privateData;
unsigned int i;
remoteDriverLock(priv);
make_nonnull_domain (&args.dom, domain);
if (nr_stats > REMOTE_DOMAIN_MEMORY_STATS_MAX) {
errorf (domain->conn, VIR_ERR_RPC,
_("too many memory stats requested: %d > %d"), nr_stats,
REMOTE_DOMAIN_MEMORY_STATS_MAX);
goto done;
}
args.maxStats = nr_stats;
args.flags = 0;
memset (&ret, 0, sizeof ret);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MEMORY_STATS,
(xdrproc_t) xdr_remote_domain_memory_stats_args,
(char *) &args,
(xdrproc_t) xdr_remote_domain_memory_stats_ret,
(char *) &ret) == -1)
goto done;
for (i = 0; i < ret.stats.stats_len; i++) {
stats[i].tag = ret.stats.stats_val[i].tag;
stats[i].val = ret.stats.stats_val[i].val;
}
rv = ret.stats.stats_len;
xdr_free((xdrproc_t) xdr_remote_domain_memory_stats_ret, (char *) &ret);
done:
remoteDriverUnlock(priv);
return rv;
}
static int
remoteDomainBlockPeek (virDomainPtr domain,
const char *path,
@ -8841,7 +8884,7 @@ static virDriver remote_driver = {
remoteDomainMigrateFinish, /* domainMigrateFinish */
remoteDomainBlockStats, /* domainBlockStats */
remoteDomainInterfaceStats, /* domainInterfaceStats */
NULL, /* domainMemoryStats */
remoteDomainMemoryStats, /* domainMemoryStats */
remoteDomainBlockPeek, /* domainBlockPeek */
remoteDomainMemoryPeek, /* domainMemoryPeek */
remoteNodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */

View File

@ -596,6 +596,41 @@ xdr_remote_domain_interface_stats_ret (XDR *xdrs, remote_domain_interface_stats_
return TRUE;
}
bool_t
xdr_remote_domain_memory_stats_args (XDR *xdrs, remote_domain_memory_stats_args *objp)
{
if (!xdr_remote_nonnull_domain (xdrs, &objp->dom))
return FALSE;
if (!xdr_u_int (xdrs, &objp->maxStats))
return FALSE;
if (!xdr_u_int (xdrs, &objp->flags))
return FALSE;
return TRUE;
}
bool_t
xdr_remote_domain_memory_stat (XDR *xdrs, remote_domain_memory_stat *objp)
{
if (!xdr_int (xdrs, &objp->tag))
return FALSE;
if (!xdr_uint64_t (xdrs, &objp->val))
return FALSE;
return TRUE;
}
bool_t
xdr_remote_domain_memory_stats_ret (XDR *xdrs, remote_domain_memory_stats_ret *objp)
{
char **objp_cpp0 = (char **) (void *) &objp->stats.stats_val;
if (!xdr_array (xdrs, objp_cpp0, (u_int *) &objp->stats.stats_len, REMOTE_DOMAIN_MEMORY_STATS_MAX,
sizeof (remote_domain_memory_stat), (xdrproc_t) xdr_remote_domain_memory_stat))
return FALSE;
return TRUE;
}
bool_t
xdr_remote_domain_block_peek_args (XDR *xdrs, remote_domain_block_peek_args *objp)
{

View File

@ -40,6 +40,7 @@ typedef remote_nonnull_string *remote_string;
#define REMOTE_NODE_MAX_CELLS 1024
#define REMOTE_AUTH_SASL_DATA_MAX 65536
#define REMOTE_AUTH_TYPE_LIST_MAX 20
#define REMOTE_DOMAIN_MEMORY_STATS_MAX 1024
#define REMOTE_DOMAIN_BLOCK_PEEK_BUFFER_MAX 65536
#define REMOTE_DOMAIN_MEMORY_PEEK_BUFFER_MAX 65536
#define REMOTE_SECURITY_MODEL_MAX VIR_SECURITY_MODEL_BUFLEN
@ -307,6 +308,27 @@ struct remote_domain_interface_stats_ret {
};
typedef struct remote_domain_interface_stats_ret remote_domain_interface_stats_ret;
struct remote_domain_memory_stats_args {
remote_nonnull_domain dom;
u_int maxStats;
u_int flags;
};
typedef struct remote_domain_memory_stats_args remote_domain_memory_stats_args;
struct remote_domain_memory_stat {
int tag;
uint64_t val;
};
typedef struct remote_domain_memory_stat remote_domain_memory_stat;
struct remote_domain_memory_stats_ret {
struct {
u_int stats_len;
remote_domain_memory_stat *stats_val;
} stats;
};
typedef struct remote_domain_memory_stats_ret remote_domain_memory_stats_ret;
struct remote_domain_block_peek_args {
remote_nonnull_domain dom;
remote_nonnull_string path;
@ -1789,6 +1811,7 @@ enum remote_procedure {
REMOTE_PROC_INTERFACE_IS_ACTIVE = 156,
REMOTE_PROC_GET_LIB_VERSION = 157,
REMOTE_PROC_CPU_COMPARE = 158,
REMOTE_PROC_DOMAIN_MEMORY_STATS = 159,
};
typedef enum remote_procedure remote_procedure;
@ -1865,6 +1888,9 @@ extern bool_t xdr_remote_domain_block_stats_args (XDR *, remote_domain_block_st
extern bool_t xdr_remote_domain_block_stats_ret (XDR *, remote_domain_block_stats_ret*);
extern bool_t xdr_remote_domain_interface_stats_args (XDR *, remote_domain_interface_stats_args*);
extern bool_t xdr_remote_domain_interface_stats_ret (XDR *, remote_domain_interface_stats_ret*);
extern bool_t xdr_remote_domain_memory_stats_args (XDR *, remote_domain_memory_stats_args*);
extern bool_t xdr_remote_domain_memory_stat (XDR *, remote_domain_memory_stat*);
extern bool_t xdr_remote_domain_memory_stats_ret (XDR *, remote_domain_memory_stats_ret*);
extern bool_t xdr_remote_domain_block_peek_args (XDR *, remote_domain_block_peek_args*);
extern bool_t xdr_remote_domain_block_peek_ret (XDR *, remote_domain_block_peek_ret*);
extern bool_t xdr_remote_domain_memory_peek_args (XDR *, remote_domain_memory_peek_args*);
@ -2138,6 +2164,9 @@ extern bool_t xdr_remote_domain_block_stats_args ();
extern bool_t xdr_remote_domain_block_stats_ret ();
extern bool_t xdr_remote_domain_interface_stats_args ();
extern bool_t xdr_remote_domain_interface_stats_ret ();
extern bool_t xdr_remote_domain_memory_stats_args ();
extern bool_t xdr_remote_domain_memory_stat ();
extern bool_t xdr_remote_domain_memory_stats_ret ();
extern bool_t xdr_remote_domain_block_peek_args ();
extern bool_t xdr_remote_domain_block_peek_ret ();
extern bool_t xdr_remote_domain_memory_peek_args ();

View File

@ -115,6 +115,9 @@ const REMOTE_AUTH_SASL_DATA_MAX = 65536;
/* Maximum number of auth types */
const REMOTE_AUTH_TYPE_LIST_MAX = 20;
/* Upper limit on list of memory stats */
const REMOTE_DOMAIN_MEMORY_STATS_MAX = 1024;
/* Maximum length of a block peek buffer message.
* Note applications need to be aware of this limit and issue multiple
* requests for large amounts of data.
@ -405,6 +408,21 @@ struct remote_domain_interface_stats_ret {
hyper tx_drop;
};
struct remote_domain_memory_stats_args {
remote_nonnull_domain dom;
u_int maxStats;
u_int flags;
};
struct remote_domain_memory_stat {
int tag;
unsigned hyper val;
};
struct remote_domain_memory_stats_ret {
remote_domain_memory_stat stats<REMOTE_DOMAIN_MEMORY_STATS_MAX>;
};
struct remote_domain_block_peek_args {
remote_nonnull_domain dom;
remote_nonnull_string path;
@ -1622,7 +1640,8 @@ enum remote_procedure {
REMOTE_PROC_STORAGE_POOL_IS_PERSISTENT = 155,
REMOTE_PROC_INTERFACE_IS_ACTIVE = 156,
REMOTE_PROC_GET_LIB_VERSION = 157,
REMOTE_PROC_CPU_COMPARE = 158
REMOTE_PROC_CPU_COMPARE = 158,
REMOTE_PROC_DOMAIN_MEMORY_STATS = 159
/*
* Notice how the entries are grouped in sets of 10 ?