remote: Implement the remote plumbing for virDomainGetIOThreadsInfo

Implement the remote plumbing for virDomainGetIOThreadsInfo

Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
John Ferlan 2015-02-09 18:59:23 -05:00
parent 11a5a0956f
commit 1e5a8ddc81
5 changed files with 199 additions and 4 deletions

View File

@ -1,7 +1,7 @@
/*
* remote.c: handlers for RPC method calls
*
* Copyright (C) 2007-2014 Red Hat, Inc.
* Copyright (C) 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -2268,6 +2268,78 @@ remoteDispatchDomainGetVcpus(virNetServerPtr server ATTRIBUTE_UNUSED,
return rv;
}
static int
remoteDispatchDomainGetIOThreadsInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client,
virNetMessagePtr msg ATTRIBUTE_UNUSED,
virNetMessageErrorPtr rerr,
remote_domain_get_iothreads_info_args *args,
remote_domain_get_iothreads_info_ret *ret)
{
int rv = -1;
size_t i;
struct daemonClientPrivate *priv = virNetServerClientGetPrivateData(client);
virDomainIOThreadInfoPtr *info = NULL;
virDomainPtr dom = NULL;
remote_domain_iothread_info *dst;
int ninfo = 0;
if (!priv->conn) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
goto cleanup;
}
if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
goto cleanup;
if ((ninfo = virDomainGetIOThreadsInfo(dom, &info, args->flags)) < 0)
goto cleanup;
if (ninfo > REMOTE_IOTHREADS_INFO_MAX) {
virReportError(VIR_ERR_RPC,
_("Too many IOThreads in info: %d for limit %d"),
ninfo, REMOTE_IOTHREADS_INFO_MAX);
goto cleanup;
}
if (ninfo) {
if (VIR_ALLOC_N(ret->info.info_val, ninfo) < 0)
goto cleanup;
ret->info.info_len = ninfo;
for (i = 0; i < ninfo; i++) {
dst = &ret->info.info_val[i];
dst->iothread_id = info[i]->iothread_id;
/* No need to allocate/copy the cpumap if we make the reasonable
* assumption that unsigned char and char are the same size.
*/
dst->cpumap.cpumap_len = info[i]->cpumaplen;
dst->cpumap.cpumap_val = (char *)info[i]->cpumap;
info[i]->cpumap = NULL;
}
} else {
ret->info.info_len = 0;
ret->info.info_val = NULL;
}
ret->ret = ninfo;
rv = 0;
cleanup:
if (rv < 0)
virNetMessageSaveError(rerr);
virObjectUnref(dom);
if (ninfo >= 0)
for (i = 0; i < ninfo; i++)
virDomainIOThreadsInfoFree(info[i]);
VIR_FREE(info);
return rv;
}
static int
remoteDispatchDomainMigratePrepare(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,

View File

@ -2,7 +2,7 @@
* remote_driver.c: driver to provide access to libvirtd running
* on a remote machine
*
* Copyright (C) 2007-2014 Red Hat, Inc.
* Copyright (C) 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -2315,6 +2315,84 @@ remoteDomainGetVcpus(virDomainPtr domain,
return rv;
}
static int
remoteDomainGetIOThreadsInfo(virDomainPtr dom,
virDomainIOThreadInfoPtr **info,
unsigned int flags)
{
int rv = -1;
size_t i;
struct private_data *priv = dom->conn->privateData;
remote_domain_get_iothreads_info_args args;
remote_domain_get_iothreads_info_ret ret;
remote_domain_iothread_info *src;
virDomainIOThreadInfoPtr *info_ret = NULL;
remoteDriverLock(priv);
make_nonnull_domain(&args.dom, dom);
args.flags = flags;
memset(&ret, 0, sizeof(ret));
if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_IOTHREADS_INFO,
(xdrproc_t)xdr_remote_domain_get_iothreads_info_args,
(char *)&args,
(xdrproc_t)xdr_remote_domain_get_iothreads_info_ret,
(char *)&ret) == -1)
goto done;
if (ret.info.info_len > REMOTE_IOTHREADS_INFO_MAX) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Too many IOThreads in info: %d for limit %d"),
ret.info.info_len, REMOTE_IOTHREADS_INFO_MAX);
goto cleanup;
}
if (info) {
if (!ret.info.info_len) {
*info = NULL;
rv = ret.ret;
goto cleanup;
}
if (VIR_ALLOC_N(info_ret, ret.info.info_len) < 0)
goto cleanup;
for (i = 0; i < ret.info.info_len; i++) {
src = &ret.info.info_val[i];
if (VIR_ALLOC(info_ret[i]) < 0)
goto cleanup;
info_ret[i]->iothread_id = src->iothread_id;
if (VIR_ALLOC_N(info_ret[i]->cpumap, src->cpumap.cpumap_len) < 0)
goto cleanup;
memcpy(info_ret[i]->cpumap, src->cpumap.cpumap_val,
src->cpumap.cpumap_len);
info_ret[i]->cpumaplen = src->cpumap.cpumap_len;
}
*info = info_ret;
info_ret = NULL;
}
rv = ret.ret;
cleanup:
if (info_ret) {
for (i = 0; i < ret.info.info_len; i++)
virDomainIOThreadsInfoFree(info_ret[i]);
VIR_FREE(info_ret);
}
xdr_free((xdrproc_t)xdr_remote_domain_get_iothreads_info_ret,
(char *) &ret);
done:
remoteDriverUnlock(priv);
return rv;
}
static int
remoteDomainGetSecurityLabel(virDomainPtr domain, virSecurityLabelPtr seclabel)
{
@ -8027,6 +8105,7 @@ static virHypervisorDriver hypervisor_driver = {
.domainGetEmulatorPinInfo = remoteDomainGetEmulatorPinInfo, /* 0.10.0 */
.domainGetVcpus = remoteDomainGetVcpus, /* 0.3.0 */
.domainGetMaxVcpus = remoteDomainGetMaxVcpus, /* 0.3.0 */
.domainGetIOThreadsInfo = remoteDomainGetIOThreadsInfo, /* 1.2.14 */
.domainGetSecurityLabel = remoteDomainGetSecurityLabel, /* 0.6.1 */
.domainGetSecurityLabelList = remoteDomainGetSecurityLabelList, /* 0.10.0 */
.nodeGetSecurityModel = remoteNodeGetSecurityModel, /* 0.6.1 */

View File

@ -3,7 +3,7 @@
* remote_internal driver and libvirtd. This protocol is
* internal and may change at any time.
*
* Copyright (C) 2006-2014 Red Hat, Inc.
* Copyright (C) 2006-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -85,6 +85,9 @@ const REMOTE_VCPUINFO_MAX = 16384;
/* Upper limit on cpumaps (bytes) passed to virDomainGetVcpus. */
const REMOTE_CPUMAPS_MAX = 8388608;
/* Upper limit on number of info fields returned by virDomainGetIOThreads. */
const REMOTE_IOTHREADS_INFO_MAX = 16384;
/* Upper limit on migrate cookie. */
const REMOTE_MIGRATE_COOKIE_MAX = 4194304;
@ -1181,6 +1184,21 @@ struct remote_domain_get_max_vcpus_ret {
int num;
};
struct remote_domain_iothread_info {
unsigned int iothread_id;
opaque cpumap<REMOTE_CPUMAP_MAX>;
};
struct remote_domain_get_iothreads_info_args {
remote_nonnull_domain dom;
unsigned int flags;
};
struct remote_domain_get_iothreads_info_ret {
remote_domain_iothread_info info<REMOTE_IOTHREADS_INFO_MAX>;
unsigned int ret;
};
struct remote_domain_get_security_label_args {
remote_nonnull_domain dom;
};
@ -5569,5 +5587,11 @@ enum remote_procedure {
* @acl: domain:write
* @acl: domain:save
*/
REMOTE_PROC_DOMAIN_DEFINE_XML_FLAGS = 350
REMOTE_PROC_DOMAIN_DEFINE_XML_FLAGS = 350,
/**
* @generate: none
* @acl: domain:read
*/
REMOTE_PROC_DOMAIN_GET_IOTHREADS_INFO = 351
};

View File

@ -807,6 +807,24 @@ struct remote_domain_get_max_vcpus_args {
struct remote_domain_get_max_vcpus_ret {
int num;
};
struct remote_domain_iothread_info {
u_int iothread_id;
struct {
u_int cpumap_len;
char * cpumap_val;
} cpumap;
};
struct remote_domain_get_iothreads_info_args {
remote_nonnull_domain dom;
u_int flags;
};
struct remote_domain_get_iothreads_info_ret {
struct {
u_int info_len;
remote_domain_iothread_info * info_val;
} info;
u_int ret;
};
struct remote_domain_get_security_label_args {
remote_nonnull_domain dom;
};
@ -2963,4 +2981,5 @@ enum remote_procedure {
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_AGENT_LIFECYCLE = 348,
REMOTE_PROC_DOMAIN_GET_FSINFO = 349,
REMOTE_PROC_DOMAIN_DEFINE_XML_FLAGS = 350,
REMOTE_PROC_DOMAIN_GET_IOTHREADS_INFO = 351,
};

View File

@ -67,6 +67,7 @@ sub fixup_name {
$name =~ s/Fsfreeze$/FSFreeze/;
$name =~ s/Fsthaw$/FSThaw/;
$name =~ s/Fsinfo$/FSInfo/;
$name =~ s/Iothreads$/IOThreads/;
$name =~ s/Scsi/SCSI/;
$name =~ s/Wwn$/WWN/;
$name =~ s/Dhcp$/DHCP/;