vfio: Do not unparent in instance_finalize()
Children are automatically unparented so manually unparenting is unnecessary. Worse, automatic unparenting happens before the instance_finalize() callback of the parent gets called, so object_unparent() calls in the callback will refer to objects that are already unparented, which is semantically incorrect. Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Link: https://lore.kernel.org/r/20250924-use-v4-6-07c6c598f53d@rsg.ci.i.u-tokyo.ac.jp Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0c6d897e38
commit
9b80f8a8e7
2 changed files with 1 additions and 11 deletions
|
|
@ -1159,15 +1159,12 @@ void vfio_vga_quirk_exit(VFIOPCIDevice *vdev)
|
|||
|
||||
void vfio_vga_quirk_finalize(VFIOPCIDevice *vdev)
|
||||
{
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(vdev->vga->region); i++) {
|
||||
while (!QLIST_EMPTY(&vdev->vga->region[i].quirks)) {
|
||||
VFIOQuirk *quirk = QLIST_FIRST(&vdev->vga->region[i].quirks);
|
||||
QLIST_REMOVE(quirk, next);
|
||||
for (j = 0; j < quirk->nr_mem; j++) {
|
||||
object_unparent(OBJECT(&quirk->mem[j]));
|
||||
}
|
||||
g_free(quirk->mem);
|
||||
g_free(quirk->data);
|
||||
g_free(quirk);
|
||||
|
|
@ -1207,14 +1204,10 @@ void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr)
|
|||
void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr)
|
||||
{
|
||||
VFIOBAR *bar = &vdev->bars[nr];
|
||||
int i;
|
||||
|
||||
while (!QLIST_EMPTY(&bar->quirks)) {
|
||||
VFIOQuirk *quirk = QLIST_FIRST(&bar->quirks);
|
||||
QLIST_REMOVE(quirk, next);
|
||||
for (i = 0; i < quirk->nr_mem; i++) {
|
||||
object_unparent(OBJECT(&quirk->mem[i]));
|
||||
}
|
||||
g_free(quirk->mem);
|
||||
g_free(quirk->data);
|
||||
g_free(quirk);
|
||||
|
|
|
|||
|
|
@ -365,12 +365,9 @@ void vfio_region_finalize(VFIORegion *region)
|
|||
for (i = 0; i < region->nr_mmaps; i++) {
|
||||
if (region->mmaps[i].mmap) {
|
||||
munmap(region->mmaps[i].mmap, region->mmaps[i].size);
|
||||
object_unparent(OBJECT(®ion->mmaps[i].mem));
|
||||
}
|
||||
}
|
||||
|
||||
object_unparent(OBJECT(region->mem));
|
||||
|
||||
g_free(region->mem);
|
||||
g_free(region->mmaps);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue