Skip to content

Commit

Permalink
hw/i386/intel_iommu: Simplify vtd_find_as_from_bus_num() logic
Browse files Browse the repository at this point in the history
The vtd_find_as_from_bus_num() function was introduced (in commit
dbaabb2) in a code format that could return an incorrect pointer,
which was later fixed by commit a2e1cd4.
We could have avoided this by writing the if() statement differently.
Do it now, in case this function is re-used. The code is easier to
review (harder to miss bugs).

Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200305102702.31512-1-philmd@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
philmd authored and mstsirkin committed Mar 8, 2020
1 parent f1e92c3 commit a6f65f4
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions hw/i386/intel_iommu.c
Expand Up @@ -987,24 +987,26 @@ static bool vtd_slpte_nonzero_rsvd(uint64_t slpte, uint32_t level)
static VTDBus *vtd_find_as_from_bus_num(IntelIOMMUState *s, uint8_t bus_num)
{
VTDBus *vtd_bus = s->vtd_as_by_bus_num[bus_num];
if (!vtd_bus) {
/*
* Iterate over the registered buses to find the one which
* currently hold this bus number, and update the bus_num
* lookup table:
*/
GHashTableIter iter;
GHashTableIter iter;

g_hash_table_iter_init(&iter, s->vtd_as_by_busptr);
while (g_hash_table_iter_next(&iter, NULL, (void **)&vtd_bus)) {
if (pci_bus_num(vtd_bus->bus) == bus_num) {
s->vtd_as_by_bus_num[bus_num] = vtd_bus;
return vtd_bus;
}
if (vtd_bus) {
return vtd_bus;
}

/*
* Iterate over the registered buses to find the one which
* currently holds this bus number and update the bus_num
* lookup table.
*/
g_hash_table_iter_init(&iter, s->vtd_as_by_busptr);
while (g_hash_table_iter_next(&iter, NULL, (void **)&vtd_bus)) {
if (pci_bus_num(vtd_bus->bus) == bus_num) {
s->vtd_as_by_bus_num[bus_num] = vtd_bus;
return vtd_bus;
}
vtd_bus = NULL;
}
return vtd_bus;

return NULL;
}

/* Given the @iova, get relevant @slptep. @slpte_level will be the last level
Expand Down

0 comments on commit a6f65f4

Please sign in to comment.