Received: by 10.213.65.68 with SMTP id h4csp436978imn; Sun, 25 Mar 2018 03:35:11 -0700 (PDT) X-Google-Smtp-Source: AG47ELv8muXUTp3aJ1viSK0BTlvPceA0BZCUCIBtaoARJsj/1ZsLOk2ThIKWAZmRIa7KalMJsQya X-Received: by 10.98.217.85 with SMTP id s82mr23675556pfg.208.1521974111330; Sun, 25 Mar 2018 03:35:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521974111; cv=none; d=google.com; s=arc-20160816; b=d9znRA54R2nX4zl2tl3xLVj4rbU+G4vXkE1FWeZtzle3ACPE5buSMQameFWlTv5ROH eUCsg9vZdht9fLxtcXD/S46PJtdqqgjOx6n4HFRERwu0c4EJN0/jr9yYH9YqsYL7AFtb B238WjEgK+2Q4ygExI0dEm/0sooc7rK16ahZ9B2oKmfJ4iS2NnLhjwch2MakBdrav/Ov 5s+prEoYnCVmey/CIQDucBV/r5fq6KABQL0PPWW+45SaND1MhqCr3U19i3TXw5Bt5g7E W7EN9xDvBFbxHFgTi5RCDAx2vijCxKz3RtQbzMyKVa1DdWA+xC+u2L/PWGYBKgqFp+hP bm/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=oZNtGZ0Kd2tmJ5cZvYZS3B7cRI+cAFNd1jIgPros4UY=; b=EoozM1OXpAPRg31fOzLrYx1x7d4nVlNQQ4GVAPUxbR0ZlsBR5xkrdfErIJJfd1uuxm 6Dh4TOnXigSv9fopoIiZfMnN2bkjZKuBqXG3rDq0j5ihN+oZbBI+h2tjL1j3It4s4kDX R2LZ8DsLmyaKJB/vB5BGB5MCrjyRKpS8RrN8F4KuqlQw7wO6S/LxBhiRqoP0R6TQ1t+Q IvsnJkDxfhV/bOAS5eoAj0XDw2AFK0gx3iYpmg+WucBqXkuVPs0DAsg+vtCQXmRyfYi5 qDtX4aBN02kR+S/whISOqVrsdYWcZ9O/E18ASekSejubMaYpzPo+EdnDeAbKV3ailRzv pbcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=LcdZD8LG; 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 d192si7727359pgc.553.2018.03.25.03.34.56; Sun, 25 Mar 2018 03:35:11 -0700 (PDT) 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=LcdZD8LG; 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 S1752278AbeCYKdy (ORCPT + 99 others); Sun, 25 Mar 2018 06:33:54 -0400 Received: from mail-qt0-f194.google.com ([209.85.216.194]:41236 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751739AbeCYKdv (ORCPT ); Sun, 25 Mar 2018 06:33:51 -0400 Received: by mail-qt0-f194.google.com with SMTP id d18so4434697qtl.8 for ; Sun, 25 Mar 2018 03:33:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=oZNtGZ0Kd2tmJ5cZvYZS3B7cRI+cAFNd1jIgPros4UY=; b=LcdZD8LGWs6k4HVA/9GWH6TqCt2R3IxgKgXfuuGyZSAk4EADtVyywC1hA9L7cdtuH/ 9liP94QuILfDleUjurrW3hK5mON3NDOfFW1dzfxNCxNNKV6K5UuIP1BWFZDFguKZwmMI OrQSLaSoZ//WG9DGDAaI5oOcgI3ZuAdQ7SOIE1UfuEtQ6vOYE160NvBKrBF1zCiXzgd7 CpygMju1jHNepbZhOqNKCyHXke65UWMhxk0SFX/mOVRYi4OqP7JwG5Ngx4xHFPqHVlBj TreZqpghgbGyfXKVYq9QqEsfpQbHiSSVNDx/brFmyyKxZtu05HeFbrD/bEyLG+t+KCtU lcUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=oZNtGZ0Kd2tmJ5cZvYZS3B7cRI+cAFNd1jIgPros4UY=; b=VvrATF1VHnYXqiDZntp+sSeCkVvOLF0+aNG28WuvfgqgG7L/16VoreHxupZtLnJBaW fWrESaPSnniqop16pDMHLlJoseGNz/xGm8FNhoNdmeOG/Xo/Mz9ZMfp1FR/zlE1lcE2s 6hKLsNUFMOMt2/rI7qeK+YbyCXHgc8gion9cOcFEwo68IIpRaTpbnkcZoMmrOgWLMGFW HSowfLeBoMLgZE7DRUawas2JwIuw9vfM0pecTPEVIbquW8/KKuE8oOKXKoUV2MU00dey VHX3Fx+TaNzJTvqrEXKuQEWiJDSXxLFwM7u+zXK/G5/e+FFmiKXRQ+zqQb7no1hkOJDe CZXg== X-Gm-Message-State: AElRT7EhevSrEAr7B5Rw011E2oKaf3amYMlqi/m1I4zzwqLtwfwzPz1Q cAVZURX310p8dMhAutN7vkiCgCfUB8c4g+ilndM= X-Received: by 10.200.39.210 with SMTP id x18mr48589031qtx.266.1521974030882; Sun, 25 Mar 2018 03:33:50 -0700 (PDT) MIME-Version: 1.0 Received: by 10.12.137.74 with HTTP; Sun, 25 Mar 2018 03:33:50 -0700 (PDT) In-Reply-To: <20180323193254.14417-1-k.marinushkin@gmail.com> References: <20180323193254.14417-1-k.marinushkin@gmail.com> From: Andy Shevchenko Date: Sun, 25 Mar 2018 13:33:50 +0300 Message-ID: Subject: Re: [PATCH v5] staging: bcm2835-audio: Release resources on module_exit() To: Kirill Marinushkin Cc: Greg Kroah-Hartman , Eric Anholt , Stefan Wahren , Florian Fainelli , Ray Jui , Scott Branden , bcm-kernel-feedback-list , Michael Zoran , linux-rpi-kernel@lists.infradead.org, linux-arm Mailing List , devel@driverdev.osuosl.org, Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Mar 23, 2018 at 9:32 PM, Kirill Marinushkin wrote: > 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. > > The details WRT allocation / free are described below. > > Device structure WRT allocation: > > pdev > \childdev[] > \card > \chip > \pcm > \ctl > > Allocation / register sequence: > > * childdev: devm_kzalloc - freed during driver detach > * childdev: device_initialize - freed during device_unregister > * pdev: devres_alloc - freed during driver detach > * childdev: device_add - removed during device_unregister > * pdev, childdev: devres_add - freed during driver detach > * card: snd_card_new - freed during snd_card_free > * chip: kzalloc - freed during kfree > * card, chip: snd_device_new - freed during snd_device_free > * chip: new_pcm - TODO: free pcm > * chip: new_ctl - TODO: free ctl > * card: snd_card_register - unregistered during snd_card_free > > Free / unregister sequence: > > * card: snd_card_free > * card, chip: snd_device_free > * childdev: device_unregister > * chip: kfree > > Steps to reproduce the issue before this commit: > > ~~~~ > $ 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 > ~~~~ > FWIW, Reviewed-by: Andy Shevchenko > 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: Andy Shevchenko > 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 | 54 ++++++++++------------ > 1 file changed, 25 insertions(+), 29 deletions(-) > > diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c > index 8f2d508183b2..9030d71a3d0b 100644 > --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c > +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c > @@ -36,6 +36,10 @@ MODULE_PARM_DESC(enable_compat_alsa, > static void snd_devm_unregister_child(struct device *dev, void *res) > { > struct device *childdev = *(struct device **)res; > + struct bcm2835_chip *chip = dev_get_drvdata(childdev); > + struct snd_card *card = chip->card; > + > + snd_card_free(card); > > device_unregister(childdev); > } > @@ -61,6 +65,13 @@ static int snd_devm_add_child(struct device *dev, struct device *child) > return 0; > } > > +static void snd_bcm2835_release(struct device *dev) > +{ > + struct bcm2835_chip *chip = dev_get_drvdata(dev); > + > + kfree(chip); > +} > + > static struct device * > snd_create_device(struct device *parent, > struct device_driver *driver, > @@ -76,6 +87,7 @@ snd_create_device(struct device *parent, > device_initialize(device); > device->parent = parent; > device->driver = driver; > + device->release = snd_bcm2835_release; > > dev_set_name(device, "%s", name); > > @@ -86,18 +98,19 @@ snd_create_device(struct device *parent, > return device; > } > > -static int snd_bcm2835_free(struct bcm2835_chip *chip) > -{ > - kfree(chip); > - return 0; > -} > - > /* component-destructor > * (see "Management of Cards and Components") > */ > static int snd_bcm2835_dev_free(struct snd_device *device) > { > - return snd_bcm2835_free(device->device_data); > + struct bcm2835_chip *chip = device->device_data; > + struct snd_card *card = chip->card; > + > + /* TODO: free pcm, ctl */ > + > + snd_device_free(card, chip); > + > + return 0; > } > > /* chip-specific constructor > @@ -122,7 +135,7 @@ static int snd_bcm2835_create(struct snd_card *card, > > err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); > if (err) { > - snd_bcm2835_free(chip); > + kfree(chip); > return err; > } > > @@ -130,31 +143,14 @@ static int snd_bcm2835_create(struct snd_card *card, > return 0; > } > > -static void snd_devm_card_free(struct device *dev, void *res) > +static struct snd_card *snd_bcm2835_card_new(struct device *dev) > { > - 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; > } > @@ -271,7 +267,7 @@ static int snd_add_child_device(struct device *device, > return PTR_ERR(child); > } > > - card = snd_devm_card_new(child); > + card = snd_bcm2835_card_new(child); > if (IS_ERR(card)) { > dev_err(child, "Failed to create card"); > return PTR_ERR(card); > @@ -313,7 +309,7 @@ static int snd_add_child_device(struct device *device, > return err; > } > > - dev_set_drvdata(child, card); > + dev_set_drvdata(child, chip); > dev_info(child, "card created with %d channels\n", numchans); > > return 0; > -- > 2.13.6 > -- With Best Regards, Andy Shevchenko