From: Jan Kiszka <jan.kiszka@siemens.com>
To: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, kvm <kvm@vger.kernel.org>,
Alex Williamson <alex.williamson@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [PATCH v4 9/9] KVM: Allow host IRQ sharing for passed-through PCI 2.3 devices
Date: Tue, 09 Nov 2010 14:35:34 +0100 [thread overview]
Message-ID: <4CD94E26.3030007@siemens.com> (raw)
In-Reply-To: <4CD94C5A.1080504@redhat.com>
Am 09.11.2010 14:27, Avi Kivity wrote:
> On 11/08/2010 01:21 PM, Jan Kiszka wrote:
>> PCI 2.3 allows to generically disable IRQ sources at device level. This
>> enables us to share IRQs of such devices between on the host side when
>> passing them to a guest. This feature is optional, user space has to
>> request it explicitly. Moreover, user space can inform us about its view
>> of PCI_COMMAND_INTX_DISABLE so that we can avoid unmasking the interrupt
>> and signaling it if the guest masked it via the PCI config space.
>>
>
> It's a pity this cannot be done transparently. We could detect multiple
> devices sharing the line,
Even that is not possible. Assigned or host devices may be activated
after we registered exclusively, pushing the breakage from VM start-up
to a different operation.
> but what about PCI_COMMAND_INTX_DISABLE?
>
> Perhaps we can hook the kernel's handler for this bit?
Some IRQ registration notifier that would allow us to reregister our
handler with IRQ sharing support? Maybe.
>
>>
>> /* Depends on KVM_CAP_IOMMU */
>> #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1<< 0)
>> +/* The following two depend on KVM_CAP_PCI_2_3 */
>> +#define KVM_DEV_ASSIGN_PCI_2_3 (1<< 1)
>> +#define KVM_DEV_ASSIGN_MASK_INTX (1<< 2)
>> +
>> +If KVM_DEV_ASSIGN_PCI_2_3 is set, the kernel will manage legacy INTx interrupts
>> +via the PCI-2.3-compliant device-level mask, thus enable IRQ sharing with other
>> +assigned devices or host devices. KVM_DEV_ASSIGN_MASK_INTX specifies the
>> +guest's view on the INTx mask, see KVM_ASSIGN_SET_INTX_MASK for details.
>>
>> 4.48 KVM_DEASSIGN_PCI_DEVICE
>>
>> @@ -1263,6 +1271,23 @@ struct kvm_assigned_msix_entry {
>> __u16 padding[3];
>> };
>>
>> +5.54 KVM_ASSIGN_SET_INTX_MASK
>
> 4.54?
Of course.
>
> (54? wow.)
And I don't think all IOCTLs are already documented (though the majority
now).
>
>> +
>> +Capability: KVM_CAP_PCI_2_3
>> +Architectures: x86
>> +Type: vm ioctl
>> +Parameters: struct kvm_assigned_pci_dev (in)
>> +Returns: 0 on success, -1 on error
>> +
>> +Informs the kernel about the guest's view on the INTx mask. As long as the
>> +guest masks the legacy INTx, the kernel will refrain from unmasking it at
>> +hardware level and will not assert the guest's IRQ line. User space is still
>> +responsible for applying this state to the assigned device's real config space.
>
> What if userspace lies?
User space problem. We will at worst receive one IRQ, mask it, and then
user space need to react again.
>
>> +
>> +See KVM_ASSIGN_DEV_IRQ for the data structure. The target device is specified
>> +by assigned_dev_id. In the flags field, only KVM_DEV_ASSIGN_MASK_INTX is
>> +evaluated.
>> +
>>
>> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
>> index fe83eb0..7f1627c 100644
>> --- a/include/linux/kvm_host.h
>> +++ b/include/linux/kvm_host.h
>> @@ -468,6 +468,7 @@ struct kvm_assigned_dev_kernel {
>> unsigned int entries_nr;
>> int host_irq;
>> bool host_irq_disabled;
>> + bool pci_2_3;
>> struct msix_entry *host_msix_entries;
>> int guest_irq;
>> struct msix_entry *guest_msix_entries;
>> @@ -477,6 +478,7 @@ struct kvm_assigned_dev_kernel {
>> struct pci_dev *dev;
>> struct kvm *kvm;
>> spinlock_t intx_lock;
>> + struct mutex intx_mask_lock;
>> char irq_name[32];
>> };
>
> I saw no reason this can't be a spinlock, but perhaps I missed
> something. This would allow us to avoid srcu, which is slightly more
> expensive than rcu. Since pci 2.3 assigned devices are not a major use
> case, I'd like not to penalize the mainstream users for this.
The lock has to be held across kvm_set_irq, which is the potentially
expensive (O(n), n == number of VCPUs) operation.
>
> This patch undoes some of the niceness of the previous patches, but I
> have no alternative to suggest.
>
Yes, it surely does not make things simpler. But much of the complexity
is avoided during runtime when MSIs are used.
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
next prev parent reply other threads:[~2010-11-09 13:35 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-08 11:21 [PATCH v4 0/9] KVM: Improve IRQ assignment for device passthrough Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 1/9] KVM: Fix srcu struct leakage Jan Kiszka
2010-11-08 17:00 ` Michael S. Tsirkin
2010-11-08 17:32 ` Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 2/9] KVM: Switch IRQ subsystem to SRCU Jan Kiszka
2010-11-09 10:49 ` Avi Kivity
2010-11-09 11:21 ` Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 3/9] KVM: Clear assigned guest IRQ on release Jan Kiszka
2010-11-09 10:58 ` Avi Kivity
2010-11-09 11:20 ` Jan Kiszka
2010-11-09 18:36 ` Alex Williamson
2010-11-10 6:53 ` Avi Kivity
2010-11-26 10:36 ` Michael S. Tsirkin
2010-11-08 11:21 ` [PATCH v4 4/9] KVM: Switch assigned device IRQ forwarding to threaded handler Jan Kiszka
2010-11-09 12:26 ` Avi Kivity
2010-11-09 12:36 ` Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 5/9] KVM: Refactor IRQ names of assigned devices Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 6/9] KVM: Save/restore state of assigned PCI device Jan Kiszka
2010-11-09 12:35 ` Avi Kivity
2010-11-09 13:29 ` Jan Kiszka
2010-11-09 13:36 ` Avi Kivity
2010-11-09 13:44 ` Jan Kiszka
2010-11-09 13:46 ` Avi Kivity
2010-11-09 16:41 ` Don Dutile
2010-11-08 11:21 ` [PATCH v4 7/9] KVM: Clean up kvm_vm_ioctl_assigned_device Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 8/9] KVM: Document device assigment API Jan Kiszka
2010-11-08 11:21 ` [PATCH v4 9/9] KVM: Allow host IRQ sharing for passed-through PCI 2.3 devices Jan Kiszka
2010-11-09 13:27 ` Avi Kivity
2010-11-09 13:35 ` Jan Kiszka [this message]
2010-11-09 13:41 ` Avi Kivity
2010-11-09 14:11 ` Jan Kiszka
2010-11-09 14:20 ` Avi Kivity
2010-11-16 16:55 ` [PATCH v4 0/9] KVM: Improve IRQ assignment for device passthrough Marcelo Tosatti
2010-11-16 18:26 ` Jan Kiszka
2010-11-17 8:25 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CD94E26.3030007@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mst@redhat.com \
--cc=mtosatti@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.