qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [V5 1/6] hw/msi: Allow platform devices to use explicit


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [V5 1/6] hw/msi: Allow platform devices to use explicit SID
Date: Mon, 10 Oct 2016 10:34:23 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0


On 10/10/2016 00:11, Michael S. Tsirkin wrote:
> On Tue, Sep 20, 2016 at 08:40:41PM +0300, David Kiarie wrote:
>> When using IOMMU platform devices like IOAPIC are required to make
>> interrupt remapping requests using explicit SID. We associate an MSI
>> route with a requester ID and a PCI device if present which ensures
>> that platform devices can call IOMMU interrupt remapping code with
>> explicit SID. This also ensures compatility with the original code
>> which mainly dealt with PCI devices.
>>
>> Signed-off-by: David Kiarie <address@hidden>
> 
> Paolo, could you please ack the kvm changes?

Acked-by: Paolo Bonzini <address@hidden>

> Thanks!
> 
>> ---
>>  hw/i386/intel_iommu.c             |  3 +++
>>  hw/i386/kvm/pci-assign.c          | 12 ++++++++----
>>  hw/intc/ioapic.c                  | 33 ++++++++++++++++++++++++++-------
>>  hw/misc/ivshmem.c                 |  6 ++++--
>>  hw/vfio/pci.c                     |  6 ++++--
>>  hw/virtio/virtio-pci.c            |  7 +++++--
>>  include/hw/i386/ioapic_internal.h |  1 +
>>  include/hw/i386/x86-iommu.h       |  1 +
>>  include/sysemu/kvm.h              | 25 ++++++++++++++-----------
>>  kvm-all.c                         | 11 +++++++----
>>  kvm-stub.c                        |  5 +++--
>>  target-arm/kvm.c                  |  3 ++-
>>  target-i386/kvm.c                 | 15 +++++++++------
>>  target-mips/kvm.c                 |  3 ++-
>>  target-ppc/kvm.c                  |  3 ++-
>>  target-s390x/kvm.c                |  3 ++-
>>  16 files changed, 93 insertions(+), 44 deletions(-)
>>
>> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
>> index d6e02c8..496d836 100644
>> --- a/hw/i386/intel_iommu.c
>> +++ b/hw/i386/intel_iommu.c
>> @@ -2466,6 +2466,9 @@ static void vtd_realize(DeviceState *dev, Error **errp)
>>      vtd_init(s);
>>      sysbus_mmio_map(SYS_BUS_DEVICE(s), 0, Q35_HOST_BRIDGE_IOMMU_ADDR);
>>      pci_setup_iommu(bus, vtd_host_dma_iommu, dev);
>> +    /* IOMMU expected IOAPIC SID */
>> +    x86_iommu->ioapic_bdf = PCI_BUILD_BDF(Q35_PSEUDO_DEVFN_IOAPIC,
>> +                            Q35_PSEUDO_DEVFN_IOAPIC);
>>      /* Pseudo address space under root PCI bus. */
>>      pcms->ioapic_as = vtd_host_dma_iommu(bus, s, Q35_PSEUDO_DEVFN_IOAPIC);
>>  
>> diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
>> index 8238fbc..3f26be1 100644
>> --- a/hw/i386/kvm/pci-assign.c
>> +++ b/hw/i386/kvm/pci-assign.c
>> @@ -976,7 +976,8 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
>>      if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
>>          int virq;
>>  
>> -        virq = kvm_irqchip_add_msi_route(kvm_state, 0, pci_dev);
>> +        virq = kvm_irqchip_add_msi_route(kvm_state, 0, pci_dev,
>> +                                         pci_requester_id(pci_dev));
>>          if (virq < 0) {
>>              perror("assigned_dev_update_msi: kvm_irqchip_add_msi_route");
>>              return;
>> @@ -1014,7 +1015,8 @@ static void assigned_dev_update_msi_msg(PCIDevice 
>> *pci_dev)
>>      }
>>  
>>      kvm_irqchip_update_msi_route(kvm_state, assigned_dev->msi_virq[0],
>> -                                 msi_get_message(pci_dev, 0), pci_dev);
>> +                                 msi_get_message(pci_dev, 0), pci_dev,
>> +                                 pci_requester_id(pci_dev));
>>      kvm_irqchip_commit_routes(kvm_state);
>>  }
>>  
>> @@ -1078,7 +1080,8 @@ static int assigned_dev_update_msix_mmio(PCIDevice 
>> *pci_dev)
>>              continue;
>>          }
>>  
>> -        r = kvm_irqchip_add_msi_route(kvm_state, i, pci_dev);
>> +        r = kvm_irqchip_add_msi_route(kvm_state, i, pci_dev,
>> +                                      pci_requester_id(pci_dev));
>>          if (r < 0) {
>>              return r;
>>          }
>> @@ -1599,7 +1602,8 @@ static void assigned_dev_msix_mmio_write(void *opaque, 
>> hwaddr addr,
>>  
>>                  ret = kvm_irqchip_update_msi_route(kvm_state,
>>                                                     adev->msi_virq[i], msg,
>> -                                                   pdev);
>> +                                                   pdev,
>> +                                                   pci_requester_id(pdev));
>>                  if (ret) {
>>                      error_report("Error updating irq routing entry (%d)", 
>> ret);
>>                  }
>> diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
>> index 31791b0..fa2b745 100644
>> --- a/hw/intc/ioapic.c
>> +++ b/hw/intc/ioapic.c
>> @@ -95,9 +95,17 @@ static void ioapic_entry_parse(uint64_t entry, struct 
>> ioapic_entry_info *info)
>>          (info->delivery_mode << MSI_DATA_DELIVERY_MODE_SHIFT);
>>  }
>>  
>> -static void ioapic_service(IOAPICCommonState *s)
>> +static void ioapic_as_write(IOAPICCommonState *s, uint32_t data, uint64_t 
>> addr)
>>  {
>>      AddressSpace *ioapic_as = PC_MACHINE(qdev_get_machine())->ioapic_as;
>> +    MemTxAttrs attrs;
>> +
>> +    attrs.requester_id = s->devid;
>> +    address_space_stl_le(ioapic_as, addr, data, attrs, NULL);
>> +}
>> +
>> +static void ioapic_service(IOAPICCommonState *s)
>> +{
>>      struct ioapic_entry_info info;
>>      uint8_t i;
>>      uint32_t mask;
>> @@ -141,7 +149,7 @@ static void ioapic_service(IOAPICCommonState *s)
>>                   * the IOAPIC message into a MSI one, and its
>>                   * address space will decide whether we need a
>>                   * translation. */
>> -                stl_le_phys(ioapic_as, info.addr, info.data);
>> +                ioapic_as_write(s, info.data, info.addr);
>>              }
>>          }
>>      }
>> @@ -197,7 +205,7 @@ static void ioapic_update_kvm_routes(IOAPICCommonState 
>> *s)
>>              ioapic_entry_parse(s->ioredtbl[i], &info);
>>              msg.address = info.addr;
>>              msg.data = info.data;
>> -            kvm_irqchip_update_msi_route(kvm_state, i, msg, NULL);
>> +            kvm_irqchip_update_msi_route(kvm_state, i, msg, NULL, s->devid);
>>          }
>>          kvm_irqchip_commit_routes(kvm_state);
>>      }
>> @@ -379,18 +387,30 @@ static const MemoryRegionOps ioapic_io_ops = {
>>  
>>  static void ioapic_machine_done_notify(Notifier *notifier, void *data)
>>  {
>> -#ifdef CONFIG_KVM
>> +    X86IOMMUState *iommu = x86_iommu_get_default();
>>      IOAPICCommonState *s = container_of(notifier, IOAPICCommonState,
>>                                          machine_done);
>> -
>> +    /* kernel_irqchip=off */
>> +    if (iommu) {
>> +        s->devid = iommu->ioapic_bdf;
>> +    }
>> +#ifdef CONFIG_KVM
>>      if (kvm_irqchip_is_split()) {
>> -        X86IOMMUState *iommu = x86_iommu_get_default();
>> +        MSIMessage msg = {0, 0};
>> +        int i;
>> +
>>          if (iommu) {
>>              /* Register this IOAPIC with IOMMU IEC notifier, so that
>>               * when there are IR invalidates, we can be notified to
>>               * update kernel IR cache. */
>>              x86_iommu_iec_register_notifier(iommu, ioapic_iec_notifier, s);
>> +            /* update IOAPIC routes to the right SID */
>> +            for (i = 0; i < IOAPIC_NUM_PINS; i++) {
>> +                kvm_irqchip_update_msi_route(kvm_state, i, msg, NULL, 
>> s->devid);
>> +            }
>> +            kvm_irqchip_commit_routes(kvm_state);
>>          }
>> +
>>      }
>>  #endif
>>  }
>> @@ -407,7 +427,6 @@ static void ioapic_realize(DeviceState *dev, Error 
>> **errp)
>>  
>>      memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
>>                            "ioapic", 0x1000);
>> -
>>      qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
>>  
>>      ioapics[ioapic_no] = s;
>> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
>> index f803dfd..64995bf 100644
>> --- a/hw/misc/ivshmem.c
>> +++ b/hw/misc/ivshmem.c
>> @@ -318,7 +318,8 @@ static int ivshmem_vector_unmask(PCIDevice *dev, 
>> unsigned vector,
>>  
>>      IVSHMEM_DPRINTF("vector unmask %p %d\n", dev, vector);
>>  
>> -    ret = kvm_irqchip_update_msi_route(kvm_state, v->virq, msg, dev);
>> +    ret = kvm_irqchip_update_msi_route(kvm_state, v->virq, msg, dev,
>> +                                       pci_requester_id(dev));
>>      if (ret < 0) {
>>          return ret;
>>      }
>> @@ -447,7 +448,8 @@ static void ivshmem_add_kvm_msi_virq(IVShmemState *s, 
>> int vector,
>>      IVSHMEM_DPRINTF("ivshmem_add_kvm_msi_virq vector:%d\n", vector);
>>      assert(!s->msi_vectors[vector].pdev);
>>  
>> -    ret = kvm_irqchip_add_msi_route(kvm_state, vector, pdev);
>> +    ret = kvm_irqchip_add_msi_route(kvm_state, vector, pdev,
>> +                                    pci_requester_id(pdev));
>>      if (ret < 0) {
>>          error_setg(errp, "kvm_irqchip_add_msi_route failed");
>>          return;
>> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
>> index a5a620a..1ab083a 100644
>> --- a/hw/vfio/pci.c
>> +++ b/hw/vfio/pci.c
>> @@ -429,7 +429,8 @@ static void vfio_add_kvm_msi_virq(VFIOPCIDevice *vdev, 
>> VFIOMSIVector *vector,
>>          return;
>>      }
>>  
>> -    virq = kvm_irqchip_add_msi_route(kvm_state, vector_n, &vdev->pdev);
>> +    virq = kvm_irqchip_add_msi_route(kvm_state, vector_n, &vdev->pdev,
>> +                                     pci_requester_id(&vdev->pdev));
>>      if (virq < 0) {
>>          event_notifier_cleanup(&vector->kvm_interrupt);
>>          return;
>> @@ -457,7 +458,8 @@ static void vfio_remove_kvm_msi_virq(VFIOMSIVector 
>> *vector)
>>  static void vfio_update_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage msg,
>>                                       PCIDevice *pdev)
>>  {
>> -    kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg, pdev);
>> +    kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg, pdev,
>> +                                 pci_requester_id(pdev));
>>      kvm_irqchip_commit_routes(kvm_state);
>>  }
>>  
>> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
>> index 2d60a00..6108f5b 100644
>> --- a/hw/virtio/virtio-pci.c
>> +++ b/hw/virtio/virtio-pci.c
>> @@ -711,7 +711,8 @@ static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy 
>> *proxy,
>>      int ret;
>>  
>>      if (irqfd->users == 0) {
>> -        ret = kvm_irqchip_add_msi_route(kvm_state, vector, &proxy->pci_dev);
>> +        ret = kvm_irqchip_add_msi_route(kvm_state, vector, &proxy->pci_dev,
>> +                                        pci_requester_id(&proxy->pci_dev));
>>          if (ret < 0) {
>>              return ret;
>>          }
>> @@ -839,12 +840,14 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy 
>> *proxy,
>>      EventNotifier *n = virtio_queue_get_guest_notifier(vq);
>>      VirtIOIRQFD *irqfd;
>>      int ret = 0;
>> +    uint16_t requester_id = pci_requester_id(&proxy->pci_dev);
>>  
>>      if (proxy->vector_irqfd) {
>>          irqfd = &proxy->vector_irqfd[vector];
>>          if (irqfd->msg.data != msg.data || irqfd->msg.address != 
>> msg.address) {
>>              ret = kvm_irqchip_update_msi_route(kvm_state, irqfd->virq, msg,
>> -                                               &proxy->pci_dev);
>> +                                               &proxy->pci_dev,
>> +                                               requester_id);
>>              if (ret < 0) {
>>                  return ret;
>>              }
>> diff --git a/include/hw/i386/ioapic_internal.h 
>> b/include/hw/i386/ioapic_internal.h
>> index a11d86d..d68a24f 100644
>> --- a/include/hw/i386/ioapic_internal.h
>> +++ b/include/hw/i386/ioapic_internal.h
>> @@ -103,6 +103,7 @@ typedef struct IOAPICCommonClass {
>>  struct IOAPICCommonState {
>>      SysBusDevice busdev;
>>      MemoryRegion io_memory;
>> +    uint16_t devid;
>>      uint8_t id;
>>      uint8_t ioregsel;
>>      uint32_t irr;
>> diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h
>> index 0c89d98..5d05865 100644
>> --- a/include/hw/i386/x86-iommu.h
>> +++ b/include/hw/i386/x86-iommu.h
>> @@ -72,6 +72,7 @@ typedef struct IEC_Notifier IEC_Notifier;
>>  
>>  struct X86IOMMUState {
>>      SysBusDevice busdev;
>> +    uint16_t ioapic_bdf;        /* expected IOAPIC SID        */
>>      bool intr_supported;        /* Whether vIOMMU supports IR */
>>      IommuType type;             /* IOMMU type - AMD/Intel     */
>>      QLIST_HEAD(, IEC_Notifier) iec_notifiers; /* IEC notify list */
>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>> index 3e17ba7..2348456 100644
>> --- a/include/sysemu/kvm.h
>> +++ b/include/sysemu/kvm.h
>> @@ -354,7 +354,8 @@ int kvm_arch_on_sigbus(int code, void *addr);
>>  void kvm_arch_init_irq_routing(KVMState *s);
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev);
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id);
>>  
>>  /* Notify arch about newly added MSI routes */
>>  int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
>> @@ -477,18 +478,20 @@ static inline void cpu_synchronize_post_init(CPUState 
>> *cpu)
>>  
>>  /**
>>   * kvm_irqchip_add_msi_route - Add MSI route for specific vector
>> - * @s:      KVM state
>> - * @vector: which vector to add. This can be either MSI/MSIX
>> - *          vector. The function will automatically detect whether
>> - *          MSI/MSIX is enabled, and fetch corresponding MSI
>> - *          message.
>> - * @dev:    Owner PCI device to add the route. If @dev is specified
>> - *          as @NULL, an empty MSI message will be inited.
>> - * @return: virq (>=0) when success, errno (<0) when failed.
>> + * @s:            KVM state
>> + * @vector:       which vector to add. This can be either MSI/MSIX
>> + *                vector. The function will automatically detect whether
>> + *                MSI/MSIX is enabled, and fetch corresponding MSI
>> + *                message.
>> + * @dev:          Owner PCI device to add the route. If @dev is specified
>> + *                as @NULL, an empty MSI message will be inited.
>> + * @requester_id: SID when calling IOMMU code
>> + * @return:       virq (>=0) when success, errno (<0) when failed.
>>   */
>> -int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev);
>> +int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev,
>> +                              uint16_t requester_id);
>>  int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
>> -                                 PCIDevice *dev);
>> +                                 PCIDevice *dev, uint16_t requester_id);
>>  void kvm_irqchip_commit_routes(KVMState *s);
>>  void kvm_irqchip_release_virq(KVMState *s, int virq);
>>  
>> diff --git a/kvm-all.c b/kvm-all.c
>> index 8a4382e..f9b2ff7 100644
>> --- a/kvm-all.c
>> +++ b/kvm-all.c
>> @@ -1246,7 +1246,8 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg)
>>      return kvm_set_irq(s, route->kroute.gsi, 1);
>>  }
>>  
>> -int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
>> +int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev,
>> +                              uint16_t requester_id)
>>  {
>>      struct kvm_irq_routing_entry kroute = {};
>>      int virq;
>> @@ -1275,7 +1276,8 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, 
>> PCIDevice *dev)
>>      kroute.u.msi.address_lo = (uint32_t)msg.address;
>>      kroute.u.msi.address_hi = msg.address >> 32;
>>      kroute.u.msi.data = le32_to_cpu(msg.data);
>> -    if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
>> +    if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data,
>> +                                 requester_id)) {
>>          kvm_irqchip_release_virq(s, virq);
>>          return -EINVAL;
>>      }
>> @@ -1290,7 +1292,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector, 
>> PCIDevice *dev)
>>  }
>>  
>>  int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
>> -                                 PCIDevice *dev)
>> +                                 PCIDevice *dev, uint16_t requester_id)
>>  {
>>      struct kvm_irq_routing_entry kroute = {};
>>  
>> @@ -1308,7 +1310,8 @@ int kvm_irqchip_update_msi_route(KVMState *s, int 
>> virq, MSIMessage msg,
>>      kroute.u.msi.address_lo = (uint32_t)msg.address;
>>      kroute.u.msi.address_hi = msg.address >> 32;
>>      kroute.u.msi.data = le32_to_cpu(msg.data);
>> -    if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data, dev)) {
>> +    if (kvm_arch_fixup_msi_route(&kroute, msg.address, msg.data,
>> +                                 requester_id)) {
>>          return -EINVAL;
>>      }
>>  
>> diff --git a/kvm-stub.c b/kvm-stub.c
>> index 3227127..5f0bee5 100644
>> --- a/kvm-stub.c
>> +++ b/kvm-stub.c
>> @@ -112,7 +112,8 @@ int kvm_on_sigbus(int code, void *addr)
>>  }
>>  
>>  #ifndef CONFIG_USER_ONLY
>> -int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev)
>> +int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev,
>> +                              uint16_t requester_id)
>>  {
>>      return -ENOSYS;
>>  }
>> @@ -126,7 +127,7 @@ void kvm_irqchip_release_virq(KVMState *s, int virq)
>>  }
>>  
>>  int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
>> -                                 PCIDevice *dev)
>> +                                 PCIDevice *dev, uint16_t requester_id)
>>  {
>>      return -ENOSYS;
>>  }
>> diff --git a/target-arm/kvm.c b/target-arm/kvm.c
>> index dbe393c..a221e68 100644
>> --- a/target-arm/kvm.c
>> +++ b/target-arm/kvm.c
>> @@ -617,7 +617,8 @@ int kvm_arm_vgic_probe(void)
>>  }
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev)
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id)
>>  {
>>      return 0;
>>  }
>> diff --git a/target-i386/kvm.c b/target-i386/kvm.c
>> index f1ad805..2e223e0 100644
>> --- a/target-i386/kvm.c
>> +++ b/target-i386/kvm.c
>> @@ -3226,7 +3226,7 @@ void kvm_arch_init_irq_routing(KVMState *s)
>>          /* If the ioapic is in QEMU and the lapics are in KVM, reserve
>>             MSI routes for signaling interrupts to the local apics. */
>>          for (i = 0; i < IOAPIC_NUM_PINS; i++) {
>> -            if (kvm_irqchip_add_msi_route(s, 0, NULL) < 0) {
>> +            if (kvm_irqchip_add_msi_route(s, 0, NULL, 0) < 0) {
>>                  error_report("Could not enable split IRQ mode.");
>>                  exit(1);
>>              }
>> @@ -3394,7 +3394,8 @@ int kvm_device_msix_deassign(KVMState *s, uint32_t 
>> dev_id)
>>  }
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev)
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id)
>>  {
>>      X86IOMMUState *iommu = x86_iommu_get_default();
>>  
>> @@ -3408,9 +3409,8 @@ int kvm_arch_fixup_msi_route(struct 
>> kvm_irq_routing_entry *route,
>>          src.address |= route->u.msi.address_lo;
>>          src.data = route->u.msi.data;
>>  
>> -        ret = class->int_remap(iommu, &src, &dst, dev ? \
>> -                               pci_requester_id(dev) : \
>> -                               X86_IOMMU_SID_INVALID);
>> +        ret = class->int_remap(iommu, &src, &dst, requester_id);
>> +
>>          if (ret) {
>>              trace_kvm_x86_fixup_msi_error(route->gsi);
>>              return 1;
>> @@ -3428,6 +3428,7 @@ typedef struct MSIRouteEntry MSIRouteEntry;
>>  
>>  struct MSIRouteEntry {
>>      PCIDevice *dev;             /* Device pointer */
>> +    uint16_t requester_id;      /* Requesting SID */
>>      int vector;                 /* MSI/MSIX vector index */
>>      int virq;                   /* Virtual IRQ index */
>>      QLIST_ENTRY(MSIRouteEntry) list;
>> @@ -3448,7 +3449,8 @@ static void kvm_update_msi_routes_all(void *private, 
>> bool global,
>>          cnt++;
>>          msg = pci_get_msi_message(entry->dev, entry->vector);
>>          kvm_irqchip_update_msi_route(kvm_state, entry->virq,
>> -                                     msg, entry->dev);
>> +                                     msg, entry->dev,
>> +                                     entry->requester_id);
>>      }
>>      kvm_irqchip_commit_routes(kvm_state);
>>      trace_kvm_x86_update_msi_routes(cnt);
>> @@ -3469,6 +3471,7 @@ int kvm_arch_add_msi_route_post(struct 
>> kvm_irq_routing_entry *route,
>>  
>>      entry = g_new0(MSIRouteEntry, 1);
>>      entry->dev = dev;
>> +    entry->requester_id = pci_requester_id(dev);
>>      entry->vector = vector;
>>      entry->virq = route->gsi;
>>      QLIST_INSERT_HEAD(&msi_route_list, entry, list);
>> diff --git a/target-mips/kvm.c b/target-mips/kvm.c
>> index dcf5fbb..dbb5e59 100644
>> --- a/target-mips/kvm.c
>> +++ b/target-mips/kvm.c
>> @@ -1038,7 +1038,8 @@ int kvm_arch_get_registers(CPUState *cs)
>>  }
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev)
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id)
>>  {
>>      return 0;
>>  }
>> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
>> index dcb68b9..49d313a 100644
>> --- a/target-ppc/kvm.c
>> +++ b/target-ppc/kvm.c
>> @@ -2620,7 +2620,8 @@ error_out:
>>  }
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev)
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id)
>>  {
>>      return 0;
>>  }
>> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
>> index 4b847a3..93aeee4 100644
>> --- a/target-s390x/kvm.c
>> +++ b/target-s390x/kvm.c
>> @@ -2282,7 +2282,8 @@ int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
>>  }
>>  
>>  int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
>> -                             uint64_t address, uint32_t data, PCIDevice 
>> *dev)
>> +                             uint64_t address, uint32_t data,
>> +                             uint16_t requester_id)
>>  {
>>      S390PCIBusDevice *pbdev;
>>      uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
>> -- 
>> 2.1.4



reply via email to

[Prev in Thread] Current Thread [Next in Thread]