From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 3/3] KVM: Enable MSI-X for KVM assigned device Date: Wed, 18 Feb 2009 12:36:10 +0000 Message-ID: <499C00BA.2040008@redhat.com> References: <1234950262-4142-1-git-send-email-sheng@linux.intel.com> <1234950262-4142-4-git-send-email-sheng@linux.intel.com> <499BE6BF.2050904@redhat.com> <20090218122420.GA5055@syang10-desktop> 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 To: Sheng Yang Return-path: Received: from mx2.redhat.com ([66.187.237.31]:42798 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751679AbZBRMfm (ORCPT ); Wed, 18 Feb 2009 07:35:42 -0500 In-Reply-To: <20090218122420.GA5055@syang10-desktop> Sender: kvm-owner@vger.kernel.org List-ID: Sheng Yang wrote: > >>> struct kvm_assigned_msix_nr { >>> __u32 assigned_dev_id; >>> __u16 entry_nr; >>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >>> index 4010802..d3acb37 100644 >>> --- a/virt/kvm/kvm_main.c >>> +++ b/virt/kvm/kvm_main.c >>> @@ -280,13 +280,33 @@ static void kvm_free_assigned_irq(struct kvm *kvm, >>> * now, the kvm state is still legal for probably we also have to wait >>> * interrupt_work done. >>> */ >>> - disable_irq_nosync(assigned_dev->host_irq); >>> - cancel_work_sync(&assigned_dev->interrupt_work); >>> + if (assigned_dev->irq_requested_type & KVM_ASSIGNED_DEV_MSIX) { >>> + int i; >>> + for (i = 0; i < assigned_dev->entries_nr; i++) >>> + disable_irq_nosync(assigned_dev-> >>> + host_msix_entries[i].vector); >>> + >>> + cancel_work_sync(&assigned_dev->interrupt_work); >>> + >>> + for (i = 0; i < assigned_dev->entries_nr; i++) >>> + free_irq(assigned_dev->host_msix_entries[i].vector, >>> + (void *)assigned_dev); >>> + >>> + assigned_dev->entries_nr = 0; >>> + kfree(assigned_dev->host_msix_entries); >>> + kfree(assigned_dev->guest_msix_entries); >>> + pci_disable_msix(assigned_dev->dev); >>> + } else { >>> + /* Deal with MSI and INTx */ >>> + disable_irq_nosync(assigned_dev->host_irq); >>> + cancel_work_sync(&assigned_dev->interrupt_work); >>> >>> >> How about always have an array? That will also allow us to deal with >> INTx where x=B,C,D. >> >> Currently for MSI and INTx the array will hold just one active element. >> > > So array, or bitmap? I remember I changed it to bitmap accounding to your > first comment... > Which bitmap? I'm confused. I'm talking about unifying the existing array (assigned_dev->host_msix_entries[]) with ->host_irq. Also since we need an array for INTx when a function uses INT[BCD]. So we'll have assigned_dev->host_irqs[], each entry can be INTx or MSI or MSIx. > OK. I think array is reasonable, but the length is a problem, as I did before. How long would you like? > MAX(4, KVM_MAX_MSIX_ENTRIES), no? -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.