[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [libvirt] [PATCH] kvm: maxVCPU runtime detection
- From: Guido Günther <agx sigxcpu org>
- To: "Daniel P. Berrange" <berrange redhat com>
- Cc: libvir-list redhat com
- Subject: Re: [libvirt] [PATCH] kvm: maxVCPU runtime detection
- Date: Fri, 29 Aug 2008 23:33:35 +0200
Hi,
On Fri, Aug 22, 2008 at 02:27:58PM +0100, Daniel P. Berrange wrote:
> On Fri, Aug 22, 2008 at 03:16:42PM +0200, Guido G?nther wrote:
> > Hi,
> > with recent linux kernels we can detect the maximum number of virtual
> > cpus at runtime via an ioctl. Possible patch attached. It does this on
> > every call to qemudGetMaxVCPUs. Would you prefer something that does
> > this only once in qemudStartup()?
> > Cheers,
> > -- Guido
>
> >
> > +dnl
> > +dnl check for kvm headers
> > +dnl
> > +AC_CHECK_HEADERS([linux/kvm.h])
>
> Hmm, I wonder if that's commonly installed by Fedora/Debian RPMs
> for KVM....
>
> It might be neccessary to just #define the IOCTL constant in
> our own header files if its not available.
Attached patch adds the missing definitions via qemu_driver.h which
seemed close enough to KVM and isn't a public header. This way all
#ifdefs' moved out of qemu_driver.c.
-- Guido
>From 0da5b6ba3279d80be13b50ba456d2a4e434da7b8 Mon Sep 17 00:00:00 2001
From: Guido Guenther <agx sigxcpu org>
Date: Fri, 22 Aug 2008 14:47:49 +0200
Subject: [PATCH] for kvm determine maxVCPUs at runtime
---
configure.in | 5 +++++
src/qemu_driver.c | 24 +++++++++++++++++++++++-
src/qemu_driver.h | 18 ++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/configure.in b/configure.in
index 430a097..dfb38ea 100644
--- a/configure.in
+++ b/configure.in
@@ -314,6 +314,11 @@ if test "$with_qemu" = "yes" -o "$with_lxc" = "yes" ; then
AC_MSG_ERROR([You must install kernel-headers in order to compile libvirt]))
fi
+dnl
+dnl check for kvm headers
+dnl
+AC_CHECK_HEADERS([linux/kvm.h])
+
dnl Need to test if pkg-config exists
PKG_PROG_PKG_CONFIG
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index eb4454a..482d988 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -42,6 +42,7 @@
#include <pwd.h>
#include <stdio.h>
#include <sys/wait.h>
+#include <sys/ioctl.h>
#if HAVE_NUMACTL
#include <numa.h>
@@ -1790,6 +1791,27 @@ static const char *qemudGetType(virConnectPtr conn ATTRIBUTE_UNUSED) {
return "QEMU";
}
+
+static int kvmGetMaxVCPUs(void) {
+ int maxvcpus = 1;
+
+ int r, fd;
+
+ fd = open(KVM_DEVICE, O_RDONLY);
+ if (fd < 0) {
+ qemudLog(QEMUD_WARN, _("Unable to open " KVM_DEVICE ": %s\n"), strerror(errno));
+ return maxvcpus;
+ }
+
+ r = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS);
+ if (r > 0)
+ maxvcpus = r;
+
+ close(fd);
+ return maxvcpus;
+}
+
+
static int qemudGetMaxVCPUs(virConnectPtr conn, const char *type) {
if (!type)
return 16;
@@ -1800,7 +1822,7 @@ static int qemudGetMaxVCPUs(virConnectPtr conn, const char *type) {
/* XXX future KVM will support SMP. Need to probe
kernel to figure out KVM module version i guess */
if (STRCASEEQ(type, "kvm"))
- return 1;
+ return kvmGetMaxVCPUs();
if (STRCASEEQ(type, "kqemu"))
return 1;
diff --git a/src/qemu_driver.h b/src/qemu_driver.h
index dbcca70..e0662e0 100644
--- a/src/qemu_driver.h
+++ b/src/qemu_driver.h
@@ -29,6 +29,24 @@
#include "internal.h"
+#if HAVE_LINUX_KVM_H
+#include <linux/kvm.h>
+#endif
+
+/* device for kvm ioctls */
+#define KVM_DEVICE "/dev/kvm"
+
+/* add definitions missing in older linux/kvm.h */
+#ifndef KVMIO
+# define KVMIO 0xAE
+#endif
+#ifndef KVM_CHECK_EXTENSION
+# define KVM_CHECK_EXTENSION _IO(KVMIO, 0x03)
+#endif
+#ifndef KVM_CAP_NR_VCPUS
+# define KVM_CAP_NR_VCPUS 9 /* returns max vcpus per vm */
+#endif
+
int qemudRegister(void);
#endif /* QEMUD_DRIVER_H */
--
1.5.6.3
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]