> On Feb 22, 2022, at 5:40 AM, Stefan Hajnoczi <[email protected]> wrote:
>
> On Thu, Feb 17, 2022 at 02:48:59AM -0500, Jagannathan Raman wrote:
>> +struct RemoteIommuElem {
>> + AddressSpace as;
>> + MemoryRegion mr;
>> +};
>> +
>> +GHashTable *remote_iommu_elem_by_bdf;
>
> A mutable global hash table requires synchronization when device
> emulation runs in multiple threads.
>
> I suggest using pci_setup_iommu()'s iommu_opaque argument to avoid the
> global. If there is only 1 device per remote PCI bus, then there are no
> further synchronization concerns.
OK, will avoid the global. We would need to access the hash table
concurrently since there could be more than one device in the
same bus - so a mutex would be needed here.
>
>> +
>> +#define INT2VOIDP(i) (void *)(uintptr_t)(i)
>> +
>> +static AddressSpace *remote_iommu_find_add_as(PCIBus *pci_bus,
>> + void *opaque, int devfn)
>> +{
>> + struct RemoteIommuElem *elem = NULL;
>> + int pci_bdf = PCI_BUILD_BDF(pci_bus_num(pci_bus), devfn);
>> +
>> + if (!remote_iommu_elem_by_bdf) {
>> + return &address_space_memory;
>> + }
>
> When can this happen? remote_configure_iommu() allocates
> remote_iommu_elem_by_bdf so it should always be non-NULL.
I think we won’t hit this case. g_hash_table_new_full() would always succeed.
Thank you!
--
Jag