On Tue, Aug 21, 2012 at 05:18:38PM +0800, Hu Tao wrote: > From: Tang Chen <tangchen@xxxxxxxxxxxxxx> > > Introduce 2 APIs to support emulator threads in remote driver. > 1) remoteDomainPinEmulator: call driver api, such as qemudDomainPinEmulator. > 2) remoteDomainGetEmulatorPinInfo: call driver api, such as qemudDomainGetEmulatorPinInfo. > They are similar to remoteDomainPinVcpuFlags and remoteDomainGetVcpuPinInfo. > > Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx> > Signed-off-by: Hu Tao <hutao@xxxxxxxxxxxxxx> > --- > daemon/remote.c | 91 ++++++++++++++++++++++++++++++++++++++ > src/remote/remote_driver.c | 99 ++++++++++++++++++++++++++++++++++++++++++ > src/remote/remote_protocol.x | 21 ++++++++- > src/remote_protocol-structs | 22 ++++++++++ > 4 files changed, 232 insertions(+), 1 deletion(-) > > diff --git a/daemon/remote.c b/daemon/remote.c > index f82af86..24928f4 100644 > --- a/daemon/remote.c > +++ b/daemon/remote.c > @@ -1593,6 +1593,97 @@ no_memory: > } > > static int > +remoteDispatchDomainPinEmulator(virNetServerPtr server ATTRIBUTE_UNUSED, > + virNetServerClientPtr client, > + virNetMessagePtr msg ATTRIBUTE_UNUSED, > + virNetMessageErrorPtr rerr, > + remote_domain_pin_emulator_args *args) > +{ > + int rv = -1; > + virDomainPtr dom = NULL; > + struct daemonClientPrivate *priv = > + virNetServerClientGetPrivateData(client); > + > + 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 (virDomainPinEmulator(dom, > + (unsigned char *) args->cpumap.cpumap_val, > + args->cpumap.cpumap_len, > + args->flags) < 0) > + goto cleanup; > + > + rv = 0; > + > +cleanup: > + if (rv < 0) > + virNetMessageSaveError(rerr); > + if (dom) > + virDomainFree(dom); > + return rv; > +} > + > + > +static int > +remoteDispatchDomainGetEmulatorPinInfo(virNetServerPtr server ATTRIBUTE_UNUSED, > + virNetServerClientPtr client ATTRIBUTE_UNUSED, > + virNetMessagePtr msg ATTRIBUTE_UNUSED, > + virNetMessageErrorPtr rerr, > + remote_domain_get_emulator_pin_info_args *args, > + remote_domain_get_emulator_pin_info_ret *ret) > +{ > + virDomainPtr dom = NULL; > + unsigned char *cpumaps = NULL; > + int r; > + int rv = -1; > + struct daemonClientPrivate *priv = > + virNetServerClientGetPrivateData(client); > + > + 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; > + > + /* Allocate buffers to take the results */ > + if (args->maplen > 0 && > + VIR_ALLOC_N(cpumaps, args->maplen) < 0) > + goto no_memory; > + > + if ((r = virDomainGetEmulatorPinInfo(dom, > + cpumaps, > + args->maplen, > + args->flags)) < 0) > + goto cleanup; > + > + ret->ret = r; > + ret->cpumaps.cpumaps_len = args->maplen; > + ret->cpumaps.cpumaps_val = (char *) cpumaps; > + cpumaps = NULL; > + > + rv = 0; > + > +cleanup: > + if (rv < 0) > + virNetMessageSaveError(rerr); > + VIR_FREE(cpumaps); > + if (dom) > + virDomainFree(dom); > + return rv; > + > +no_memory: > + virReportOOMError(); > + goto cleanup; > +} > + > +static int > remoteDispatchDomainGetVcpus(virNetServerPtr server ATTRIBUTE_UNUSED, > virNetServerClientPtr client ATTRIBUTE_UNUSED, > virNetMessagePtr msg ATTRIBUTE_UNUSED, > diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c > index 977d139..841f9a3 100644 > --- a/src/remote/remote_driver.c > +++ b/src/remote/remote_driver.c > @@ -1843,6 +1843,103 @@ done: > } > > static int > +remoteDomainPinEmulator (virDomainPtr dom, > + unsigned char *cpumap, > + int cpumaplen, > + unsigned int flags) > +{ > + int rv = -1; > + struct private_data *priv = dom->conn->privateData; > + remote_domain_pin_emulator_args args; > + > + remoteDriverLock(priv); > + > + if (cpumaplen > REMOTE_CPUMAP_MAX) { > + virReportError(VIR_ERR_RPC, > + _("%s length greater than maximum: %d > %d"), > + "cpumap", cpumaplen, REMOTE_CPUMAP_MAX); > + goto done; > + } > + > + make_nonnull_domain(&args.dom, dom); > + args.cpumap.cpumap_val = (char *)cpumap; > + args.cpumap.cpumap_len = cpumaplen; > + args.flags = flags; > + > + if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_PIN_EMULATOR, > + (xdrproc_t) xdr_remote_domain_pin_emulator_args, > + (char *) &args, > + (xdrproc_t) xdr_void, (char *) NULL) == -1) { > + goto done; > + } > + > + rv = 0; > + > +done: > + remoteDriverUnlock(priv); > + return rv; > +} > + > + > +static int > +remoteDomainGetEmulatorPinInfo (virDomainPtr domain, > + unsigned char *cpumaps, > + int maplen, > + unsigned int flags) > +{ > + int rv = -1; > + int i; > + remote_domain_get_emulator_pin_info_args args; > + remote_domain_get_emulator_pin_info_ret ret; > + struct private_data *priv = domain->conn->privateData; > + > + remoteDriverLock(priv); > + > + /* There is only one cpumap for all emulator threads */ > + if (maplen > REMOTE_CPUMAPS_MAX) { > + virReportError(VIR_ERR_RPC, > + _("vCPU map buffer length exceeds maximum: %d > %d"), > + maplen, REMOTE_CPUMAPS_MAX); > + goto done; > + } > + > + make_nonnull_domain(&args.dom, domain); > + args.maplen = maplen; > + args.flags = flags; > + > + memset(&ret, 0, sizeof(ret)); > + > + if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_EMULATOR_PIN_INFO, > + (xdrproc_t) xdr_remote_domain_get_emulator_pin_info_args, > + (char *) &args, > + (xdrproc_t) xdr_remote_domain_get_emulator_pin_info_ret, > + (char *) &ret) == -1) > + goto done; > + > + if (ret.cpumaps.cpumaps_len > maplen) { > + virReportError(VIR_ERR_RPC, > + _("host reports map buffer length exceeds maximum: %d > %d"), > + ret.cpumaps.cpumaps_len, maplen); > + goto cleanup; > + } > + > + memset(cpumaps, 0, maplen); > + > + for (i = 0; i < ret.cpumaps.cpumaps_len; ++i) > + cpumaps[i] = ret.cpumaps.cpumaps_val[i]; > + > + rv = ret.ret; > + > +cleanup: > + xdr_free ((xdrproc_t) xdr_remote_domain_get_emulator_pin_info_ret, > + (char *) &ret); > + > +done: > + remoteDriverUnlock(priv); > + return rv; > +} > + > +static int > remoteDomainGetVcpus (virDomainPtr domain, > virVcpuInfoPtr info, > int maxinfo, > @@ -5302,6 +5399,8 @@ static virDriver remote_driver = { > .domainPinVcpu = remoteDomainPinVcpu, /* 0.3.0 */ > .domainPinVcpuFlags = remoteDomainPinVcpuFlags, /* 0.9.3 */ > .domainGetVcpuPinInfo = remoteDomainGetVcpuPinInfo, /* 0.9.3 */ > + .domainPinEmulator = remoteDomainPinEmulator, /* 0.10.0 */ > + .domainGetEmulatorPinInfo = remoteDomainGetEmulatorPinInfo, /* 0.10.0 */ > .domainGetVcpus = remoteDomainGetVcpus, /* 0.3.0 */ > .domainGetMaxVcpus = remoteDomainGetMaxVcpus, /* 0.3.0 */ > .domainGetSecurityLabel = remoteDomainGetSecurityLabel, /* 0.6.1 */ > diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x > index 3be15f5..085d5d9 100644 > --- a/src/remote/remote_protocol.x > +++ b/src/remote/remote_protocol.x > @@ -1059,6 +1059,23 @@ struct remote_domain_get_vcpu_pin_info_ret { > int num; > }; > > +struct remote_domain_pin_emulator_args { > + remote_nonnull_domain dom; > + opaque cpumap<REMOTE_CPUMAP_MAX>; /* (unsigned char *) */ > + unsigned int flags; > +}; > + > +struct remote_domain_get_emulator_pin_info_args { > + remote_nonnull_domain dom; > + int maplen; > + unsigned int flags; > +}; > + > +struct remote_domain_get_emulator_pin_info_ret { > + opaque cpumaps<REMOTE_CPUMAPS_MAX>; > + int ret; > +}; > + > struct remote_domain_get_vcpus_args { > remote_nonnull_domain dom; > int maxinfo; > @@ -2869,7 +2886,9 @@ enum remote_procedure { > REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_ALL_CHILDREN = 275, /* skipgen skipgen priority:high */ > REMOTE_PROC_DOMAIN_EVENT_BALLOON_CHANGE = 276, /* autogen autogen */ > REMOTE_PROC_DOMAIN_GET_HOSTNAME = 277, /* autogen autogen */ > - REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL_LIST = 278 /* skipgen skipgen priority:high */ > + REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL_LIST = 278, /* skipgen skipgen priority:high */ > + REMOTE_PROC_DOMAIN_PIN_EMULATOR = 279, /* skipgen skipgen */ > + REMOTE_PROC_DOMAIN_GET_EMULATOR_PIN_INFO = 280 /* skipgen skipgen */ > > /* > * Notice how the entries are grouped in sets of 10 ? > diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs > index c180e6e..ed40ccb 100644 > --- a/src/remote_protocol-structs > +++ b/src/remote_protocol-structs > @@ -718,6 +718,26 @@ struct remote_domain_get_vcpu_pin_info_ret { > } cpumaps; > int num; > }; > +struct remote_domain_pin_emulator_args { > + remote_nonnull_domain dom; > + struct { > + u_int cpumap_len; > + char * cpumap_val; > + } cpumap; > + u_int flags; > +}; > +struct remote_domain_get_emulator_pin_info_args { > + remote_nonnull_domain dom; > + int maplen; > + u_int flags; > +}; > +struct remote_domain_get_emulator_pin_info_ret { > + struct { > + u_int cpumaps_len; > + char * cpumaps_val; > + } cpumaps; > + int ret; > +}; > struct remote_domain_get_vcpus_args { > remote_nonnull_domain dom; > int maxinfo; > @@ -2270,4 +2290,6 @@ enum remote_procedure { > REMOTE_PROC_DOMAIN_EVENT_BALLOON_CHANGE = 276, > REMOTE_PROC_DOMAIN_GET_HOSTNAME = 277, > REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL_LIST = 278, > + REMOTE_PROC_DOMAIN_PIN_EMULATOR = 279, > + REMOTE_PROC_DOMAIN_GET_EMULATOR_PIN_INFO = 280, > }; Okay, looks fine, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list