Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756529AbcDNQdw (ORCPT ); Thu, 14 Apr 2016 12:33:52 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33515 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756424AbcDNQdt (ORCPT ); Thu, 14 Apr 2016 12:33:49 -0400 From: Tal Shorer To: b-liu@ti.com, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Tal Shorer Subject: [PATCH 0/1] usb: musb: nuke endpoint before setting its descriptor to NULL Date: Thu, 14 Apr 2016 19:33:42 +0300 Message-Id: <1460651623-7022-1-git-send-email-tal.shorer@gmail.com> X-Mailer: git-send-email 2.5.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5069 Lines: 67 Hello, I compiled and installed linux-4.6-rc3 on my beagle bone black and noticed that when I unload a gadget using f_sourcesink (namely g_zero), a kernel panic occurs: [ 12.531504] Unable to handle kernel NULL pointer dereference at virtual address 00000005 [ 12.540100] pgd = de6a4000 [ 12.542984] [00000005] *pgd=9e702831, *pte=00000000, *ppte=00000000 [ 12.549713] Internal error: Oops: 17 [#1] SMP ARM [ 12.554713] Modules linked in: usb_f_ss_lb g_zero(-) libcomposite musb_dsps musb_hdrc cppi41 udc_core usbcore omap_rng rng_core musb_am335x rtc_omap omap_wdt cpufreq_dt thermal_sys leds_gpio hwmon led_class [ 12.574519] CPU: 0 PID: 139 Comm: modprobe Not tainted 4.6.0-rc3 #3 [ 12.581165] Hardware name: Generic AM33XX (Flattened Device Tree) [ 12.587632] task: de65e400 ti: de6ce000 task.ti: de6ce000 [ 12.593391] PC is at source_sink_free_instance+0x24/0xfc [usb_f_ss_lb] [ 12.600327] LR is at source_sink_complete+0x174/0x480 [usb_f_ss_lb] [ 12.606980] pc : [] lr : [] psr: 80000093 [ 12.606980] sp : de6cfe40 ip : bf0a4074 fp : 00000000 [ 12.619141] r10: de685d80 r9 : dd00a000 r8 : 20000093 [ 12.624688] r7 : de685d80 r6 : dd123000 r5 : 00000000 r4 : dd1804e8 [ 12.631609] r3 : 00000000 r2 : bf0d2900 r1 : de5a4280 r0 : dd123000 [ 12.638536] Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none [ 12.646196] Control: 10c5387d Table: 9e6a4019 DAC: 00000051 [ 12.652292] Process modprobe (pid: 139, stack limit = 0xde6ce218) [ 12.658758] Stack: (0xde6cfe40 to 0xde6d0000) [ 12.663409] fe40: dd1804e8 dd1804e8 de5a4280 dd123000 de685d80 20000093 dd00a000 e0b72410 [ 12.672096] fe60: 00000000 bf0d6d2c 60000093 dd180010 dd180010 dd1804e8 00000001 de5a4280 [ 12.680781] fe80: dd180010 dd1804e8 00000001 bf09900c c0c0965c bf0ad7ec e0b72410 dd180010 [ 12.689467] fea0: dd1804e8 dd180538 dd180010 bf0b2c84 20000093 bf0adf28 dd1804e8 de685d80 [ 12.698152] fec0: dd180f0c dd1804e8 c0107984 de6ce000 00000000 bf0d68f8 dd102740 de6cff00 [ 12.706838] fee0: c0107984 de685d80 dd180fec bf0d7aa8 dd180f0c dd123000 de685d80 00000000 [ 12.715523] ff00: 00000081 bf0d7b00 dd180fec bf0c4bec bf0ca000 bf0c4c18 de685d80 de685ddc [ 12.724209] ff20: 60000013 bf0c51d4 dd175800 dd1811b0 00000080 bf09974c bf0d2a10 dd175800 [ 12.732895] ff40: bf0d2a10 bf099814 bf0d247c bf0d2ac0 000af6d0 c01c5350 00000000 657a5f67 [ 12.741579] ff60: 00006f72 c0cc5d9c de65e400 00000000 de6ce000 00000000 00000000 c0155754 [ 12.750264] ff80: 00000000 de6ce000 b6f4348c 000af6b0 00000001 001078bc b6f4348c 000af6b0 [ 12.758949] ffa0: 00000001 c01077e0 b6f4348c 000af6b0 000af6d0 00000080 00000001 00000000 [ 12.767633] ffc0: b6f4348c 000af6b0 00000001 00000081 000af638 00000000 000af6b0 00000000 [ 12.776319] ffe0: b6eed3e8 beb1bb70 0001b160 b6eed3f4 a0000010 000af6d0 9fdf6861 9fdf6c61 [ 12.785029] [] (source_sink_free_instance [usb_f_ss_lb]) from [] (source_sink_complete+0x174/0x480 [usb_f_ss_lb]) [ 12.797779] [] (source_sink_complete [usb_f_ss_lb]) from [] (usb_gadget_giveback_request+0xc/0x10 [udc_core]) [ 12.810188] [] (usb_gadget_giveback_request [udc_core]) from [] (musb_g_giveback+0x118/0x614 [musb_hdrc]) [ 12.822218] [] (musb_g_giveback [musb_hdrc]) from [] (musb_gadget_disable+0x130/0x1d8 [musb_hdrc]) [ 12.833590] [] (musb_gadget_disable [musb_hdrc]) from [] (sourcesink_get_alt+0x3c/0x78 [usb_f_ss_lb]) [ 12.845227] [] (sourcesink_get_alt [usb_f_ss_lb]) from [] (disable_endpoints+0x24/0x84 [usb_f_ss_lb]) [ 12.856864] [] (disable_endpoints [usb_f_ss_lb]) from [] (disable_endpoints+0x7c/0x84 [usb_f_ss_lb]) [ 12.868447] [] (disable_endpoints [usb_f_ss_lb]) from [] (config_ep_by_speed+0x28c/0x3ac [libcomposite]) [ 12.880379] [] (config_ep_by_speed [libcomposite]) from [] (composite_disconnect+0x2c/0x54 [libcomposite]) [ 12.892484] [] (composite_disconnect [libcomposite]) from [] (usb_gadget_state_work+0x90/0xf4 [udc_core]) [ 12.904488] [] (usb_gadget_state_work [udc_core]) from [] (usb_gadget_unregister_driver+0x64/0xc4 [udc_core]) [ 12.916868] [] (usb_gadget_unregister_driver [udc_core]) from [] (SyS_delete_module+0x11c/0x1e4) [ 12.928048] [] (SyS_delete_module) from [] (ret_fast_syscall+0x0/0x1c) [ 12.936829] Code: e5905080 e5933024 e3550002 e592a01c (e5d39005) [ 12.943314] ---[ end trace 87c865532163a167 ]--- I traced the issue to f_sourcesink trying to use a struct usb_ep's dest field after it's set to NULL by musb_gadget.c This patch fixes this problem by moving the clearing of ep->desc to occur after calling the complete() callbacks for all requests. Tal Shorer (1): usb: musb: gadget: nuke endpoint before setting its descriptor to NULL drivers/usb/musb/musb_gadget.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -- 2.5.0