+Thu May 22 11:15:29 EST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+ 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 <berrange@redhat.com>
Fix misc memory leaks
.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
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,
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;
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;
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;
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);
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";
}
}
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";
}
}
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)
{
#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
};
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;
};
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;
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*);
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 ();
/* 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;
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<REMOTE_NODE_MAX_CELLS>;
+};
+
+struct remote_node_get_free_memory_ret {
+ hyper freeMem;
+};
+
struct remote_domain_get_scheduler_type_args {
remote_nonnull_domain dom;
};
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. */
next;
}
+ s/\t/ /g;
+
if (m/^}/) {
$in_function = 0;
foreach (keys %uses) {
$i = $uses{$_};
unshift @function,
- ("\tchar **objp_cpp$i = (char **) (void *) &$_;\n");
+ (" char **objp_cpp$i = (char **) (void *) &$_;\n");
$i++;
}
@function =
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)
{
.domainMigrateFinish = remoteDomainMigrateFinish,
.domainBlockStats = remoteDomainBlockStats,
.domainInterfaceStats = remoteDomainInterfaceStats,
- .nodeGetCellsFreeMemory = NULL,
+ .nodeGetCellsFreeMemory = remoteNodeGetCellsFreeMemory,
+ .getFreeMemory = remoteNodeGetFreeMemory,
};
static virNetworkDriver network_driver = {