This patch series depends on eventfd which means that KVM now requires 
2.6.22-rc1.

While KVM will inevitably start requiring newer kernel versions, do we 
really need to do it right now?  Perhaps we could add dummy eventfd_* 
functions to the module compat header?  Then at least older kernels will 
continue to work with in-kernel APIC disabled.

Regards,

Anthony Liguori

Gregory Haskins wrote:
> Signed-off-by: Gregory Haskins <[EMAIL PROTECTED]>
> ---
>
>  drivers/kvm/kvm.h      |    1 +
>  drivers/kvm/kvm_main.c |   55 
> +++++++++++++++++++++++++++++++++++++++++++-----
>  include/linux/kvm.h    |    1 +
>  3 files changed, 51 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
> index d5783dc..e1ba066 100644
> --- a/drivers/kvm/kvm.h
> +++ b/drivers/kvm/kvm.h
> @@ -332,6 +332,7 @@ struct kvm_vcpu_irq {
>       int                  pending;
>       int                  deferred;
>       int                  guest_cpu;
> +     int                  eventfd;
>  };
>  
>  struct kvm_vcpu {
> diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
> index 0c6a62a..7109b66 100644
> --- a/drivers/kvm/kvm_main.c
> +++ b/drivers/kvm/kvm_main.c
> @@ -40,6 +40,7 @@
>  #include <linux/file.h>
>  #include <linux/fs.h>
>  #include <linux/mount.h>
> +#include <linux/eventfd.h>
>  
>  #include "x86_emulate.h"
>  #include "segment_descriptor.h"
> @@ -326,6 +327,7 @@ static struct kvm *kvm_create_vm(void)
>               memset(&vcpu->irq, 0, sizeof(vcpu->irq));
>               spin_lock_init(&vcpu->irq.lock);
>               vcpu->irq.deferred = -1;
> +             vcpu->irq.eventfd   = -1;
>  
>               vcpu->cpu = -1;
>               vcpu->kvm = kvm;
> @@ -2358,6 +2360,7 @@ static void kvm_vcpu_intr(struct kvm_irqsink *this,
>  {
>       struct kvm_vcpu *vcpu = (struct kvm_vcpu*)this->private;
>       int direct_ipi = -1;
> +     int eventfd = -1;
>  
>       spin_lock_irq(&vcpu->irq.lock);
>  
> @@ -2379,7 +2382,14 @@ static void kvm_vcpu_intr(struct kvm_irqsink *this,
>                                */
>                               direct_ipi = vcpu->irq.guest_cpu;
>                               BUG_ON(direct_ipi == smp_processor_id());
> -                     }
> +                     } else
> +                             /*
> +                              * otherwise, we must assume that we could be
> +                              * blocked anywhere, including userspace. Send
> +                              * a signal to give everyone a chance to get
> +                              * notification
> +                              */
> +                             eventfd = vcpu->irq.eventfd;
>               }
>       }
>  
> @@ -2401,6 +2411,12 @@ static void kvm_vcpu_intr(struct kvm_irqsink *this,
>               smp_call_function_single(direct_ipi,
>                                        kvm_vcpu_guest_intr,
>                                        vcpu, 0, 0);
> +
> +     if (eventfd != -1) {
> +             struct file *filp = eventfd_fget(eventfd);
> +             if (!IS_ERR(filp))
> +                     eventfd_signal(filp, 1);
> +     }
>  }
>  
>  static void kvm_vcpu_irqsink_init(struct kvm_vcpu *vcpu)
> @@ -2584,6 +2600,17 @@ static int kvm_vcpu_ioctl_set_fpu(struct kvm_vcpu 
> *vcpu, struct kvm_fpu *fpu)
>       return 0;
>  }
>  
> +static int kvm_vcpu_ioctl_set_eventfd(struct kvm_vcpu *vcpu, int fd)
> +{
> +     if (IS_ERR(eventfd_fget(fd)))
> +             return -EINVAL;
> +
> +     vcpu->irq.eventfd = fd;
> +     smp_wmb();
> +
> +     return 0;
> +}
> +
>  static long kvm_vcpu_ioctl(struct file *filp,
>                          unsigned int ioctl, unsigned long arg)
>  {
> @@ -2753,6 +2780,15 @@ static long kvm_vcpu_ioctl(struct file *filp,
>               r = 0;
>               break;
>       }
> +     case KVM_SET_EVENTFD: {
> +             int eventfd = (long)argp;
> +
> +             r = kvm_vcpu_ioctl_set_eventfd(vcpu, eventfd);
> +             if (r)
> +                     goto out;
> +             r = 0;
> +             break;
> +     }
>       default:
>               ;
>       }
> @@ -2937,12 +2973,19 @@ static long kvm_dev_ioctl(struct file *filp,
>               r = 0;
>               break;
>       }
> -     case KVM_CHECK_EXTENSION:
> -             /*
> -              * No extensions defined at present.
> -              */
> -             r = 0;
> +     case KVM_CHECK_EXTENSION: {
> +             int ext = (long)argp;
> +
> +             switch (ext) {
> +             case KVM_SET_EVENTFD:
> +                     r = 1;
> +                     break;
> +             default:
> +                     r = 0;
> +                     break;
> +             }
>               break;
> +     }
>       case KVM_GET_VCPU_MMAP_SIZE:
>               r = -EINVAL;
>               if (arg)
> diff --git a/include/linux/kvm.h b/include/linux/kvm.h
> index e6edca8..f13ec8c 100644
> --- a/include/linux/kvm.h
> +++ b/include/linux/kvm.h
> @@ -300,5 +300,6 @@ struct kvm_signal_mask {
>  #define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask)
>  #define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu)
>  #define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu)
> +#define KVM_SET_EVENTFD           _IO(KVMIO,   0x8e)
>  
>  #endif
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> kvm-devel mailing list
> kvm-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/kvm-devel
>
>   


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to