[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v8 12/17] vfio-user: IOMMU support for remote device
From: |
Jag Raman |
Subject: |
Re: [PATCH v8 12/17] vfio-user: IOMMU support for remote device |
Date: |
Mon, 25 Apr 2022 17:30:19 +0000 |
> On Apr 25, 2022, at 5:38 AM, Stefan Hajnoczi <stefanha@redhat.com> wrote:
>
> On Wed, Apr 20, 2022 at 11:15:16AM +0000, Jag Raman wrote:
>>
>>
>>> On Apr 19, 2022, at 4:45 PM, Jag Raman <jag.raman@oracle.com> wrote:
>>>
>>> Assign separate address space for each device in the remote processes.
>>>
>>> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
>>> Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
>>> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
>>> ---
>>> include/hw/remote/iommu.h | 40 +++++++++++++
>>> hw/remote/iommu.c | 114 ++++++++++++++++++++++++++++++++++++++
>>> hw/remote/machine.c | 13 ++++-
>>> MAINTAINERS | 2 +
>>> hw/remote/meson.build | 1 +
>>> 5 files changed, 169 insertions(+), 1 deletion(-)
>>> create mode 100644 include/hw/remote/iommu.h
>>> create mode 100644 hw/remote/iommu.c
>>>
>>> diff --git a/include/hw/remote/iommu.h b/include/hw/remote/iommu.h
>>> new file mode 100644
>>> index 0000000000..33b68a8f4b
>>> --- /dev/null
>>> +++ b/include/hw/remote/iommu.h
>>> @@ -0,0 +1,40 @@
>>> +/**
>>> + * Copyright © 2022 Oracle and/or its affiliates.
>>> + *
>>> + * This work is licensed under the terms of the GNU GPL, version 2 or
>>> later.
>>> + * See the COPYING file in the top-level directory.
>>> + *
>>> + */
>>> +
>>> +#ifndef REMOTE_IOMMU_H
>>> +#define REMOTE_IOMMU_H
>>> +
>>> +#include "hw/pci/pci_bus.h"
>>> +#include "hw/pci/pci.h"
>>> +
>>> +#ifndef INT2VOIDP
>>> +#define INT2VOIDP(i) (void *)(uintptr_t)(i)
>>> +#endif
>>> +
>>> +typedef struct RemoteIommuElem {
>>> + MemoryRegion *mr;
>>> +
>>> + AddressSpace as;
>>> +} RemoteIommuElem;
>>> +
>>> +#define TYPE_REMOTE_IOMMU "x-remote-iommu"
>>> +OBJECT_DECLARE_SIMPLE_TYPE(RemoteIommu, REMOTE_IOMMU)
>>> +
>>> +struct RemoteIommu {
>>> + Object parent;
>>> +
>>> + GHashTable *elem_by_devfn;
>>> +
>>> + QemuMutex lock;
>>> +};
>>> +
>>> +void remote_iommu_setup(PCIBus *pci_bus);
>>> +
>>> +void remote_iommu_unplug_dev(PCIDevice *pci_dev);
>>> +
>>> +#endif
>>> diff --git a/hw/remote/iommu.c b/hw/remote/iommu.c
>>> new file mode 100644
>>> index 0000000000..16c6b0834e
>>> --- /dev/null
>>> +++ b/hw/remote/iommu.c
>>> @@ -0,0 +1,114 @@
>>> +/**
>>> + * IOMMU for remote device
>>> + *
>>> + * Copyright © 2022 Oracle and/or its affiliates.
>>> + *
>>> + * This work is licensed under the terms of the GNU GPL, version 2 or
>>> later.
>>> + * See the COPYING file in the top-level directory.
>>> + *
>>> + */
>>> +
>>> +#include "qemu/osdep.h"
>>> +#include "qemu-common.h"
>>> +
>>> +#include "hw/remote/iommu.h"
>>> +#include "hw/pci/pci_bus.h"
>>> +#include "hw/pci/pci.h"
>>> +#include "exec/memory.h"
>>> +#include "exec/address-spaces.h"
>>> +#include "trace.h"
>>> +
>>> +static AddressSpace *remote_iommu_find_add_as(PCIBus *pci_bus,
>>> + void *opaque, int devfn)
>>> +{
>>> + RemoteIommu *iommu = opaque;
>>> + RemoteIommuElem *elem = NULL;
>>> +
>>> + qemu_mutex_lock(&iommu->lock);
>>> +
>>> + elem = g_hash_table_lookup(iommu->elem_by_devfn, INT2VOIDP(devfn));
>>> +
>>> + if (!elem) {
>>> + elem = g_malloc0(sizeof(RemoteIommuElem));
>>> + g_hash_table_insert(iommu->elem_by_devfn, INT2VOIDP(devfn), elem);
>>> + }
>>> +
>>> + if (!elem->mr) {
>>> + elem->mr = MEMORY_REGION(object_new(TYPE_MEMORY_REGION));
>>> + memory_region_set_size(elem->mr, UINT64_MAX);
>>> + address_space_init(&elem->as, elem->mr, NULL);
>>
>> Hi,
>>
>> I’d like to add a note here.
>>
>> We tried to add "elem->mr” as a child of PCIDevice. That way, when PCIDevice
>> is
>> unplugged, the child is also finalized.
>
> Do you mean via a memory_region_init()-family function where a parent
> object is given? Or do you mean by adding a QOM child property?
I mean by adding “elem->mr” as a QOM child property of PCIDevice.
>
>> However, there was some issue with hotplug. During the hotplug, there’s a
>> window
>> during initialization where we couldn’t lookup the PCIDevice by “devfn”.
>>
>> do_pci_register_device() -> pci_init_bus_master() ->
>> pci_device_iommu_address_space()
>> happens before do_pci_register_device() -> “bus->devices[devfn] = pci_dev”.
>> As such,
>> pci_find_device() doesn’t work at this time.
>
> I don't follow. What calls pci_find_device()?
To add the MemoryRegion as a child of PCIDevice, remote_iommu_find_add_as()
would need to lookup the PCIDevice using devfn. The function that looks up
PCIDevice by devfn is pci_find_device().
The above note explains why we didn’t lookup the PCIDevice using
pci_find_device()
and then adding the MemoryRegion as its child.
Thank you!
--
Jag
>
> Stefan
- Re: [PATCH v8 02/17] qdev: unplug blocker for devices, (continued)
[PATCH v8 07/17] vfio-user: define vfio-user-server object, Jagannathan Raman, 2022/04/19
[PATCH v8 03/17] remote/machine: add HotplugHandler for remote machine, Jagannathan Raman, 2022/04/19
[PATCH v8 01/17] tests/avocado: Specify target VM argument to helper routines, Jagannathan Raman, 2022/04/19
[PATCH v8 09/17] vfio-user: find and init PCI device, Jagannathan Raman, 2022/04/19
[PATCH v8 12/17] vfio-user: IOMMU support for remote device, Jagannathan Raman, 2022/04/19
Re: [PATCH v8 12/17] vfio-user: IOMMU support for remote device, Stefan Hajnoczi, 2022/04/25
[PATCH v8 04/17] remote/machine: add vfio-user property, Jagannathan Raman, 2022/04/19
Re: [PATCH v8 00/17] vfio-user server in QEMU, Stefan Hajnoczi, 2022/04/25