From: Daniel P. Berrange Date: Thu, 22 May 2008 15:20:25 +0000 (+0000) Subject: Wire up free memory APIs to remote driver/daemon X-Git-Tag: LIBVIRT_0_4_4~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab5be538f38ffef226d802a6a100eb16586e4372;p=thirdparty%2Flibvirt.git Wire up free memory APIs to remote driver/daemon --- diff --git a/ChangeLog b/ChangeLog index beaa5fa7af..46913db3fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +Thu May 22 11:15:29 EST 2008 Daniel P. Berrange + + Support the free memory API calls in the remote driver/daemon + * qemud/Makefile.am: Remove tabs from generated RPC header + * qemud/qemud/remote_generate_stubs.pl: Remove tabs from + generated C file + * qemud/remote_dispatch_*.h: Re-generated with for RPC calls + * qemud/remote_protocol.x: Added NUMA free memory apis + * qemud/remote_protocol.{c,h}: Re-generated with new RPC calls + * qemud/remote.c: Implement dispatcher for free memory APIs + * src/remote_internal.c: Implement functions for free + memory APIs + Thu May 22 11:06:29 EST 2008 Daniel P. Berrange Fix misc memory leaks diff --git a/qemud/Makefile.am b/qemud/Makefile.am index a907fd7c99..3ff4b647c9 100644 --- a/qemud/Makefile.am +++ b/qemud/Makefile.am @@ -26,6 +26,9 @@ endif .x.h: rm -f $@ rpcgen -h -o $@ $< +if GLIBC_RPCGEN + perl -i -p -e 's/\t/ /g' $@ +endif endif remote_protocol.c: remote_protocol.h diff --git a/qemud/remote.c b/qemud/remote.c index 038c0aa067..699149680c 100644 --- a/qemud/remote.c +++ b/qemud/remote.c @@ -595,6 +595,53 @@ remoteDispatchGetCapabilities (struct qemud_server *server ATTRIBUTE_UNUSED, return 0; } +static int +remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client, + remote_message_header *req, + remote_node_get_cells_free_memory_args *args, + remote_node_get_cells_free_memory_ret *ret) +{ + CHECK_CONN(client); + + if (args->maxCells > REMOTE_NODE_MAX_CELLS) { + remoteDispatchError (client, req, + "%s", _("maxCells > REMOTE_NODE_MAX_CELLS")); + return -2; + } + + /* Allocate return buffer. */ + ret->freeMems.freeMems_val = calloc (args->maxCells, sizeof (*(ret->freeMems.freeMems_val))); + + ret->freeMems.freeMems_len = virNodeGetCellsFreeMemory(client->conn, + (unsigned long long *)ret->freeMems.freeMems_val, + args->startCell, + args->maxCells); + if (ret->freeMems.freeMems_len == 0) + return -1; + + return 0; +} + + +static int +remoteDispatchNodeGetFreeMemory (struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client, + remote_message_header *req, + void *args ATTRIBUTE_UNUSED, + remote_node_get_free_memory_ret *ret) +{ + unsigned long long freeMem; + CHECK_CONN(client); + + freeMem = virNodeGetFreeMemory(client->conn); + if (freeMem == 0) return -1; + + ret->freeMem = freeMem; + return 0; +} + + static int remoteDispatchDomainGetSchedulerType (struct qemud_server *server ATTRIBUTE_UNUSED, struct qemud_client *client, diff --git a/qemud/remote_dispatch_localvars.h b/qemud/remote_dispatch_localvars.h index bdd96b857b..fa5f173209 100644 --- a/qemud/remote_dispatch_localvars.h +++ b/qemud/remote_dispatch_localvars.h @@ -98,6 +98,8 @@ remote_domain_save_args lv_remote_domain_save_args; remote_domain_migrate_prepare_args lv_remote_domain_migrate_prepare_args; remote_domain_migrate_prepare_ret lv_remote_domain_migrate_prepare_ret; remote_domain_undefine_args lv_remote_domain_undefine_args; +remote_node_get_cells_free_memory_args lv_remote_node_get_cells_free_memory_args; +remote_node_get_cells_free_memory_ret lv_remote_node_get_cells_free_memory_ret; remote_domain_get_scheduler_type_args lv_remote_domain_get_scheduler_type_args; remote_domain_get_scheduler_type_ret lv_remote_domain_get_scheduler_type_ret; remote_get_version_ret lv_remote_get_version_ret; @@ -122,6 +124,7 @@ remote_storage_pool_undefine_args lv_remote_storage_pool_undefine_args; remote_domain_set_autostart_args lv_remote_domain_set_autostart_args; remote_storage_pool_get_autostart_args lv_remote_storage_pool_get_autostart_args; remote_storage_pool_get_autostart_ret lv_remote_storage_pool_get_autostart_ret; +remote_node_get_free_memory_ret lv_remote_node_get_free_memory_ret; remote_storage_vol_get_path_args lv_remote_storage_vol_get_path_args; remote_storage_vol_get_path_ret lv_remote_storage_vol_get_path_ret; remote_domain_lookup_by_id_args lv_remote_domain_lookup_by_id_args; diff --git a/qemud/remote_dispatch_proc_switch.h b/qemud/remote_dispatch_proc_switch.h index c2ac3ff3d0..4c6e4db6c0 100644 --- a/qemud/remote_dispatch_proc_switch.h +++ b/qemud/remote_dispatch_proc_switch.h @@ -491,6 +491,21 @@ case REMOTE_PROC_NETWORK_UNDEFINE: args = (char *) &lv_remote_network_undefine_args; memset (&lv_remote_network_undefine_args, 0, sizeof lv_remote_network_undefine_args); break; +case REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY: + fn = (dispatch_fn) remoteDispatchNodeGetCellsFreeMemory; + args_filter = (xdrproc_t) xdr_remote_node_get_cells_free_memory_args; + args = (char *) &lv_remote_node_get_cells_free_memory_args; + memset (&lv_remote_node_get_cells_free_memory_args, 0, sizeof lv_remote_node_get_cells_free_memory_args); + ret_filter = (xdrproc_t) xdr_remote_node_get_cells_free_memory_ret; + ret = (char *) &lv_remote_node_get_cells_free_memory_ret; + memset (&lv_remote_node_get_cells_free_memory_ret, 0, sizeof lv_remote_node_get_cells_free_memory_ret); + break; +case REMOTE_PROC_NODE_GET_FREE_MEMORY: + fn = (dispatch_fn) remoteDispatchNodeGetFreeMemory; + ret_filter = (xdrproc_t) xdr_remote_node_get_free_memory_ret; + ret = (char *) &lv_remote_node_get_free_memory_ret; + memset (&lv_remote_node_get_free_memory_ret, 0, sizeof lv_remote_node_get_free_memory_ret); + break; case REMOTE_PROC_NODE_GET_INFO: fn = (dispatch_fn) remoteDispatchNodeGetInfo; ret_filter = (xdrproc_t) xdr_remote_node_get_info_ret; diff --git a/qemud/remote_dispatch_prototypes.h b/qemud/remote_dispatch_prototypes.h index b982c03056..41d0269065 100644 --- a/qemud/remote_dispatch_prototypes.h +++ b/qemud/remote_dispatch_prototypes.h @@ -67,6 +67,8 @@ static int remoteDispatchNetworkLookupByName (struct qemud_server *server, struc static int remoteDispatchNetworkLookupByUuid (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_lookup_by_uuid_args *args, remote_network_lookup_by_uuid_ret *ret); static int remoteDispatchNetworkSetAutostart (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_set_autostart_args *args, void *ret); static int remoteDispatchNetworkUndefine (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_network_undefine_args *args, void *ret); +static int remoteDispatchNodeGetCellsFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, remote_node_get_cells_free_memory_args *args, remote_node_get_cells_free_memory_ret *ret); +static int remoteDispatchNodeGetFreeMemory (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_node_get_free_memory_ret *ret); static int remoteDispatchNodeGetInfo (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_node_get_info_ret *ret); static int remoteDispatchNumOfDefinedDomains (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_defined_domains_ret *ret); static int remoteDispatchNumOfDefinedNetworks (struct qemud_server *server, struct qemud_client *client, remote_message_header *req, void *args, remote_num_of_defined_networks_ret *ret); diff --git a/qemud/remote_generate_stubs.pl b/qemud/remote_generate_stubs.pl index 7ebffc6ee6..8c9fe51507 100755 --- a/qemud/remote_generate_stubs.pl +++ b/qemud/remote_generate_stubs.pl @@ -84,8 +84,8 @@ if ($opt_d) { my @keys = sort (keys %calls); foreach (@keys) { print "$_:\n"; - print "\tname $calls{$_}->{name} ($calls{$_}->{ProcName})\n"; - print "\t$calls{$_}->{args} -> $calls{$_}->{ret}\n"; + print " name $calls{$_}->{name} ($calls{$_}->{ProcName})\n"; + print " $calls{$_}->{args} -> $calls{$_}->{ret}\n"; } } @@ -117,18 +117,18 @@ elsif ($opt_w) { my @keys = sort (keys %calls); foreach (@keys) { print "case REMOTE_PROC_$calls{$_}->{UC_NAME}:\n"; - print "\tfn = (dispatch_fn) remoteDispatch$calls{$_}->{ProcName};\n"; + print " fn = (dispatch_fn) remoteDispatch$calls{$_}->{ProcName};\n"; if ($calls{$_}->{args} ne "void") { - print "\targs_filter = (xdrproc_t) xdr_$calls{$_}->{args};\n"; - print "\targs = (char *) &lv_$calls{$_}->{args};\n"; - print "\tmemset (&lv_$calls{$_}->{args}, 0, sizeof lv_$calls{$_}->{args});\n" + print " args_filter = (xdrproc_t) xdr_$calls{$_}->{args};\n"; + print " args = (char *) &lv_$calls{$_}->{args};\n"; + print " memset (&lv_$calls{$_}->{args}, 0, sizeof lv_$calls{$_}->{args});\n" } if ($calls{$_}->{ret} ne "void") { - print "\tret_filter = (xdrproc_t) xdr_$calls{$_}->{ret};\n"; - print "\tret = (char *) &lv_$calls{$_}->{ret};\n"; - print "\tmemset (&lv_$calls{$_}->{ret}, 0, sizeof lv_$calls{$_}->{ret});\n" + print " ret_filter = (xdrproc_t) xdr_$calls{$_}->{ret};\n"; + print " ret = (char *) &lv_$calls{$_}->{ret};\n"; + print " memset (&lv_$calls{$_}->{ret}, 0, sizeof lv_$calls{$_}->{ret});\n" } - print "\tbreak;\n"; + print " break;\n"; } } diff --git a/qemud/remote_protocol.c b/qemud/remote_protocol.c index 8636dc2220..702846f71b 100644 --- a/qemud/remote_protocol.c +++ b/qemud/remote_protocol.c @@ -386,6 +386,36 @@ xdr_remote_get_capabilities_ret (XDR *xdrs, remote_get_capabilities_ret *objp) return TRUE; } +bool_t +xdr_remote_node_get_cells_free_memory_args (XDR *xdrs, remote_node_get_cells_free_memory_args *objp) +{ + + if (!xdr_int (xdrs, &objp->startCell)) + return FALSE; + if (!xdr_int (xdrs, &objp->maxCells)) + return FALSE; + return TRUE; +} + +bool_t +xdr_remote_node_get_cells_free_memory_ret (XDR *xdrs, remote_node_get_cells_free_memory_ret *objp) +{ + + if (!xdr_array (xdrs, (char **)&objp->freeMems.freeMems_val, (u_int *) &objp->freeMems.freeMems_len, REMOTE_NODE_MAX_CELLS, + sizeof (quad_t), (xdrproc_t) xdr_quad_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr_remote_node_get_free_memory_ret (XDR *xdrs, remote_node_get_free_memory_ret *objp) +{ + + if (!xdr_quad_t (xdrs, &objp->freeMem)) + return FALSE; + return TRUE; +} + bool_t xdr_remote_domain_get_scheduler_type_args (XDR *xdrs, remote_domain_get_scheduler_type_args *objp) { diff --git a/qemud/remote_protocol.h b/qemud/remote_protocol.h index d49b64af50..f20f647a99 100644 --- a/qemud/remote_protocol.h +++ b/qemud/remote_protocol.h @@ -30,6 +30,7 @@ typedef remote_nonnull_string *remote_string; #define REMOTE_STORAGE_POOL_NAME_LIST_MAX 256 #define REMOTE_STORAGE_VOL_NAME_LIST_MAX 1024 #define REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX 16 +#define REMOTE_NODE_MAX_CELLS 1024 #define REMOTE_AUTH_SASL_DATA_MAX 65536 #define REMOTE_AUTH_TYPE_LIST_MAX 20 @@ -176,6 +177,25 @@ struct remote_get_capabilities_ret { }; typedef struct remote_get_capabilities_ret remote_get_capabilities_ret; +struct remote_node_get_cells_free_memory_args { + int startCell; + int maxCells; +}; +typedef struct remote_node_get_cells_free_memory_args remote_node_get_cells_free_memory_args; + +struct remote_node_get_cells_free_memory_ret { + struct { + u_int freeMems_len; + quad_t *freeMems_val; + } freeMems; +}; +typedef struct remote_node_get_cells_free_memory_ret remote_node_get_cells_free_memory_ret; + +struct remote_node_get_free_memory_ret { + quad_t freeMem; +}; +typedef struct remote_node_get_free_memory_ret remote_node_get_free_memory_ret; + struct remote_domain_get_scheduler_type_args { remote_nonnull_domain dom; }; @@ -1116,6 +1136,8 @@ enum remote_procedure { REMOTE_PROC_STORAGE_VOL_GET_INFO = 98, REMOTE_PROC_STORAGE_VOL_DUMP_XML = 99, REMOTE_PROC_STORAGE_VOL_GET_PATH = 100, + REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY = 101, + REMOTE_PROC_NODE_GET_FREE_MEMORY = 102, }; typedef enum remote_procedure remote_procedure; @@ -1172,6 +1194,9 @@ extern bool_t xdr_remote_get_max_vcpus_args (XDR *, remote_get_max_vcpus_args*) extern bool_t xdr_remote_get_max_vcpus_ret (XDR *, remote_get_max_vcpus_ret*); extern bool_t xdr_remote_node_get_info_ret (XDR *, remote_node_get_info_ret*); extern bool_t xdr_remote_get_capabilities_ret (XDR *, remote_get_capabilities_ret*); +extern bool_t xdr_remote_node_get_cells_free_memory_args (XDR *, remote_node_get_cells_free_memory_args*); +extern bool_t xdr_remote_node_get_cells_free_memory_ret (XDR *, remote_node_get_cells_free_memory_ret*); +extern bool_t xdr_remote_node_get_free_memory_ret (XDR *, remote_node_get_free_memory_ret*); extern bool_t xdr_remote_domain_get_scheduler_type_args (XDR *, remote_domain_get_scheduler_type_args*); extern bool_t xdr_remote_domain_get_scheduler_type_ret (XDR *, remote_domain_get_scheduler_type_ret*); extern bool_t xdr_remote_domain_get_scheduler_parameters_args (XDR *, remote_domain_get_scheduler_parameters_args*); @@ -1344,6 +1369,9 @@ extern bool_t xdr_remote_get_max_vcpus_args (); extern bool_t xdr_remote_get_max_vcpus_ret (); extern bool_t xdr_remote_node_get_info_ret (); extern bool_t xdr_remote_get_capabilities_ret (); +extern bool_t xdr_remote_node_get_cells_free_memory_args (); +extern bool_t xdr_remote_node_get_cells_free_memory_ret (); +extern bool_t xdr_remote_node_get_free_memory_ret (); extern bool_t xdr_remote_domain_get_scheduler_type_args (); extern bool_t xdr_remote_domain_get_scheduler_type_ret (); extern bool_t xdr_remote_domain_get_scheduler_parameters_args (); diff --git a/qemud/remote_protocol.x b/qemud/remote_protocol.x index e73ffaa5cd..a4dc715828 100644 --- a/qemud/remote_protocol.x +++ b/qemud/remote_protocol.x @@ -87,6 +87,9 @@ const REMOTE_STORAGE_VOL_NAME_LIST_MAX = 1024; /* Upper limit on list of scheduler parameters. */ const REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX = 16; +/* Upper limit on number of NUMA cells */ +const REMOTE_NODE_MAX_CELLS = 1024; + /* Upper limit on SASL auth negotiation packet */ const REMOTE_AUTH_SASL_DATA_MAX = 65536; @@ -254,6 +257,19 @@ struct remote_get_capabilities_ret { remote_nonnull_string capabilities; }; +struct remote_node_get_cells_free_memory_args { + int startCell; + int maxCells; +}; + +struct remote_node_get_cells_free_memory_ret { + hyper freeMems; +}; + +struct remote_node_get_free_memory_ret { + hyper freeMem; +}; + struct remote_domain_get_scheduler_type_args { remote_nonnull_domain dom; }; @@ -1017,7 +1033,10 @@ enum remote_procedure { REMOTE_PROC_STORAGE_VOL_LOOKUP_BY_PATH = 97, REMOTE_PROC_STORAGE_VOL_GET_INFO = 98, REMOTE_PROC_STORAGE_VOL_DUMP_XML = 99, - REMOTE_PROC_STORAGE_VOL_GET_PATH = 100 + REMOTE_PROC_STORAGE_VOL_GET_PATH = 100, + + REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY = 101, + REMOTE_PROC_NODE_GET_FREE_MEMORY = 102 }; /* Custom RPC structure. */ diff --git a/qemud/rpcgen_fix.pl b/qemud/rpcgen_fix.pl index 0f3e22b1c3..b94547a7ef 100644 --- a/qemud/rpcgen_fix.pl +++ b/qemud/rpcgen_fix.pl @@ -24,6 +24,8 @@ while (<>) { next; } + s/\t/ /g; + if (m/^}/) { $in_function = 0; @@ -52,7 +54,7 @@ while (<>) { foreach (keys %uses) { $i = $uses{$_}; unshift @function, - ("\tchar **objp_cpp$i = (char **) (void *) &$_;\n"); + (" char **objp_cpp$i = (char **) (void *) &$_;\n"); $i++; } @function = diff --git a/src/remote_internal.c b/src/remote_internal.c index c17b8910fc..4c87ec8632 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -1328,6 +1328,58 @@ remoteGetCapabilities (virConnectPtr conn) return ret.capabilities; } +static int +remoteNodeGetCellsFreeMemory(virConnectPtr conn, + unsigned long long *freeMems, + int startCell, + int maxCells) +{ + remote_node_get_cells_free_memory_args args; + remote_node_get_cells_free_memory_ret ret; + int i; + GET_PRIVATE (conn, -1); + + if (maxCells > REMOTE_NODE_MAX_CELLS) { + errorf (conn, VIR_ERR_RPC, + _("too many NUMA cells: %d > %d"), + maxCells, + REMOTE_NODE_MAX_CELLS); + return -1; + } + + args.startCell = startCell; + args.maxCells = maxCells; + + memset (&ret, 0, sizeof ret); + if (call (conn, priv, 0, REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY, + (xdrproc_t) xdr_remote_node_get_cells_free_memory_args, (char *)&args, + (xdrproc_t) xdr_remote_node_get_cells_free_memory_ret, (char *)&ret) == -1) + return -1; + + for (i = 0 ; i < ret.freeMems.freeMems_len ; i++) + freeMems[i] = ret.freeMems.freeMems_val[i]; + + xdr_free((xdrproc_t) xdr_remote_node_get_cells_free_memory_ret, (char *) &ret); + + return ret.freeMems.freeMems_len; +} + +static unsigned long long +remoteNodeGetFreeMemory (virConnectPtr conn) +{ + remote_node_get_free_memory_ret ret; + GET_PRIVATE (conn, -1); + + memset (&ret, 0, sizeof ret); + if (call (conn, priv, 0, REMOTE_PROC_NODE_GET_FREE_MEMORY, + (xdrproc_t) xdr_void, NULL, + (xdrproc_t) xdr_remote_node_get_free_memory_ret, (char *)&ret) == -1) + return 0; + + return ret.freeMem; +} + + static int remoteListDomains (virConnectPtr conn, int *ids, int maxids) { @@ -4732,7 +4784,8 @@ static virDriver driver = { .domainMigrateFinish = remoteDomainMigrateFinish, .domainBlockStats = remoteDomainBlockStats, .domainInterfaceStats = remoteDomainInterfaceStats, - .nodeGetCellsFreeMemory = NULL, + .nodeGetCellsFreeMemory = remoteNodeGetCellsFreeMemory, + .getFreeMemory = remoteNodeGetFreeMemory, }; static virNetworkDriver network_driver = {