On Thu, Aug 31 2017, Kees Cook wrote: > With timer initialization made earlier at the start, there is no reason > to make del_timer_sync() calls conditionally, there by removing the > assignments and tests of the .data field. > > Cc: Felipe Balbi <balbi@xxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: Raviteja Garimella <raviteja.garimella@xxxxxxxxxxxx> > Cc: Michal Nazarewicz <mina86@xxxxxxxxxx> > Cc: "Gustavo A. R. Silva" <garsilva@xxxxxxxxxxxxxx> > Cc: linux-usb@xxxxxxxxxxxxxxx > Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx> > --- > drivers/usb/gadget/udc/snps_udc_core.c | 16 +++++----------- > 1 file changed, 5 insertions(+), 11 deletions(-) > > diff --git a/drivers/usb/gadget/udc/snps_udc_core.c b/drivers/usb/gadget/udc/snps_udc_core.c > index 5460e5ba1c3c..1607e901e16b 100644 > --- a/drivers/usb/gadget/udc/snps_udc_core.c > +++ b/drivers/usb/gadget/udc/snps_udc_core.c > @@ -3067,14 +3067,12 @@ void udc_remove(struct udc *dev) > stop_timer++; > if (timer_pending(&udc_timer)) > wait_for_completion(&on_exit); > - if (udc_timer.data) > - del_timer_sync(&udc_timer); > + del_timer_sync(&udc_timer); > /* remove pollstall timer */ > stop_pollstall_timer++; > if (timer_pending(&udc_pollstall_timer)) > wait_for_completion(&on_pollstall_exit); > - if (udc_pollstall_timer.data) > - del_timer_sync(&udc_pollstall_timer); > + del_timer_sync(&udc_pollstall_timer); > udc = NULL; > } > EXPORT_SYMBOL_GPL(udc_remove); > @@ -3164,9 +3162,9 @@ int udc_probe(struct udc *dev) > u32 reg; > int retval; > > - /* mark timer as not initialized */ > - udc_timer.data = 0; > - udc_pollstall_timer.data = 0; > + /* timer init */ > + setup_timer(&udc_timer, udc_timer_function, 0); > + setup_timer(&udc_pollstall_timer, udc_pollstall_timer_function, 0); > > /* device struct setup */ > dev->gadget.ops = &udc_ops; > @@ -3206,10 +3204,6 @@ int udc_probe(struct udc *dev) > if (retval) > goto finished; > > - /* timer init */ > - setup_timer(&udc_timer, udc_timer_function, 1); > - setup_timer(&udc_pollstall_timer, udc_pollstall_timer_function, 1); > - > /* set SD */ > reg = readl(&dev->regs->ctl); > reg |= AMD_BIT(UDC_DEVCTL_SD); Stupid question, is the check in udc_remove even necessary? udc_probe is called from udc_plat_probe: if (udc_probe(udc)) { ret = -ENODEV; goto exit_dma; } If the call fails, udc_plat_probe cleans up after itself and noticeably *does not* call udc_remove. As far as I understand, if probe callback fails, remove callback is *not* called. Meanwhile, udc_remove is called from the remove callback which is udc_plat_remove. So, udc_remove can be called only if udc_probe succeeds. It seems to me that a better patch is: --- a/drivers/usb/gadget/udc/snps_udc_core.c +++ b/drivers/usb/gadget/udc/snps_udc_core.c @@ -3067,14 +3067,12 @@ void udc_remove(struct udc *dev) stop_timer++; if (timer_pending(&udc_timer)) wait_for_completion(&on_exit); - if (udc_timer.data) - del_timer_sync(&udc_timer); + del_timer_sync(&udc_timer); /* remove pollstall timer */ stop_pollstall_timer++; if (timer_pending(&udc_pollstall_timer)) wait_for_completion(&on_pollstall_exit); - if (udc_pollstall_timer.data) - del_timer_sync(&udc_pollstall_timer); + del_timer_sync(&udc_pollstall_timer); udc = NULL; } EXPORT_SYMBOL_GPL(udc_remove); @@ -3164,9 +3162,9 @@ int udc_probe(struct udc *dev) u32 reg; int retval; - /* mark timer as not initialized */ - udc_timer.data = 0; - udc_pollstall_timer.data = 0; - /* device struct setup */ dev->gadget.ops = &udc_ops; -- Best regards ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ «If at first you don’t succeed, give up skydiving» -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html