[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 18/21] qdev: Have qdev_set_parent_bus() handle device
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 18/21] qdev: Have qdev_set_parent_bus() handle devices already on a bus |
Date: |
Tue, 28 Feb 2017 17:16:13 +0000 |
Instead of qdev_set_parent_bus() silently doing the wrong
thing if it's handed a device that's already on a bus,
have it remove the device from the old bus and add it to
the new one. This is useful for the raspi2 sdcard.
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Igor Mammedov <address@hidden>
Message-id: address@hidden
---
hw/core/qdev.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 06ba02e..923e626 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -102,9 +102,23 @@ static void bus_add_child(BusState *bus, DeviceState
*child)
void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
{
+ bool replugging = dev->parent_bus != NULL;
+
+ if (replugging) {
+ /* Keep a reference to the device while it's not plugged into
+ * any bus, to avoid it potentially evaporating when it is
+ * dereffed in bus_remove_child().
+ */
+ object_ref(OBJECT(dev));
+ bus_remove_child(dev->parent_bus, dev);
+ object_unref(OBJECT(dev->parent_bus));
+ }
dev->parent_bus = bus;
object_ref(OBJECT(bus));
bus_add_child(bus, dev);
+ if (replugging) {
+ object_unref(OBJECT(dev));
+ }
}
/* Create a new device. This only initializes the device state
--
2.7.4
- [Qemu-devel] [PULL 00/21] target-arm queue, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 05/21] armv7m: Make ARMv7M object take memory region link, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 03/21] armv7m: QOMify the armv7m container, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 02/21] armv7m: Move NVICState struct definition into header, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 08/21] armv7m: Don't put core v7M devices under CONFIG_STELLARIS, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 11/21] stm32f205: Rename 'nvic' local to 'armv7m', Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 01/21] armv7m: Abstract out the "load kernel" code, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 04/21] armv7m: Use QOMified armv7m object in armv7m_init(), Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 18/21] qdev: Have qdev_set_parent_bus() handle devices already on a bus,
Peter Maydell <=
- [Qemu-devel] [PULL 17/21] hw/intc/arm_gicv3_kvm: Reset GICv3 cpu interface registers, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 07/21] armv7m: Make bitband device take the address space to access, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 09/21] armv7m: Split systick out from NVIC, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 21/21] bcm2835: add sdhost and gpio controllers, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 15/21] hw/intc/arm_gicv3_kvm: Implement get/put functions, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 10/21] stm32f205: Create armv7m object without using armv7m_init(), Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 14/21] hw/intc/arm_gicv3_kvm: Add ICC_SRE_EL1 register to vmstate, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 16/21] target-arm: Add GICv3CPUState in CPUARMState struct, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 19/21] hw/sd: add card-reparenting function, Peter Maydell, 2017/02/28
- [Qemu-devel] [PULL 20/21] bcm2835_gpio: add bcm2835 gpio controller, Peter Maydell, 2017/02/28