[libvirt] [PATCH] kvm: maxVCPU runtime detection

Jim Meyering jim at meyering.net
Fri Aug 22 17:26:12 UTC 2008


"Daniel P. Berrange" <berrange at redhat.com> 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....

I've just checked up to date rawhide and debian unstable systems.
Both had this:

    $ grep KVM_CHECK_EXTENSION /usr/include/linux/kvm.h
    #define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03)

But rawhide lacks KVM_CAP_NR_VCPUS, while Debian has it.

    $ grep -r KVM_CAP_NR_VCPUS /usr/include/linux/kvm.h
    #define KVM_CAP_NR_VCPUS 9       /* returns max vcpus per vm */

> It might be neccessary to just #define the IOCTL constant in
> our own header files if its not available.

Good point.
Otherwise, this patch looks fine.

>> @@ -72,6 +77,9 @@
>>  static int qemudShutdown(void);
>>  #endif
>>
>> +/* device for kvm ioctls */
>> +#define KVM_DEVICE "/dev/kvm"
>> +
>>  /* qemudDebug statements should be changed to use this macro instead. */
>>  #define DEBUG(fmt,...) VIR_DEBUG(__FILE__, fmt, __VA_ARGS__)
>>  #define DEBUG0(msg) VIR_DEBUG(__FILE__, "%s", msg)
>> @@ -1768,6 +1776,29 @@ static const char *qemudGetType(virConnectPtr conn ATTRIBUTE_UNUSED) {
>>      return "QEMU";
>>  }
>>
>> +
>> +static int kvmGetMaxVCPUs(void) {
>> +    int maxvcpus = 1;
>> +
>> +#if defined(KVM_CAP_NR_VCPUS)
>> +    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);
>> +#endif
>> +    return maxvcpus;
>> +}
>
> This is all very cool. IIRC Cole has some code which could guess
> a reasonable maxvcpus from KVM version number which we could
> potentially fallback to
>
> Daniel




More information about the libvir-list mailing list