KVM: Fix device assignment threaded irq handler
The kernel no longer allows us to pass NULL for the hard handler without also specifying IRQF_ONESHOT. IRQF_ONESHOT imposes latency in the exit path that we don't need for MSI interrupts. Long term we'd like to inject these interrupts from the hard handler when possible. In the short term, we can create dummy hard handlers that return us to the previous behavior. Credit to Michael for original patch. Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=43328 Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Родитель
055c9fa887
Коммит
a76beb1412
|
@ -334,6 +334,11 @@ static int assigned_device_enable_host_intx(struct kvm *kvm,
|
|||
}
|
||||
|
||||
#ifdef __KVM_HAVE_MSI
|
||||
static irqreturn_t kvm_assigned_dev_msi(int irq, void *dev_id)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static int assigned_device_enable_host_msi(struct kvm *kvm,
|
||||
struct kvm_assigned_dev_kernel *dev)
|
||||
{
|
||||
|
@ -346,7 +351,7 @@ static int assigned_device_enable_host_msi(struct kvm *kvm,
|
|||
}
|
||||
|
||||
dev->host_irq = dev->dev->irq;
|
||||
if (request_threaded_irq(dev->host_irq, NULL,
|
||||
if (request_threaded_irq(dev->host_irq, kvm_assigned_dev_msi,
|
||||
kvm_assigned_dev_thread_msi, 0,
|
||||
dev->irq_name, dev)) {
|
||||
pci_disable_msi(dev->dev);
|
||||
|
@ -358,6 +363,11 @@ static int assigned_device_enable_host_msi(struct kvm *kvm,
|
|||
#endif
|
||||
|
||||
#ifdef __KVM_HAVE_MSIX
|
||||
static irqreturn_t kvm_assigned_dev_msix(int irq, void *dev_id)
|
||||
{
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static int assigned_device_enable_host_msix(struct kvm *kvm,
|
||||
struct kvm_assigned_dev_kernel *dev)
|
||||
{
|
||||
|
@ -374,7 +384,8 @@ static int assigned_device_enable_host_msix(struct kvm *kvm,
|
|||
|
||||
for (i = 0; i < dev->entries_nr; i++) {
|
||||
r = request_threaded_irq(dev->host_msix_entries[i].vector,
|
||||
NULL, kvm_assigned_dev_thread_msix,
|
||||
kvm_assigned_dev_msix,
|
||||
kvm_assigned_dev_thread_msix,
|
||||
0, dev->irq_name, dev);
|
||||
if (r)
|
||||
goto err;
|
||||
|
|
Загрузка…
Ссылка в новой задаче