On Fri, 2019-05-31 at 08:44 +0300, Felipe Balbi wrote: > Hi, > > Chunfeng Yun <chunfeng.yun@xxxxxxxxxxxx> writes: > > > Hi Felipe, > > On Tue, 2019-05-28 at 11:11 +0300, Felipe Balbi wrote: > >> Hi, > >> > >> Chunfeng Yun <chunfeng.yun@xxxxxxxxxxxx> writes: > >> > diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c > >> > index 7fcb9f782931..88b3ee03a12d 100644 > >> > --- a/drivers/usb/core/usb.c > >> > +++ b/drivers/usb/core/usb.c > >> > @@ -1190,7 +1190,7 @@ EXPORT_SYMBOL_GPL(usb_debug_root); > >> > > >> > static void usb_debugfs_init(void) > >> > { > >> > - usb_debug_root = debugfs_create_dir("usb", NULL); > >> > + usb_debug_root = debugfs_create_dir(USB_DEBUG_ROOT_NAME, NULL); > >> > debugfs_create_file("devices", 0444, usb_debug_root, NULL, > >> > &usbfs_devices_fops); > >> > } > >> > >> might be a better idea to move this to usb common. Then have a function > >> which can be called by both host and gadget to maybe create the > >> directory: > >> > >> static struct dentry *usb_debug_root; > >> > >> struct dentry *usb_debugfs_init(void) > >> { > >> if (!usb_debug_root) > >> usb_debug_root = debugfs_create_dir("usb", NULL); > >> > >> return usb_debug_root; > >> } > >> > >> > >> Then usb core would be updated to something like: > >> > >> static void usb_core_debugfs_init(void) > >> { > >> struct dentry *root = usb_debugfs_init(); > >> > >> debugfs_create_file("devices", 0444, root, NULL, &usbfs_devices_fops); > >> } > >> > > I find a problem when move usb_debugfs_init() and usb_debugfs_cleanup() > > into usb common, it's easy to create "usb" directory, but difficult to > > cleanup it: > > > > common/common.c > > > > struct dentry *usb_debugfs_init(void) > > { > > if (!usb_debug_root) > > usb_debug_root = debugfs_create_dir("usb", NULL); > > > > return usb_debug_root; > > } > > > > void usb_debugfs_cleanup(void) > > { > > debugfs_remove_recursive(usb_debug_root); > > usb_debug_root = NULL; > > } > > > > core/usb.c > > > > static void usb_core_debugfs_init(void) > > { > > struct dentry *root = usb_debugfs_init(); > > > > debugfs_create_file("devices", 0444, root, NULL, > > &usbfs_devices_fops); > > } > > > > static int __init usb_init(void) > > { > > ... > > usb_core_debugfs_init(); > > ... > > } > > > > static void __exit usb_exit(void) > > { > > ... > > usb_debugfs_cleanup(); > > // will be error, gadget may use it. > > ... > > } > > > > gadget/udc/core.c > > > > static int __init usb_udc_init(void) > > { > > ... > > usb_debugfs_init(); > > ... > > } > > > > static void __exit usb_udc_exit(void) > > { > > ... > > usb_debugfs_cleanup(); > > // can't cleanup in fact, usb core may use it. > > } > > > > How to handle this case? introduce a reference count? do you have any > > suggestion? > > I guess a simple refcount is the way to go: > > struct dentry *usb_debugfs_init(void) > { > if (!usb_debug_root) > usb_debug_root = debugfs_create_dir("usb", NULL); > > usb_debug_root_refcnt++; > return usb_debug_root; > } > > void usb_debugfs_cleanup(void) > { > if (!(--usb_debug_root_refcnt)) { > debugfs_remove_recursive(usb_debug_root); > usb_debug_root = NULL; > } > } I'll try it, thanks > > Or something along those lines >