Files
linux/include/linux
Dmitry Safonov effa467870 iommu/vt-d: Don't queue_iova() if there is no flush queue
Intel VT-d driver was reworked to use common deferred flushing
implementation. Previously there was one global per-cpu flush queue,
afterwards - one per domain.

Before deferring a flush, the queue should be allocated and initialized.

Currently only domains with IOMMU_DOMAIN_DMA type initialize their flush
queue. It's probably worth to init it for static or unmanaged domains
too, but it may be arguable - I'm leaving it to iommu folks.

Prevent queuing an iova flush if the domain doesn't have a queue.
The defensive check seems to be worth to keep even if queue would be
initialized for all kinds of domains. And is easy backportable.

On 4.19.43 stable kernel it has a user-visible effect: previously for
devices in si domain there were crashes, on sata devices:

 BUG: spinlock bad magic on CPU#6, swapper/0/1
  lock: 0xffff88844f582008, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
 CPU: 6 PID: 1 Comm: swapper/0 Not tainted 4.19.43 #1
 Call Trace:
  <IRQ>
  dump_stack+0x61/0x7e
  spin_bug+0x9d/0xa3
  do_raw_spin_lock+0x22/0x8e
  _raw_spin_lock_irqsave+0x32/0x3a
  queue_iova+0x45/0x115
  intel_unmap+0x107/0x113
  intel_unmap_sg+0x6b/0x76
  __ata_qc_complete+0x7f/0x103
  ata_qc_complete+0x9b/0x26a
  ata_qc_complete_multiple+0xd0/0xe3
  ahci_handle_port_interrupt+0x3ee/0x48a
  ahci_handle_port_intr+0x73/0xa9
  ahci_single_level_irq_intr+0x40/0x60
  __handle_irq_event_percpu+0x7f/0x19a
  handle_irq_event_percpu+0x32/0x72
  handle_irq_event+0x38/0x56
  handle_edge_irq+0x102/0x121
  handle_irq+0x147/0x15c
  do_IRQ+0x66/0xf2
  common_interrupt+0xf/0xf
 RIP: 0010:__do_softirq+0x8c/0x2df

The same for usb devices that use ehci-pci:
 BUG: spinlock bad magic on CPU#0, swapper/0/1
  lock: 0xffff88844f402008, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
 CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.19.43 #4
 Call Trace:
  <IRQ>
  dump_stack+0x61/0x7e
  spin_bug+0x9d/0xa3
  do_raw_spin_lock+0x22/0x8e
  _raw_spin_lock_irqsave+0x32/0x3a
  queue_iova+0x77/0x145
  intel_unmap+0x107/0x113
  intel_unmap_page+0xe/0x10
  usb_hcd_unmap_urb_setup_for_dma+0x53/0x9d
  usb_hcd_unmap_urb_for_dma+0x17/0x100
  unmap_urb_for_dma+0x22/0x24
  __usb_hcd_giveback_urb+0x51/0xc3
  usb_giveback_urb_bh+0x97/0xde
  tasklet_action_common.isra.4+0x5f/0xa1
  tasklet_action+0x2d/0x30
  __do_softirq+0x138/0x2df
  irq_exit+0x7d/0x8b
  smp_apic_timer_interrupt+0x10f/0x151
  apic_timer_interrupt+0xf/0x20
  </IRQ>
 RIP: 0010:_raw_spin_unlock_irqrestore+0x17/0x39

Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Cc: iommu@lists.linux-foundation.org
Cc: <stable@vger.kernel.org> # 4.14+
Fixes: 13cf017446 ("iommu/vt-d: Make use of iova deferred flushing")
Signed-off-by: Dmitry Safonov <dima@arista.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
2019-07-22 17:43:06 +02:00
..
2019-06-20 09:23:22 +02:00
2019-05-31 11:13:10 +02:00
2018-05-26 09:16:44 +02:00
2019-07-10 09:00:57 -06:00
2019-05-14 19:52:50 -07:00
2019-07-01 08:18:54 -06:00
2019-07-10 09:00:57 -06:00
2019-07-10 09:00:57 -06:00
2018-11-07 13:44:59 -07:00
2018-11-07 13:44:59 -07:00
2019-04-09 17:05:46 -07:00
2019-05-07 08:39:02 -06:00
2018-06-15 18:10:01 -03:00
2019-06-12 20:27:13 +02:00
2019-07-18 09:49:30 +02:00
2018-03-26 15:09:38 +02:00
2018-08-22 10:52:48 -07:00
2018-11-13 21:55:24 +01:00
2019-02-28 03:28:53 -05:00
2019-06-12 20:30:39 +02:00
2019-02-28 08:24:23 -07:00
2018-12-19 10:42:08 +01:00
2019-04-22 09:48:12 -06:00
2019-02-15 16:54:38 +01:00
2019-07-05 21:34:50 +02:00
2019-06-26 13:19:46 -07:00
2018-11-19 19:03:46 -07:00
2018-06-22 13:43:27 +09:00
2019-06-10 13:00:24 +02:00
2019-04-08 22:56:14 +02:00
2018-07-12 21:35:28 +02:00
2019-07-05 15:19:10 -07:00
2018-11-30 13:29:04 +00:00
2018-04-12 09:41:19 -07:00
2019-03-07 18:32:03 -08:00
2018-06-07 17:34:35 -07:00
2018-03-26 13:14:43 -04:00
2018-03-26 13:14:43 -04:00
2019-01-30 20:51:47 -05:00
2018-10-17 13:56:58 -07:00
2019-07-08 19:25:19 -07:00
2019-06-13 09:02:33 -04:00
2019-02-20 07:22:17 -07:00
2019-02-20 07:22:10 -07:00
2019-07-09 14:15:37 -07:00
2018-12-06 15:45:46 +01:00
2019-02-08 15:02:49 -08:00
2018-07-10 17:22:35 +02:00
2018-06-07 17:34:36 -07:00
2018-10-21 10:46:39 -04:00
2019-07-16 19:23:25 -07:00
2018-10-08 22:53:10 +11:00
2019-05-14 19:52:51 -07:00
2019-06-12 11:42:13 +02:00
2019-06-15 12:25:49 +02:00
2019-05-14 19:52:48 -07:00
2018-07-20 01:11:45 +02:00
2018-05-11 17:28:45 -07:00
2019-04-02 17:57:35 +02:00
2019-05-08 22:14:36 +02:00
2018-09-25 20:17:35 -07:00
2019-05-31 12:37:46 -07:00
2019-05-16 15:51:55 -07:00
2018-07-07 17:25:23 +02:00
2019-07-09 14:32:14 -06:00
2019-02-07 16:38:35 +01:00
2019-07-08 10:51:25 +02:00
2018-06-20 11:35:56 +02:00
2019-07-12 11:05:43 -07:00
2018-10-11 09:16:44 -07:00
2019-06-27 21:22:15 +08:00
2019-02-07 00:13:27 +01:00
2019-07-07 11:50:03 +02:00
2018-12-10 10:17:45 +01:00
2019-01-11 18:05:40 -08:00
2019-06-05 11:54:38 +02:00
2018-09-11 14:11:51 +02:00
2019-05-15 17:35:54 +01:00
2019-04-09 15:14:49 -06:00
2018-12-22 12:15:29 +01:00
2019-07-10 09:00:57 -06:00
2018-05-14 09:51:34 -04:00