[Libvir] PATCH 2/20: Move driver capabilities code
Daniel P. Berrange
berrange at redhat.com
Fri Jun 22 01:40:55 UTC 2007
Attached this time..
On Fri, Jun 22, 2007 at 02:38:50AM +0100, Daniel P. Berrange wrote:
> This patch moves the QEMU driver capabilities XML generation code out of
> the dispatch.c file and into the driver.c where the rest of the QEMU driver
> impls live. This is to enable the dispatch.c file to be removed later.
>
> dispatch.c | 193 +++++--------------------------------------------------------
> driver.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> driver.h | 11 ++-
> 3 files changed, 203 insertions(+), 185 deletions(-)
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
diff -r 13f57e3de09e qemud/dispatch.c
--- a/qemud/dispatch.c Sun Jun 17 16:30:02 2007 -0400
+++ b/qemud/dispatch.c Sun Jun 17 16:46:32 2007 -0400
@@ -28,14 +28,12 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#include <sys/utsname.h>
#include <libvirt/virterror.h>
#include "internal.h"
#include "driver.h"
#include "dispatch.h"
#include "conf.h"
-#include "buf.h"
static int qemudDispatchFailure(struct qemud_server *server ATTRIBUTE_UNUSED,
@@ -63,32 +61,21 @@ static int qemudDispatchGetVersion(struc
static int qemudDispatchGetNodeInfo(struct qemud_server *server, struct qemud_client *client,
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
- struct utsname info;
-
- if (uname(&info) < 0) {
+ if (qemudGetNodeInfo(&out->qemud_packet_server_data_u.getNodeInfoReply.memory,
+ out->qemud_packet_server_data_u.getNodeInfoReply.model,
+ sizeof(out->qemud_packet_server_data_u.getNodeInfoReply.model),
+ &out->qemud_packet_server_data_u.getNodeInfoReply.cpus,
+ &out->qemud_packet_server_data_u.getNodeInfoReply.mhz,
+ &out->qemud_packet_server_data_u.getNodeInfoReply.nodes,
+ &out->qemud_packet_server_data_u.getNodeInfoReply.sockets,
+ &out->qemud_packet_server_data_u.getNodeInfoReply.cores,
+ &out->qemud_packet_server_data_u.getNodeInfoReply.threads) < 0) {
if (qemudDispatchFailure(server, client, out) < 0)
return -1;
return 0;
}
- if (qemudGetCPUInfo(&out->qemud_packet_server_data_u.getNodeInfoReply.cpus,
- &out->qemud_packet_server_data_u.getNodeInfoReply.mhz,
- &out->qemud_packet_server_data_u.getNodeInfoReply.nodes,
- &out->qemud_packet_server_data_u.getNodeInfoReply.sockets,
- &out->qemud_packet_server_data_u.getNodeInfoReply.cores,
- &out->qemud_packet_server_data_u.getNodeInfoReply.threads) < 0) {
- if (qemudDispatchFailure(server, client, out) < 0)
- return -1;
- return 0;
- }
- if (qemudGetMemInfo(&out->qemud_packet_server_data_u.getNodeInfoReply.memory) < 0) {
- if (qemudDispatchFailure(server, client, out) < 0)
- return -1;
- return 0;
- }
-
out->type = QEMUD_SERVER_PKT_GET_NODEINFO;
- strncpy(out->qemud_packet_server_data_u.getNodeInfoReply.model, info.machine, sizeof(out->qemud_packet_server_data_u.getNodeInfoReply.model));
out->qemud_packet_server_data_u.getNodeInfoReply.model[sizeof(out->qemud_packet_server_data_u.getNodeInfoReply.model)-1] = '\0';
return 0;
@@ -100,166 +87,18 @@ qemudDispatchGetCapabilities (struct qem
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED,
struct qemud_packet_server_data *out)
{
- struct utsname utsname;
- int i, j, r;
- int have_kqemu = 0;
- int have_kvm = 0;
- bufferPtr xml;
- int len;
-
- /* Really, this never fails - look at the man-page. */
- uname (&utsname);
-
- have_kqemu = access ("/dev/kqemu", F_OK) == 0;
- have_kvm = access ("/dev/kvm", F_OK) == 0;
-
- /* Construct the XML. */
- xml = bufferNew (1024);
- if (!xml) {
- qemudReportError (server, VIR_ERR_NO_MEMORY, NULL);
- qemudDispatchFailure (server, client, out);
- return 0;
- }
-
- r = bufferVSprintf (xml,
- "\
-<capabilities>\n\
- <host>\n\
- <cpu>\n\
- <arch>%s</arch>\n\
- </cpu>\n\
- </host>\n",
- utsname.machine);
- if (r == -1) {
- vir_buffer_failed:
- bufferFree (xml);
- qemudReportError (server, VIR_ERR_NO_MEMORY, NULL);
- qemudDispatchFailure (server, client, out);
- return 0;
- }
-
- i = -1;
- if (strcmp (utsname.machine, "i686") == 0) i = 0;
- else if (strcmp (utsname.machine, "x86_64") == 0) i = 1;
- if (i >= 0) {
- /* For the default (PC-like) guest, qemudArchs[0] or [1]. */
- r = bufferVSprintf (xml,
- "\
-\n\
- <guest>\n\
- <os_type>hvm</os_type>\n\
- <arch name=\"%s\">\n\
- <wordsize>%d</wordsize>\n\
- <emulator>/usr/bin/%s</emulator>\n\
- <domain type=\"qemu\"/>\n",
- qemudArchs[i].arch,
- qemudArchs[i].wordsize,
- qemudArchs[i].binary);
- if (r == -1) goto vir_buffer_failed;
-
- for (j = 0; qemudArchs[i].machines[j]; ++j) {
- r = bufferVSprintf (xml,
- "\
- <machine>%s</machine>\n",
- qemudArchs[i].machines[j]);
- if (r == -1) goto vir_buffer_failed;
- }
-
- if (have_kqemu) {
- r = bufferAdd (xml,
- "\
- <domain type=\"kqemu\"/>\n", -1);
- if (r == -1) goto vir_buffer_failed;
- }
- if (have_kvm) {
- r = bufferAdd (xml,
- "\
- <domain type=\"kvm\">\n\
- <emulator>/usr/bin/qemu-kvm</emulator>\n\
- </domain>\n", -1);
- if (r == -1) goto vir_buffer_failed;
- }
- r = bufferAdd (xml,
- "\
- </arch>\n\
- </guest>\n", -1);
- if (r == -1) goto vir_buffer_failed;
-
- /* The "other" PC architecture needs emulation. */
- i = i ^ 1;
- r = bufferVSprintf (xml,
- "\
-\n\
- <guest>\n\
- <os_type>hvm</os_type>\n\
- <arch name=\"%s\">\n\
- <wordsize>%d</wordsize>\n\
- <emulator>/usr/bin/%s</emulator>\n\
- <domain type=\"qemu\"/>\n",
- qemudArchs[i].arch,
- qemudArchs[i].wordsize,
- qemudArchs[i].binary);
- if (r == -1) goto vir_buffer_failed;
- for (j = 0; qemudArchs[i].machines[j]; ++j) {
- r = bufferVSprintf (xml,
- "\
- <machine>%s</machine>\n",
- qemudArchs[i].machines[j]);
- if (r == -1) goto vir_buffer_failed;
- }
- r = bufferAdd (xml,
- "\
- </arch>\n\
- </guest>\n", -1);
- if (r == -1) goto vir_buffer_failed;
- }
-
- /* The non-PC architectures, qemudArchs[>=2]. */
- for (i = 2; qemudArchs[i].arch; ++i) {
- r = bufferVSprintf (xml,
- "\
-\n\
- <guest>\n\
- <os_type>hvm</os_type>\n\
- <arch name=\"%s\">\n\
- <wordsize>%d</wordsize>\n\
- <emulator>/usr/bin/%s</emulator>\n\
- <domain type=\"qemu\"/>\n",
- qemudArchs[i].arch,
- qemudArchs[i].wordsize,
- qemudArchs[i].binary);
- if (r == -1) goto vir_buffer_failed;
- for (j = 0; qemudArchs[i].machines[j]; ++j) {
- r = bufferVSprintf (xml,
- "\
- <machine>%s</machine>\n",
- qemudArchs[i].machines[j]);
- if (r == -1) goto vir_buffer_failed;
- }
- r = bufferAdd (xml,
- "\
- </arch>\n\
- </guest>\n", -1);
- if (r == -1) goto vir_buffer_failed;
- }
-
- /* Finish off. */
- r = bufferAdd (xml,
- "\
-</capabilities>\n", -1);
- if (r == -1) goto vir_buffer_failed;
-
- /* Copy the XML into the outgoing packet, assuming it's not too large. */
- len = strlen (xml->content);
- if (len > QEMUD_MAX_XML_LEN) {
- bufferFree (xml);
+ char *xml = qemudGetCapabilities(server);
+
+ if (strlen(xml) > QEMUD_MAX_XML_LEN) {
qemudReportError (server, VIR_ERR_XML_ERROR, NULL);
qemudDispatchFailure (server, client, out);
+ free(xml);
return 0;
}
+
out->type = QEMUD_SERVER_PKT_GET_CAPABILITIES;
- strcpy (out->qemud_packet_server_data_u.getCapabilitiesReply.xml, xml->content);
- bufferFree (xml);
+ strcpy (out->qemud_packet_server_data_u.getCapabilitiesReply.xml, xml);
+ free(xml);
return 0;
}
diff -r 13f57e3de09e qemud/driver.c
--- a/qemud/driver.c Sun Jun 17 16:30:02 2007 -0400
+++ b/qemud/driver.c Sun Jun 17 16:45:46 2007 -0400
@@ -34,9 +34,11 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
+#include <sys/utsname.h>
#include <libvirt/virterror.h>
+#include "buf.h"
#include "internal.h"
#include "driver.h"
#include "conf.h"
@@ -119,7 +121,8 @@ int qemudMonitorCommand(struct qemud_ser
return 0;
}
-int qemudGetMemInfo(unsigned int *memory) {
+
+static int qemudGetMemInfo(unsigned int *memory) {
FILE *meminfo = fopen("/proc/meminfo", "r");
char line[1024];
@@ -139,9 +142,9 @@ int qemudGetMemInfo(unsigned int *memory
return 0;
}
-int qemudGetCPUInfo(unsigned int *cpus, unsigned int *mhz,
- unsigned int *nodes, unsigned int *sockets,
- unsigned int *cores, unsigned int *threads) {
+static int qemudGetCPUInfo(unsigned int *cpus, unsigned int *mhz,
+ unsigned int *nodes, unsigned int *sockets,
+ unsigned int *cores, unsigned int *threads) {
FILE *cpuinfo = fopen("/proc/cpuinfo", "r");
char line[1024];
@@ -194,6 +197,179 @@ int qemudGetCPUInfo(unsigned int *cpus,
return 0;
}
+int qemudGetNodeInfo(unsigned int *memory,
+ char *cpuModel, int cpuModelLength,
+ unsigned int *cpus, unsigned int *mhz,
+ unsigned int *nodes, unsigned int *sockets,
+ unsigned int *cores, unsigned int *threads) {
+ struct utsname info;
+
+ if (uname(&info) < 0)
+ return -1;
+
+ strncpy(cpuModel, info.machine, cpuModelLength-1);
+ cpuModel[cpuModelLength-1] = '\0';
+
+ if (qemudGetMemInfo(memory) < 0)
+ return -1;
+
+ if (qemudGetCPUInfo(cpus, mhz, nodes, sockets, cores, threads) < 0)
+ return -1;
+ return 0;
+}
+
+char *qemudGetCapabilities(struct qemud_server *server) {
+ struct utsname utsname;
+ int i, j, r;
+ int have_kqemu = 0;
+ int have_kvm = 0;
+ bufferPtr xml;
+
+ /* Really, this never fails - look at the man-page. */
+ uname (&utsname);
+
+ have_kqemu = access ("/dev/kqemu", F_OK) == 0;
+ have_kvm = access ("/dev/kvm", F_OK) == 0;
+
+ /* Construct the XML. */
+ xml = bufferNew (1024);
+ if (!xml) {
+ qemudReportError (server, VIR_ERR_NO_MEMORY, NULL);
+ return NULL;
+ }
+
+ r = bufferVSprintf (xml,
+ "\
+<capabilities>\n\
+ <host>\n\
+ <cpu>\n\
+ <arch>%s</arch>\n\
+ </cpu>\n\
+ </host>\n",
+ utsname.machine);
+ if (r == -1) {
+ vir_buffer_failed:
+ bufferFree (xml);
+ qemudReportError (server, VIR_ERR_NO_MEMORY, NULL);
+ return NULL;
+ }
+
+ i = -1;
+ if (strcmp (utsname.machine, "i686") == 0) i = 0;
+ else if (strcmp (utsname.machine, "x86_64") == 0) i = 1;
+ if (i >= 0) {
+ /* For the default (PC-like) guest, qemudArchs[0] or [1]. */
+ r = bufferVSprintf (xml,
+ "\
+\n\
+ <guest>\n\
+ <os_type>hvm</os_type>\n\
+ <arch name=\"%s\">\n\
+ <wordsize>%d</wordsize>\n\
+ <emulator>/usr/bin/%s</emulator>\n\
+ <domain type=\"qemu\"/>\n",
+ qemudArchs[i].arch,
+ qemudArchs[i].wordsize,
+ qemudArchs[i].binary);
+ if (r == -1) goto vir_buffer_failed;
+
+ for (j = 0; qemudArchs[i].machines[j]; ++j) {
+ r = bufferVSprintf (xml,
+ "\
+ <machine>%s</machine>\n",
+ qemudArchs[i].machines[j]);
+ if (r == -1) goto vir_buffer_failed;
+ }
+
+ if (have_kqemu) {
+ r = bufferAdd (xml,
+ "\
+ <domain type=\"kqemu\"/>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ }
+ if (have_kvm) {
+ r = bufferAdd (xml,
+ "\
+ <domain type=\"kvm\">\n\
+ <emulator>/usr/bin/qemu-kvm</emulator>\n\
+ </domain>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ }
+ r = bufferAdd (xml,
+ "\
+ </arch>\n\
+ </guest>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+
+ /* The "other" PC architecture needs emulation. */
+ i = i ^ 1;
+ r = bufferVSprintf (xml,
+ "\
+\n\
+ <guest>\n\
+ <os_type>hvm</os_type>\n\
+ <arch name=\"%s\">\n\
+ <wordsize>%d</wordsize>\n\
+ <emulator>/usr/bin/%s</emulator>\n\
+ <domain type=\"qemu\"/>\n",
+ qemudArchs[i].arch,
+ qemudArchs[i].wordsize,
+ qemudArchs[i].binary);
+ if (r == -1) goto vir_buffer_failed;
+ for (j = 0; qemudArchs[i].machines[j]; ++j) {
+ r = bufferVSprintf (xml,
+ "\
+ <machine>%s</machine>\n",
+ qemudArchs[i].machines[j]);
+ if (r == -1) goto vir_buffer_failed;
+ }
+ r = bufferAdd (xml,
+ "\
+ </arch>\n\
+ </guest>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ }
+
+ /* The non-PC architectures, qemudArchs[>=2]. */
+ for (i = 2; qemudArchs[i].arch; ++i) {
+ r = bufferVSprintf (xml,
+ "\
+\n\
+ <guest>\n\
+ <os_type>hvm</os_type>\n\
+ <arch name=\"%s\">\n\
+ <wordsize>%d</wordsize>\n\
+ <emulator>/usr/bin/%s</emulator>\n\
+ <domain type=\"qemu\"/>\n",
+ qemudArchs[i].arch,
+ qemudArchs[i].wordsize,
+ qemudArchs[i].binary);
+ if (r == -1) goto vir_buffer_failed;
+ for (j = 0; qemudArchs[i].machines[j]; ++j) {
+ r = bufferVSprintf (xml,
+ "\
+ <machine>%s</machine>\n",
+ qemudArchs[i].machines[j]);
+ if (r == -1) goto vir_buffer_failed;
+ }
+ r = bufferAdd (xml,
+ "\
+ </arch>\n\
+ </guest>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ }
+
+ /* Finish off. */
+ r = bufferAdd (xml,
+ "\
+</capabilities>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+
+ return bufferContentAndFree(xml);
+}
+
+
+
static int qemudGetProcessInfo(unsigned long long *cpuTime, int pid) {
char proc[PATH_MAX];
FILE *pidinfo;
diff -r 13f57e3de09e qemud/driver.h
--- a/qemud/driver.h Sun Jun 17 16:30:02 2007 -0400
+++ b/qemud/driver.h Sun Jun 17 16:44:34 2007 -0400
@@ -31,10 +31,13 @@ void qemudReportError(struct qemud_serve
int code, const char *fmt, ...)
ATTRIBUTE_FORMAT(printf,3,4);
-int qemudGetCPUInfo(unsigned int *cpus, unsigned int *mhz,
- unsigned int *nodes, unsigned int *sockets,
- unsigned int *cores, unsigned int *threads);
-int qemudGetMemInfo(unsigned int *memory);
+int qemudGetNodeInfo(unsigned int *memory,
+ char *cpuModel, int cpuModelLength,
+ unsigned int *cpus, unsigned int *mhz,
+ unsigned int *nodes, unsigned int *sockets,
+ unsigned int *cores, unsigned int *threads);
+
+char *qemudGetCapabilities(struct qemud_server *server);
int qemudMonitorCommand(struct qemud_server *server,
struct qemud_vm *vm,
const char *cmd,
More information about the libvir-list
mailing list