Message ID | 1401452542-11080-3-git-send-email-arei.gonglei@huawei.com |
---|---|
State | New |
Headers | show |
Hi, > +static void usb_ohci_exit(PCIDevice *dev) > +{ > + OHCIPCIState *ohci = PCI_OHCI(dev); > + OHCIState *s = &ohci->state; > + > + memory_region_destroy(&s->mem); > + > + if (!ohci->masterbus) { > + usb_bus_release(&s->bus); > + } > +} This is incomplete. At minimum you have to care about s->eof_timer. Same goes for the other host adapters. There can be timers running and there might be in-flight usb requests which must be property teared down, to make sure we don't use-after-free hostadapter state in callbacks. cheers, Gerd
> -----Original Message----- > From: Gerd Hoffmann [mailto:kraxel@redhat.com] > Sent: Monday, June 02, 2014 3:45 PM > To: Gonglei (Arei) > Cc: qemu-devel@nongnu.org; Luonengjun; Huangweidong (C); Huangpeng > (Peter) > Subject: Re: [PATCH 2/6] usb-ohci: add exit function > > Hi, > > > +static void usb_ohci_exit(PCIDevice *dev) > > +{ > > + OHCIPCIState *ohci = PCI_OHCI(dev); > > + OHCIState *s = &ohci->state; > > + > > + memory_region_destroy(&s->mem); > > + > > + if (!ohci->masterbus) { > > + usb_bus_release(&s->bus); > > + } > > +} > > This is incomplete. At minimum you have to care about s->eof_timer. > Agreed. > Same goes for the other host adapters. There can be timers running and > there might be in-flight usb requests which must be property teared > down, to make sure we don't use-after-free hostadapter state in > callbacks. > I will check and complete them. Thanks. Best regards, -Gonglei
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index cd87074..3add206 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -1952,6 +1952,18 @@ static int usb_ohci_initfn_pci(PCIDevice *dev) return 0; } +static void usb_ohci_exit(PCIDevice *dev) +{ + OHCIPCIState *ohci = PCI_OHCI(dev); + OHCIState *s = &ohci->state; + + memory_region_destroy(&s->mem); + + if (!ohci->masterbus) { + usb_bus_release(&s->bus); + } +} + #define TYPE_SYSBUS_OHCI "sysbus-ohci" #define SYSBUS_OHCI(obj) OBJECT_CHECK(OHCISysBusState, (obj), TYPE_SYSBUS_OHCI) @@ -2092,6 +2104,7 @@ static void ohci_pci_class_init(ObjectClass *klass, void *data) PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); k->init = usb_ohci_initfn_pci; + k->exit = usb_ohci_exit; k->vendor_id = PCI_VENDOR_ID_APPLE; k->device_id = PCI_DEVICE_ID_APPLE_IPID_USB; k->class_id = PCI_CLASS_SERIAL_USB;