From patchwork Tue Oct 11 18:37:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Herring X-Patchwork-Id: 77520 Delivered-To: patch@linaro.org Received: by 10.140.97.247 with SMTP id m110csp130259qge; Tue, 11 Oct 2016 11:39:02 -0700 (PDT) X-Received: by 10.66.41.17 with SMTP id b17mr9256020pal.53.1476211142134; Tue, 11 Oct 2016 11:39:02 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id sn9si4323175pab.296.2016.10.11.11.39.01; Tue, 11 Oct 2016 11:39:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-usb-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752387AbcJKSiy (ORCPT + 4 others); Tue, 11 Oct 2016 14:38:54 -0400 Received: from mail-oi0-f65.google.com ([209.85.218.65]:34882 "EHLO mail-oi0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750909AbcJKSiw (ORCPT ); Tue, 11 Oct 2016 14:38:52 -0400 Received: by mail-oi0-f65.google.com with SMTP id d132so1992047oib.2 for ; Tue, 11 Oct 2016 11:38:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=P6HtC7rOMu4zEiKHyPpYqGj98cC2R0NlKtd4TFFhjpQ=; b=MGz5//j4M+t7N0pZZ3PlUYOTnb8km+zFdlYSZXDkuWU78z0XCGXVYVbxAttGLQZ1Lf ohKnqfkNBrrPd17ix81gjRBJOw2qxs+vLrB+w1QN2gQT7sUdeZdZEZn2QoA3sN/N6QA/ w3EGCIDXRdfiSxgiIDglf0o31Ir1GCfnXFccbMVKOCBR/vAXUKRCGprwV4eaupypdOI4 JwTsOCQJqVRO8oc6cKsoghCpusbppDwYWrIv0XJlq+nl7b8uL26mfP8BdVRnzLY3AdQu cL1JZZ/yargO0NQxeu8+Kq/cfBFWVCpNLYVButBq0oIIcP+ARfnSx4V1uz9eIisUCVYG JE1A== X-Gm-Message-State: AA6/9RkNWqTiDhJ9afP1EcVFpeOnD8Q4LstPK0MXEvY57g/FsalRWm03Xa1bLM2hpu9rug== X-Received: by 10.202.105.194 with SMTP id e185mr3676147oic.95.1476211083429; Tue, 11 Oct 2016 11:38:03 -0700 (PDT) Received: from rob-hp-laptop.herring.priv (72-48-98-129.dyn.grandenetworks.net. [72.48.98.129]) by smtp.googlemail.com with ESMTPSA id 10sm1567601ota.14.2016.10.11.11.38.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Oct 2016 11:38:02 -0700 (PDT) From: Rob Herring To: Felipe Balbi Cc: Greg Kroah-Hartman , linux-usb@vger.kernel.org Subject: [PATCH] usb: gadget: dummy_hcd: clear struct gadget on removal Date: Tue, 11 Oct 2016 13:37:57 -0500 Message-Id: <20161011183757.16456-1-robh@kernel.org> X-Mailer: git-send-email 2.10.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org The addition of CONFIG_DEBUG_TEST_DRIVER_REMOVE uncovered a bug in dummy_hcd driver. The problem is the gadget's struct device is allocated once in the initcall, so re-probing the device causes this warning: [ 13.516309] kobject (8f92f8b4): tried to init an initialized object, something is seriously wrong. [ 13.518358] CPU: 0 PID: 1 Comm: swapper Not tainted 4.8.0-rc4-00003-gbea5b15 #1 [ 13.520014] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014 [ 13.522207] 8f92f8b4 8f92f8b4 80031d20 88bb56c9 80031d3c 88bb7dd3 898316d4 8f92f8b4 [ 13.524132] 8f92f868 899b8c6c 8f92f8ac 80031d4c 88d83cce 8f92f868 8f92f8ac 80031d58 [ 13.526087] 88d844bb 8f92f868 80031d84 88ef3c1d 00000000 89863eac 00000000 8004f760 [ 13.527980] Call Trace: [ 13.528540] [<88bb56c9>] dump_stack+0x16/0x1d [ 13.529544] [<88bb7dd3>] kobject_init+0x73/0x80 [ 13.530602] [<88d83cce>] device_initialize+0x1e/0xe0 [ 13.531889] [<88d844bb>] device_register+0xb/0x20 [ 13.532997] [<88ef3c1d>] usb_add_gadget_udc_release+0x8d/0x270 [ 13.534333] [<88ef3e9a>] usb_add_gadget_udc+0xa/0x10 [ 13.535465] [<88ef775e>] dummy_udc_probe+0x14e/0x1a0 [ 13.536623] [<88d89781>] platform_drv_probe+0x31/0x90 [ 13.537830] [<88d875aa>] ? driver_sysfs_add+0x6a/0x90 [ 13.539014] [<88d87e3a>] driver_probe_device+0x12a/0x490 [ 13.540228] [<88cbc39b>] ? acpi_driver_match_device+0x36/0x50 [ 13.541658] [<88d88307>] __device_attach_driver+0x77/0x110 [ 13.542946] [<8949712d>] ? klist_next+0x6d/0x10c [ 13.544053] [<88d88290>] ? __driver_attach+0xf0/0xf0 [ 13.545180] [<88d864f7>] bus_for_each_drv+0x47/0x80 [ 13.549626] [<88d87b85>] __device_attach+0xb5/0x130 [ 13.550493] [<88d88290>] ? __driver_attach+0xf0/0xf0 [ 13.551517] [<88d883cd>] device_initial_probe+0xd/0x10 [ 13.552485] [<88d86787>] bus_probe_device+0x77/0x80 [ 13.553298] [<88d8417e>] device_add+0x34e/0x5a0 [ 13.554025] [<88bc4840>] ? kvasprintf_const+0x40/0x90 [ 13.554860] [<88bb7d1b>] ? kobject_set_name_vargs+0x6b/0x90 [ 13.555770] [<88d89e6c>] platform_device_add+0xfc/0x280 [ 13.556640] [<89ad0b84>] init+0x20b/0x2ec [ 13.557317] [<89ad0979>] ? usb_udc_init+0x3f/0x3f [ 13.558154] [<89a96c1d>] do_one_initcall+0x7c/0xfb [ 13.558947] [<89a96d5e>] ? kernel_init_freeable+0xc2/0x15e [ 13.559851] [<89a96d81>] kernel_init_freeable+0xe5/0x15e [ 13.560726] [<894974fb>] kernel_init+0xb/0x100 [ 13.561705] [<888c727c>] ? schedule_tail+0xc/0x50 [ 13.562786] [<894a1942>] ret_from_kernel_thread+0xe/0x24 [ 13.563993] [<894974f0>] ? rest_init+0x110/0x110 Fix this by clearing struct gadget containing the struct device on removal. This could also be fixed by disabling bind/unbind, but that is perhaps a useful feature to simulate device attach/detach. Reported-by: kernel test robot Cc: Felipe Balbi Cc: Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org Signed-off-by: Rob Herring --- drivers/usb/gadget/udc/dummy_hcd.c | 1 + 1 file changed, 1 insertion(+) -- 2.10.0 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c index 77d07904f932..64f3d3cdcb91 100644 --- a/drivers/usb/gadget/udc/dummy_hcd.c +++ b/drivers/usb/gadget/udc/dummy_hcd.c @@ -1060,6 +1060,7 @@ static int dummy_udc_remove(struct platform_device *pdev) device_remove_file(&dum->gadget.dev, &dev_attr_function); usb_del_gadget_udc(&dum->gadget); + memset(&dum->gadget, 0, sizeof(dum->gadget)); return 0; }