On Thursday 12 March 2009 21:36:44 Sheng Yang wrote: > From: Marcelo Tosatti <mtosatti@xxxxxxxxxx> > > Signed-off-by: Sheng Yang <sheng@xxxxxxxxxxxxxxx> Oops.. Should be Marcelo's signed-off here... -- regards Yang, Sheng > --- > libkvm/libkvm.c | 38 +++++++++++++++++++++++++++++++++++++- > libkvm/libkvm.h | 21 +++++++++++++++++---- > 2 files changed, 54 insertions(+), 5 deletions(-) > > diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c > index 0ac1c28..80a0481 100644 > --- a/libkvm/libkvm.c > +++ b/libkvm/libkvm.c > @@ -1141,7 +1141,7 @@ int kvm_assign_pci_device(kvm_context_t kvm, > return ret; > } > > -int kvm_assign_irq(kvm_context_t kvm, > +static int kvm_old_assign_irq(kvm_context_t kvm, > struct kvm_assigned_irq *assigned_irq) > { > int ret; > @@ -1152,6 +1152,42 @@ int kvm_assign_irq(kvm_context_t kvm, > > return ret; > } > + > +#ifdef KVM_CAP_ASSIGN_DEV_IRQ > +int kvm_assign_irq(kvm_context_t kvm, > + struct kvm_assigned_irq *assigned_irq) > +{ > + int ret; > + > + ret = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ); > + if (ret > 0) { > + ret = ioctl(kvm->vm_fd, KVM_ASSIGN_DEV_IRQ, assigned_irq); > + if (ret < 0) > + return -errno; > + return ret; > + } > + > + return kvm_old_assign_irq(kvm, assigned_irq); > +} > + > +int kvm_deassign_irq(kvm_context_t kvm, > + struct kvm_assigned_irq *assigned_irq) > +{ > + int ret; > + > + ret = ioctl(kvm->vm_fd, KVM_DEASSIGN_DEV_IRQ, assigned_irq); > + if (ret < 0) > + return -errno; > + > + return ret; > +} > +#else > +int kvm_assign_irq(kvm_context_t kvm, > + struct kvm_assigned_irq *assigned_irq) > +{ > + return kvm_old_assign_irq(kvm, assigned_irq); > +} > +#endif > #endif > > #ifdef KVM_CAP_DEVICE_DEASSIGNMENT > diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h > index 0239cb6..3e5efe0 100644 > --- a/libkvm/libkvm.h > +++ b/libkvm/libkvm.h > @@ -715,11 +715,10 @@ int kvm_assign_pci_device(kvm_context_t kvm, > struct kvm_assigned_pci_dev *assigned_dev); > > /*! > - * \brief Notifies host kernel about changes to IRQ for an assigned device > + * \brief Assign IRQ for an assigned device > * > - * Used for PCI device assignment, this function notifies the host > - * kernel about the changes in IRQ number for an assigned physical > - * PCI device. > + * Used for PCI device assignment, this function assigns IRQ numbers for > + * an physical device and guest IRQ handling. > * > * \param kvm Pointer to the current kvm_context > * \param assigned_irq Parameters, like dev id, host irq, guest irq, etc > @@ -727,6 +726,20 @@ int kvm_assign_pci_device(kvm_context_t kvm, > int kvm_assign_irq(kvm_context_t kvm, > struct kvm_assigned_irq *assigned_irq); > > +#ifdef KVM_CAP_ASSIGN_DEV_IRQ > +/*! > + * \brief Deassign IRQ for an assigned device > + * > + * Used for PCI device assignment, this function deassigns IRQ numbers > + * for an assigned device. > + * > + * \param kvm Pointer to the current kvm_context > + * \param assigned_irq Parameters, like dev id, host irq, guest irq, etc > + */ > +int kvm_deassign_irq(kvm_context_t kvm, > + struct kvm_assigned_irq *assigned_irq); > +#endif > + > /*! > * \brief Determines whether destroying memory regions is allowed > * -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html