> -----Original Message----- > From: Peter Chen <peter.chen@xxxxxxx> > Sent: Saturday, August 1, 2020 2:54 PM > To: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>; balbi@xxxxxxxxxx; > linux-usb@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx> > Subject: RE: [PATCH 1/1] usb: gadget: core: wait gadget device .release finishing > at usb_del_gadget_udc > > > > > > On 20-07-31 10:12:48, Alan Stern wrote: > > > On Fri, Jul 31, 2020 at 02:06:20PM +0000, Peter Chen wrote: > > > > On 20-07-31 14:25:20, Greg Kroah-Hartman wrote: > > > > > On Fri, Jul 31, 2020 at 12:11:32PM +0000, Peter Chen wrote: > > > > > > > > > > Grab a reference from somewhere else and do not give it up for a > > > > > long time. > > > > > > > > > > > > > So wait_for_completion_timeout is suitable? The similar use case > > > > is when we open the file at the USB Drive at Windows, and we click > > > > "Eject", it will say "The device is currently in use", and refuse our "Eject" > > > > operation. > > > > > > > > When we try to remove the gadget, if the gadget is in use, we > > > > could refuse the remove operation, reasonable? > > > > > > No, the real solution is to fix the UDC drivers. They need to > > > allocate the gadget structure dynamically instead of reusing it. > > > And they should have a real release routine that deallocates the gadget structure. > > > > > > Alan Stern > > > > So, the basic routine should like below. I thought the usb_gadget > > should be deallocated before the UDC driver remove itself (UDC device > > is the parent of usb_gadget device), I may not need to wrong about it, > > it is just a memory region, it could release later. > > > > xxx_udc_release(struct device *gadget_dev) { > > struct usb_gadget *gadget = container_of(gadget_dev, struct > > usb_gadget, dev); > > kfree(gadget); > > } > > > > > > xxx_udc_probe(pdev) > > { > > udc_priv_data = kzalloc(sizeof(*udc_priv_data), GFP_KERNEL); > > gadget = kzalloc(sizeof(struct usb_gadget), GFP_KERNEL); > > udc_priv_data->gadget = gadget; > > ... > > usb_add_gadget_udc_release(&pdev->dev, gadget, xxx_udc_release); > > > > } > > > > At xxx_udc_remove(pdev) > > { > > usb_del_gadget_udc(udc_priv_data->gadget); > > /* need to never reference udc_priv_data->gadget any more */ > > udc_priv_data other deinit; > > kfree(udc_priv_data); > > } > > > > Since all structures xxx_udc_release uses are common one, it could > > replace usb_udc_nop_release at udc/core.c. > > > > Since gadget structure is allocated at UDC drivers, I think it should be freed at > the same place. Current common release function at udc/core.c may not a good idea > per our discussion. Could all those allocation and free in UDC core? Have them in one central place will ease/force UDC drivers to correctly handle this. Li Jun > > Peter