mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
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:
parent
11a5a0956f
commit
1e5a8ddc81
@ -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,
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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/;
|
||||
|
Loading…
Reference in New Issue
Block a user