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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
vtd_bus = NULL;
|
||||
if (vtd_bus) {
|
||||
return 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;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Given the @iova, get relevant @slptep. @slpte_level will be the last level
|
||||
|
|
Loading…
Reference in New Issue