Received: by 10.223.185.116 with SMTP id b49csp2256757wrg; Sun, 4 Mar 2018 22:48:13 -0800 (PST) X-Google-Smtp-Source: AG47ELtarep57YnrYRe3H0Kv3EyLBUSyCaIbe02L3zOKOBXG4AVElape1iWWosUUyHDcRS0Zt03f X-Received: by 10.99.96.200 with SMTP id u191mr11449443pgb.252.1520232493828; Sun, 04 Mar 2018 22:48:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520232493; cv=none; d=google.com; s=arc-20160816; b=O39aKzZnRGQSNvHXAnA9SSJl+rpq6+up6tNTd18Q19QoSavETRIjqXMXhCcaXcEwC5 zTFRhcigOJWzbxdAbO/DmFcUb0/6k8SGL+pMzEDq4/pG3m6nGfifHCiDFIs978/iJ/Bh 2HuwOh6ni9CKyV9YMrbz51L3Fy68LznByC59427/2LRSU+aA3QdGNnhfT2YTnJ23UJTg hu6BT3fYTYBeMXNjl76qK96XyN1EVDF5G7tf0pkKv5CzH1qRapCRDyNvf4Uzwdx5V7UY stCF7rmcF5AoQTQzUgg+KFQdmCGQD5nSNO63jzsMSedoZNLTS+OzkoyCNtAwk04GYQf6 33cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=jHAFF2wVRTJr75iD0sz8wXmQpeNBPh+Ld06GGGkqDOo=; b=YVLxxIqyyyEmpKVlAhlXTjukBIIG0WGIs5uL/CGZgc7bSypdbb43B38nc79qdqOY2M +uMGiMs1zCXWA/bnCxMRwEcj6ZbTzcqiGdFG73OfF6IwxxbXW4EPwf/zWqmmPPF8Yzrm rxztCBEQFFXPLwkSQHAFzdLLDg2oJAmKi1QN5fsGypB/yijZvHW6ZQW1BWnq5f+xnoV/ CJRuMimxnAe6oMT1CSQ1uISF5PLCJWxJLEu/4esuoGHAPA6j+pd8nDggLz07lyDPXXYW mJMILZifdHMowIyOwYXIYVx+fjFxMulcGadJcube8S44Y0UBa0ISGxKx/LhnBRR49YmP IvAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=q3WGSweM; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m1-v6si9119716pli.332.2018.03.04.22.47.27; Sun, 04 Mar 2018 22:48:13 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=q3WGSweM; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932929AbeCEFw7 (ORCPT + 99 others); Mon, 5 Mar 2018 00:52:59 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:39324 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932662AbeCEFw5 (ORCPT ); Mon, 5 Mar 2018 00:52:57 -0500 Received: by mail-wr0-f195.google.com with SMTP id w77so15938785wrc.6 for ; Sun, 04 Mar 2018 21:52:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=jHAFF2wVRTJr75iD0sz8wXmQpeNBPh+Ld06GGGkqDOo=; b=q3WGSweMaDfC+nyH+qsS/7cETj4m1wOCgdrBtq3TR/L+xIL8VReeD9p6plR90/TvpH 3xwS/bx4ww/TgKaX0mQVMX1ZgVUJuIryWtDgRWtolIcueYeQGgfR9MLyrO/NKUFPXdk8 4XsLu3QcAm2oS2Bs1bOogwwp0CaLYrtkxsFXTOInxkNaM9Y2PPsSd7NIyKPEDrSfVLm2 Hn+xQ6OCaGnFkISH9NMsGzykwfy6vu/kf8qTSFHvkb4xFK48lpSIYangOBzS6XeRPjY7 Cc5ZHrCpzfhKiMKmCzHHtQo/AgN8MTBbesTnAtV/4MXWmMXVd9PR2rcp9Jk0XbzMf0sM vHVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=jHAFF2wVRTJr75iD0sz8wXmQpeNBPh+Ld06GGGkqDOo=; b=L8nRXobUOabezK+ZBEzfCoSkSdIM2c+1po9e5mQrN+Gtqik7uT1KsGpxGUtBZoGjh7 5FBttQArJkcDmHfYXdPq1qHrGonWvaeyJo8JXnTflSuYcwakF0EKtbtdUIztZ1ViEzrs 3Jl15rV1FnirAlcTlq9dzABoWyuIYDtBguK6keIdUNPF/KTVJle0grWUpoHSxThpTEo6 aCt6DfDQCjKyQpITGNnQAWn8LfIx2W70VfxRipslgfvuFvTNJm4m8kOJicOhDBmiQnqG Ux4r1uD1nLBD+TlrG0XQ5A5/LOu/4jb6f6gcdmetIsCMaoXXUJTi7NTiETMt4FTWued0 s37g== X-Gm-Message-State: APf1xPC2umKyJgujJlIVyg58c1yPj98+jaxd1XH0AFcMso75dFiO9jCr WFHmDOfKySWD3u3OkClLt+4= X-Received: by 10.223.153.23 with SMTP id x23mr11112065wrb.134.1520229175666; Sun, 04 Mar 2018 21:52:55 -0800 (PST) Received: from gentoo0.localdomain (x4dbb238c.dyn.telefonica.de. [77.187.35.140]) by smtp.gmail.com with ESMTPSA id e17sm12251243wri.42.2018.03.04.21.52.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 04 Mar 2018 21:52:54 -0800 (PST) From: Kirill Marinushkin To: Eric Anholt , Stefan Wahren , Florian Fainelli , Ray Jui , Scott Branden Cc: Kirill Marinushkin , Greg Kroah-Hartman , bcm-kernel-feedback-list@broadcom.com, Michael Zoran , linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH] staging: bcm2835-audio: Release resources on module_exit() Date: Mon, 5 Mar 2018 06:52:54 +0100 Message-Id: <20180305055254.29875-1-k.marinushkin@gmail.com> X-Mailer: git-send-email 2.13.6 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the current implementation, `rmmod snd_bcm2835` does not release resources properly. It causes an oops when trying to list sound devices. This commit fixes it. Steps to reproduce: ~~~~ $ rmmod snd_bcm2835 $ aplay -L [ 138.648130] Unable to handle kernel paging request at virtual address 7f1343c0 [ 138.660415] pgd = ad8f0000 [ 138.665567] [7f1343c0] *pgd=3864c811, *pte=00000000, *ppte=00000000 [ 138.674887] Internal error: Oops: 7 [#1] SMP ARM [ 138.683571] Modules linked in: sha256_generic cfg80211 rfkill snd_pcm snd_timer snd fixed uio_pdrv_genirq uio ip_tables x_tables ipv6 [last unloaded: snd_bcm2835 ] [ 138.706594] CPU: 3 PID: 463 Comm: aplay Tainted: G WC 4.15.0-rc1-v 7+ #6 [ 138.719833] Hardware name: BCM2835 [ 138.726016] task: b877ac00 task.stack: aebec000 [ 138.733408] PC is at try_module_get+0x38/0x24c [ 138.740813] LR is at snd_ctl_open+0x58/0x194 [snd] [ 138.748485] pc : [<801c4d5c>] lr : [<7f0e6b2c>] psr: 20000013 [ 138.757709] sp : aebedd60 ip : aebedd88 fp : aebedd84 [ 138.765884] r10: 00000000 r9 : 00000004 r8 : 7f0ed440 [ 138.774040] r7 : b7e469b0 r6 : 7f0e6b2c r5 : afd91900 r4 : 7f1343c0 [ 138.783571] r3 : aebec000 r2 : 00000001 r1 : b877ac00 r0 : 7f1343c0 [ 138.793084] Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user [ 138.803300] Control: 10c5387d Table: 2d8f006a DAC: 00000055 [ 138.812064] Process aplay (pid: 463, stack limit = 0xaebec210) [ 138.820868] Stack: (0xaebedd60 to 0xaebee000) [ 138.828207] dd60: 00000000 b848d000 afd91900 00000000 b7e469b0 7f0ed440 aebedda4 aebedd88 [ 138.842371] dd80: 7f0e6b2c 801c4d30 afd91900 7f0ea4dc 00000000 b7e469b0 aebeddcc aebedda8 [ 138.856611] dda0: 7f0e250c 7f0e6ae0 7f0e2464 b8478ec0 b7e469b0 afd91900 7f0ea388 00000000 [ 138.870864] ddc0: aebeddf4 aebeddd0 802ce590 7f0e2470 8090ab64 afd91900 afd91900 b7e469b0 [ 138.885301] dde0: afd91908 802ce4e4 aebede1c aebeddf8 802c57b4 802ce4f0 afd91900 aebedea8 [ 138.900110] de00: b7fa4c00 00000000 00000000 00000004 aebede3c aebede20 802c6ba8 802c56b4 [ 138.915260] de20: aebedea8 00000000 aebedf5c 00000000 aebedea4 aebede40 802d9a68 802c6b58 [ 138.930661] de40: b874ddd0 00000000 00000000 00000001 00000041 00000000 afd91900 aebede70 [ 138.946402] de60: 00000000 00000000 00000002 b7e469b0 b8a87610 b8d6ab80 801852f8 00080000 [ 138.962314] de80: aebedf5c aebedea8 00000001 80108464 aebec000 00000000 aebedf4c aebedea8 [ 138.978414] dea0: 802dacd4 802d970c b8a87610 b8d6ab80 a7982bc6 00000009 af363019 b9231480 [ 138.994617] dec0: 00000000 b8c038a0 b7e469b0 00000101 00000002 00000238 00000000 00000000 [ 139.010823] dee0: 00000000 aebedee8 00080000 0000000f aebedf3c aebedf00 802ed7e4 80843f94 [ 139.027025] df00: 00000003 00080000 b9231490 b9231480 00000000 00080000 af363000 00000000 [ 139.043229] df20: 00000005 00000002 ffffff9c 00000000 00080000 ffffff9c af363000 00000003 [ 139.059430] df40: aebedf94 aebedf50 802c6f70 802dac70 aebec000 00000000 00000001 00000000 [ 139.075629] df60: 00020000 00000004 00000100 00000001 7ebe577c 0002e038 00000000 00000005 [ 139.091828] df80: 80108464 aebec000 aebedfa4 aebedf98 802c7060 802c6e6c 00000000 aebedfa8 [ 139.108025] dfa0: 801082c0 802c7040 7ebe577c 0002e038 7ebe577c 00080000 00000b98 e81c8400 [ 139.124222] dfc0: 7ebe577c 0002e038 00000000 00000005 7ebe57e4 00a20af8 7ebe57f0 76f87394 [ 139.140419] dfe0: 00000000 7ebe55c4 76ec88e8 76df1d9c 60000010 7ebe577c 00000000 00000000 [ 139.156715] [<801c4d5c>] (try_module_get) from [<7f0e6b2c>] (snd_ctl_open+0x58/0x194 [snd]) [ 139.173222] [<7f0e6b2c>] (snd_ctl_open [snd]) from [<7f0e250c>] (snd_open+0xa8/0x14c [snd]) [ 139.189683] [<7f0e250c>] (snd_open [snd]) from [<802ce590>] (chrdev_open+0xac/0x188) [ 139.205465] [<802ce590>] (chrdev_open) from [<802c57b4>] (do_dentry_open+0x10c/0x314) [ 139.221347] [<802c57b4>] (do_dentry_open) from [<802c6ba8>] (vfs_open+0x5c/0x88) [ 139.236788] [<802c6ba8>] (vfs_open) from [<802d9a68>] (path_openat+0x368/0x944) [ 139.248270] [<802d9a68>] (path_openat) from [<802dacd4>] (do_filp_open+0x70/0xc4) [ 139.263731] [<802dacd4>] (do_filp_open) from [<802c6f70>] (do_sys_open+0x110/0x1d4) [ 139.279378] [<802c6f70>] (do_sys_open) from [<802c7060>] (SyS_open+0x2c/0x30) [ 139.290647] [<802c7060>] (SyS_open) from [<801082c0>] (ret_fast_syscall+0x0/0x28) [ 139.306021] Code: e3c3303f e5932004 e2822001 e5832004 (e5943000) [ 139.316265] ---[ end trace 7f3f7f6193b663ed ]--- [ 139.324956] note: aplay[463] exited with preempt_count 1 ~~~~ Signed-off-by: Kirill Marinushkin Cc: Eric Anholt Cc: Stefan Wahren Cc: Greg Kroah-Hartman Cc: Florian Fainelli Cc: Ray Jui Cc: Scott Branden Cc: bcm-kernel-feedback-list@broadcom.com Cc: Michael Zoran Cc: linux-rpi-kernel@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: devel@driverdev.osuosl.org Cc: linux-kernel@vger.kernel.org --- .../staging/vc04_services/bcm2835-audio/bcm2835.c | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c index 8f2d508183b2..01187df7d85f 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c @@ -36,6 +36,11 @@ MODULE_PARM_DESC(enable_compat_alsa, static void snd_devm_unregister_child(struct device *dev, void *res) { struct device *childdev = *(struct device **)res; + struct snd_card *snd_card = + (struct snd_card *)dev_get_drvdata(childdev); + + snd_card_free(snd_card); + dev_set_drvdata(childdev, NULL); device_unregister(childdev); } @@ -61,6 +66,11 @@ static int snd_devm_add_child(struct device *dev, struct device *child) return 0; } +static void snd_devm_release(struct device *dev) +{ + /* avoid warnings when releasing the resources */ +} + static struct device * snd_create_device(struct device *parent, struct device_driver *driver, @@ -76,6 +86,7 @@ snd_create_device(struct device *parent, device_initialize(device); device->parent = parent; device->driver = driver; + device->release = &snd_devm_release; dev_set_name(device, "%s", name); @@ -130,31 +141,14 @@ static int snd_bcm2835_create(struct snd_card *card, return 0; } -static void snd_devm_card_free(struct device *dev, void *res) -{ - struct snd_card *snd_card = *(struct snd_card **)res; - - snd_card_free(snd_card); -} - static struct snd_card *snd_devm_card_new(struct device *dev) { - struct snd_card **dr; struct snd_card *card; int ret; - dr = devres_alloc(snd_devm_card_free, sizeof(*dr), GFP_KERNEL); - if (!dr) - return ERR_PTR(-ENOMEM); - ret = snd_card_new(dev, -1, NULL, THIS_MODULE, 0, &card); - if (ret) { - devres_free(dr); + if (ret) return ERR_PTR(ret); - } - - *dr = card; - devres_add(dev, dr); return card; } @@ -414,6 +408,12 @@ static int snd_bcm2835_alsa_probe_dt(struct platform_device *pdev) return 0; } +static int snd_bcm2835_alsa_remove(struct platform_device *pdev) +{ + /* trigger snd_devm_unregister_child() */ + return 0; +} + #ifdef CONFIG_PM static int snd_bcm2835_alsa_suspend(struct platform_device *pdev, @@ -437,6 +437,7 @@ MODULE_DEVICE_TABLE(of, snd_bcm2835_of_match_table); static struct platform_driver bcm2835_alsa0_driver = { .probe = snd_bcm2835_alsa_probe_dt, + .remove = snd_bcm2835_alsa_remove, #ifdef CONFIG_PM .suspend = snd_bcm2835_alsa_suspend, .resume = snd_bcm2835_alsa_resume, -- 2.13.6