mirror of https://gitee.com/openkylin/qemu.git
hw/i386/intel_iommu: Simplify vtd_find_as_from_bus_num() logic
The vtd_find_as_from_bus_num() function was introduced (in commitdbaabb25f
) in a code format that could return an incorrect pointer, which was later fixed by commita2e1cd41cc
. 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>
This commit is contained in:
parent
f1e92c3d52
commit
a6f65f4fc2
|
@ -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)
|
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];
|
VTDBus *vtd_bus = s->vtd_as_by_bus_num[bus_num];
|
||||||
if (!vtd_bus) {
|
GHashTableIter iter;
|
||||||
/*
|
|
||||||
* Iterate over the registered buses to find the one which
|
|
||||||
* currently hold this bus number, and update the bus_num
|
|
||||||
* lookup table:
|
|
||||||
*/
|
|
||||||
GHashTableIter iter;
|
|
||||||
|
|
||||||
g_hash_table_iter_init(&iter, s->vtd_as_by_busptr);
|
if (vtd_bus) {
|
||||||
while (g_hash_table_iter_next(&iter, NULL, (void **)&vtd_bus)) {
|
return 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;
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given the @iova, get relevant @slptep. @slpte_level will be the last level
|
/* Given the @iova, get relevant @slptep. @slpte_level will be the last level
|
||||||
|
|
Loading…
Reference in New Issue