From patchwork Fri Nov 18 20:54:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Grimaldi X-Patchwork-Id: 696747 X-Patchwork-Delegate: computersforpeace@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tL9Jq4TW8z9t1F for ; Sat, 19 Nov 2016 07:56:27 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="zchOt/Hz"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1c7qBF-00070F-Bq; Fri, 18 Nov 2016 20:54:41 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1c7qBB-0006yT-Sp for linux-mtd@lists.infradead.org; Fri, 18 Nov 2016 20:54:39 +0000 Received: by mail-wm0-x242.google.com with SMTP id u144so10015062wmu.0 for ; Fri, 18 Nov 2016 12:54:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=bLaFBKPtBwx2sQ4SpvPdUMPTgeSXzN2KOm97fHus8y0=; b=zchOt/Hz4T5vsvcm/5ygYS8hMeWIFtvw0DxbvYICR9qGJFtS2mq9KVbpc16E04WDFe V94v57JWbB/fjmi85Pql3KWNJIhyCOrhPiQdF7eHJam6v4HRPQz8mvB2YIs18Nz7B3Fx PIv0jGD1QCcYnhgakivhJZh6TN3230XafGmX4UpuBs1AyqBZsjYb7OxB3oeEvlE2tM+b WqBz9BK9w9r851U++dFyvG0SIHmvuY5i3Ah9/cp5lDHFyC49N6HLO6gLkUhRK0ce2r4D RwYK+9XMgkd+XLtwDyYUDxsWrZK2Oy9954YcEJuibOeYKRwAIJVBEew/EJMUdumJeQdh 75Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=bLaFBKPtBwx2sQ4SpvPdUMPTgeSXzN2KOm97fHus8y0=; b=SPxhW7Td0Xg/Ae57xjiSD+u3e+T19mFoUWtr9d3D9hLxTusBsY6PaSdzx56/K3VyFx EV/Yn7e2IZnzQso0UvjzGocqlSOf3hAIpirA51NVnmkT9putezv1dU7d/5X6bAoPCzrm a/HCVZV5UPvUIDBvmXqO+ZVlUSwZDeGYtzl8i/yhXaR4MTyoZfc9ygBygcd9za0ieAEA NZ/tVxNN3lBLrFs9Mscd2KqlZETbzX0XH8ewLdAtw34faYYuIqIfSGg+HuyXNo0CZgZl 8zc6EhYVS7jB4Ptq8e/mOU9NyrftYUQaf6veu1yeCPob4O37dmXMR2PtZGin09R93DSb heJw== X-Gm-Message-State: AKaTC01rKIbgEm2xJcfyIJn/vMmPQQqZEtsv/4kpp0YiVVd1rD9bXvWsHUo8iwkYHxLghw== X-Received: by 10.28.184.88 with SMTP id i85mr331049wmf.49.1479502455668; Fri, 18 Nov 2016 12:54:15 -0800 (PST) Received: from localhost (dynamic-adsl-78-12-227-241.clienti.tiscali.it. [78.12.227.241]) by smtp.gmail.com with ESMTPSA id pd2sm10702867wjb.31.2016.11.18.12.54.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 18 Nov 2016 12:54:14 -0800 (PST) Date: Fri, 18 Nov 2016 21:54:12 +0100 From: Ivan Grimaldi To: Richard Weinberger , grimaldi.ivan@gmail.com Subject: Re: [BUG] mtd: blkdevs: fix deadlock Message-ID: <20161118205412.GA1935@tuco> References: <20161117211537.GA5885@tuco> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.1 (2016-10-04) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161118_125438_130185_D8CD8BD9 X-CRM114-Status: GOOD ( 20.07 ) X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (grimaldi.ivan[at]gmail.com) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "linux-mtd@lists.infradead.org" , LKML , grimaldi.ivan@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org On 11/17, Richard Weinberger wrote: > On Thu, Nov 17, 2016 at 10:15 PM, Ivan Grimaldi wrote: > > I found this deadlock with kernel version 4.4.30, when insmod the ftl > > module, which register_mtd_blktrans. > > > > -> register_mtd_blktrans() > > -> mutex_lock(&mtd_table_mutex) > > -> ftl_add_mtd() > > -> add_mtd_blktrans_dev() > > -> add_disk() > > -> register_disk() > > -> blkdev_get() > > -> __blkdev_get() > > -> blktrans_open() > > -> mutex_lock(&mtd_table_mutex); !!!!!!! > > > > I think the lock/unlock of the mtd_table_mutex is not necessary in > > blktrans_open and blktrans_release, the log message of lockdep > > output follow: > > > > ============================================= > > [ INFO: possible recursive locking detected ] > > 4.4.30+siae-g8b14c5b-dirty #23 Not tainted > > --------------------------------------------- > > insmod/440 is trying to acquire lock: > > (mtd_table_mutex){+.+.+.}, at: [<802fe6b0>] blktrans_open+0x30/0x1ac > > > > but task is already holding lock: > > (mtd_table_mutex){+.+.+.}, at: [<802fe93c>] register_mtd_blktrans+0x2c/0x120 > > > > other info that might help us debug this: > > Possible unsafe locking scenario: > > > > CPU0 > > ---- > > lock(mtd_table_mutex); > > lock(mtd_table_mutex); > > > > *** DEADLOCK *** > > > > May be due to missing lock nesting notation > > > > 2 locks held by insmod/440: > > #0: (mtd_table_mutex){+.+.+.}, at: [<802fe93c>] register_mtd_blktrans+0x2c/0x120 > > #1: (&bdev->bd_mutex){+.+.+.}, at: [<8013c404>] __blkdev_get+0x40/0x398 > > > > stack backtrace: > > CPU: 0 PID: 440 Comm: insmod Not tainted 4.4.30+siae-g8b14c5b-dirty #23 > > Hardware name: SIAE Microelettronica AGS20 (Device Tree) > > Backtrace: > > [<800140e8>] (dump_backtrace) from [<800142dc>] (show_stack+0x18/0x1c) > > r6:60000093 r5:00000000 r4:8067cb48 r3:00000000 > > [<800142c4>] (show_stack) from [<8024fe1c>] (dump_stack+0xb4/0xe8) > > [<8024fd68>] (dump_stack) from [<8006dc48>] (__lock_acquire+0x1a94/0x1f14) > > r10:807d6db8 r9:8067cc28 r8:bdacd4c0 r7:80e933dc r6:bdacd080 r5:80e84ab4 > > r4:807d6db8 r3:00000002 > > [<8006c1b4>] (__lock_acquire) from [<8006e8ec>] (lock_acquire+0x78/0x98) > > r10:80686c38 r9:00000000 r8:00000001 r7:00000001 r6:802fe6b0 r5:60000013 > > r4:00000000 > > [<8006e874>] (lock_acquire) from [<804bc708>] (mutex_lock_nested+0x54/0x3ec) > > r7:bdacd080 r6:80e84ab4 r5:802fe6b0 r4:00000000 > > [<804bc6b4>] (mutex_lock_nested) from [<802fe6b0>] (blktrans_open+0x30/0x1ac) > > r10:00000001 r9:00000000 r8:00000001 r7:be61be10 r6:00000000 r5:bd98a400 > > r4:be61be00 > > [<802fe680>] (blktrans_open) from [<8013c464>] (__blkdev_get+0xa0/0x398) > > r8:00000000 r7:bec24f10 r6:00000000 r5:bd98a400 r4:bec24f00 r3:802fe680 > > [<8013c3c4>] (__blkdev_get) from [<8013c86c>] (blkdev_get+0x110/0x348) > > r10:bec24f00 r9:00000001 r8:be831f90 r7:bd98a40c r6:00000000 r5:00000000 > > r4:bec24f00 > > [<8013c75c>] (blkdev_get) from [<8024204c>] (add_disk+0x318/0x46c) > > r10:bec24f00 r9:00000001 r8:be831f90 r7:bd98a40c r6:bd98a480 r5:00000000 > > r4:bd98a400 > > [<80241d34>] (add_disk) from [<802fde80>] (add_mtd_blktrans_dev+0x314/0x440) > > r10:be61be9c r9:00000000 r8:00f68e00 r7:bd98a400 r6:7f00242c r5:00000000 > > r4:be61be00 > > [<802fdb6c>] (add_mtd_blktrans_dev) from [<7f000c74>] (ftl_add_mtd+0x490/0x7d8 [ftl]) > > r10:bd843d28 r9:be61bf00 r8:00000000 r7:000000bf r6:00007b47 r5:00000be0 > > r4:be61be00 > > [<7f0007e4>] (ftl_add_mtd [ftl]) from [<802fe9c4>] (register_mtd_blktrans+0xb4/0x120) > > r10:00000000 r9:be618ec0 r8:7f0024c8 r7:7f004000 r6:00000000 r5:7f00242c > > r4:be806000 > > [<802fe910>] (register_mtd_blktrans) from [<7f004014>] (init_ftl+0x14/0x1c [ftl]) > > r6:be618f80 r5:8066ad20 r4:8066ad20 r3:00000000 > > [<7f004000>] (init_ftl [ftl]) from [<800097bc>] (do_one_initcall+0x88/0x1e8) > > [<80009734>] (do_one_initcall) from [<800bf9f4>] (do_init_module+0x60/0x394) > > r10:00000001 r9:be618ec0 r8:7f0024c8 r7:7f002480 r6:be618700 r5:be618ec8 > > r4:7f002480 > > [<800bf994>] (do_init_module) from [<800a1b7c>] (load_module+0x1814/0x1f34) > > r6:00000001 r5:be618ec8 r4:bd843f34 > > [<800a0368>] (load_module) from [<800a2370>] (SyS_init_module+0xd4/0x148) > > r10:bd842000 r9:00000051 r8:c6b16780 r7:76fd8788 r6:00000000 r5:00004780 > > r4:00000000 > > [<800a229c>] (SyS_init_module) from [<8000fb60>] (ret_fast_syscall+0x0/0x1c) > > r10:00000000 r9:bd842000 r8:8000fd04 r7:00000080 r6:00000191 r5:7e8cbf31 > > r4:00024780 > > Forgot to include the diff? > > -- > Thanks, > //richard Hi, For me the solution is remove the mutex lock for mtd_table_mutex in blktrans_open and blktrans_release, the patch follow. IVan Signed-off-by: Ivan Grimaldi --- drivers/mtd/mtd_blkdevs.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index f470118..472d48f 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -192,7 +192,6 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) if (!dev) return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/ - mutex_lock(&mtd_table_mutex); mutex_lock(&dev->lock); if (dev->open) @@ -218,7 +217,6 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) unlock: dev->open++; mutex_unlock(&dev->lock); - mutex_unlock(&mtd_table_mutex); blktrans_dev_put(dev); return ret; @@ -229,7 +227,6 @@ error_put: module_put(dev->tr->owner); kref_put(&dev->ref, blktrans_dev_release); mutex_unlock(&dev->lock); - mutex_unlock(&mtd_table_mutex); blktrans_dev_put(dev); return ret; } @@ -241,7 +238,6 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode) if (!dev) return; - mutex_lock(&mtd_table_mutex); mutex_lock(&dev->lock); if (--dev->open) @@ -257,7 +253,6 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode) } unlock: mutex_unlock(&dev->lock); - mutex_unlock(&mtd_table_mutex); blktrans_dev_put(dev); }