From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 6/8] KVM: assigned dev: Preparation for mask support in userspace Date: Wed, 20 Oct 2010 11:30:47 +0200 Message-ID: <4CBEB6C7.3090501@redhat.com> References: <1287563192-29685-1-git-send-email-sheng@linux.intel.com> <1287563192-29685-7-git-send-email-sheng@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org, "Michael S. Tsirkin" To: Sheng Yang Return-path: Received: from mx1.redhat.com ([209.132.183.28]:6082 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751865Ab0JTJav (ORCPT ); Wed, 20 Oct 2010 05:30:51 -0400 In-Reply-To: <1287563192-29685-7-git-send-email-sheng@linux.intel.com> Sender: kvm-owner@vger.kernel.org List-ID: On 10/20/2010 10:26 AM, Sheng Yang wrote: > The feature wouldn't be enabled until later patch set msix_flags_enabled. It > would be enabled along with mask support in kernel. > > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index e209078..2bb69ba 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -456,6 +456,8 @@ struct kvm_arch { > /* fields used by HYPER-V emulation */ > u64 hv_guest_os_id; > u64 hv_hypercall; > + > + bool msix_flags_enabled; > }; In theory this should be in generic code, under #ifdef KVM_APIC_ARCHITECTURE. In practice x86 is fine since ia64 isn't actively developed. > @@ -666,11 +666,35 @@ msix_nr_out: > return r; > } > > +static void update_msix_mask(struct kvm_assigned_dev_kernel *assigned_dev, > + int index) > +{ > + int irq; > + struct irq_desc *desc; > + > + if (!assigned_dev->dev->msix_enabled || > + !(assigned_dev->irq_requested_type& KVM_DEV_IRQ_HOST_MSIX)) > + return; > + > + irq = assigned_dev->host_msix_entries[index].vector; > + BUG_ON(irq == 0); > + desc = irq_to_desc(irq); > + BUG_ON(!desc->msi_desc); > + > + if (assigned_dev->guest_msix_entries[index].flags& > + KVM_ASSIGNED_MSIX_MASK) { > + desc->chip->mask(irq); > + flush_work(&assigned_dev->interrupt_work); > + } else > + desc->chip->unmask(irq); > +} > + > static int kvm_vm_ioctl_set_msix_entry(struct kvm *kvm, > struct kvm_assigned_msix_entry *entry) > { > int r = 0, i; > struct kvm_assigned_dev_kernel *adev; > + bool entry_masked; > > mutex_lock(&kvm->lock); > > @@ -688,6 +712,21 @@ static int kvm_vm_ioctl_set_msix_entry(struct kvm *kvm, > adev->guest_msix_entries[i].entry = entry->entry; > adev->guest_msix_entries[i].vector = entry->gsi; > adev->host_msix_entries[i].entry = entry->entry; > + if (!kvm->arch.msix_flags_enabled) > + break; > + entry_masked = adev->guest_msix_entries[i].flags& > + KVM_ASSIGNED_MSIX_MASK; > + if ((entry->flags& KVM_MSIX_FLAG_MASK)&& > + !entry_masked) { > + adev->guest_msix_entries[i].flags |= > + KVM_ASSIGNED_MSIX_MASK; > + update_msix_mask(adev, i); > + } else if (!(entry->flags& KVM_MSIX_FLAG_MASK)&& > + entry_masked) { > + adev->guest_msix_entries[i].flags&= > + ~KVM_ASSIGNED_MSIX_MASK; > + update_msix_mask(adev, i); > + } > break; > } I think you can fold these two functions together, will get rid of the extra if and be a little more readable. -- error compiling committee.c: too many arguments to function