Message ID | ZQs1RgTKg6VJqmPs@google.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp4439605vqi; Wed, 20 Sep 2023 14:34:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHhZXE1GRPm759wnPliCpN1zgyu1vZFedsYNWBv6uI/sNdaveGET1/2LItsV8vQ7bqjbFYs X-Received: by 2002:a05:6a20:ce9c:b0:137:30db:bc35 with SMTP id if28-20020a056a20ce9c00b0013730dbbc35mr3454745pzb.27.1695245649738; Wed, 20 Sep 2023 14:34:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695245649; cv=none; d=google.com; s=arc-20160816; b=Pz/lihyxFhRVL12uY8mWzUmkFXBJ0nCHhbifkUgzsdbp5PTd/wqb1XArhZaHKTJ3LX gy5YQkRAh5M2yIs58YcN0S0bbudcNCiWI+zWlLBp+6fBEXbEdHYBUeae4gs8f1umo//z uBXuaAVIXZiBOZAiw9Nz0m50yUZMh0kUO2tbk7+yzWMcFvE1B38wiag6jievB8uDpSA+ XrZRJ0LOTXcR4RwzFHdpqcx7rly5JrmMgMJJOcjfPNCJDOszRqsdtPng9+IPQBAphAA+ rYXk7gK2MFUQKs5aLTDbRUH6o/fMOeeG7MsfbmP5jojoAJd7Z90o07S6lMugKYXbR3oW 2QkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-disposition:mime-version:message-id :subject:cc:to:from:date:dkim-signature; bh=B/lu8BcHJ/ysOPQIAbugBzzumndKD9GUIWEsPV6mHQU=; fh=KTa/jrp4NTSVA7nCpRztpMFgP0vdA4FueRYZjfd0Uzc=; b=p/NRozcFgesZTXsHlaBqJCQUWqy8yY0h4QLP9lczovp1cuhP/muHY0wrlsHdC7gTw6 8uCFoDh/4wf8MWeFxDGg/VPb1+namxZAZ3EwQXTGURhxpbldY5LGX25Y8U4UyGp2G74k TOy37mxynwkcBSgIffM7RG1I/VCDWODR4hujZ2nYHz+liLpESe+2qTNpRHTaxfre91wM BuKEScLmlMxQRQNyjX750iUdRRXHsUKKf56awmU3T8zdZiI6s4PRJ462lFTjFbLftyON wXgohjkOY7I+KfPaLwQPVXf8RbKnmjoyOW8DFrnhgkKwAZwqi0frtbVS/JCEmwaUtPVu lvbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=ATLStUVa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id g23-20020a17090adb1700b0026f75d932a8si100784pjv.185.2023.09.20.14.34.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 14:34:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=ATLStUVa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id E36BF81CFEB5; Wed, 20 Sep 2023 11:09:57 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229688AbjITSJ0 (ORCPT <rfc822;realc9580@gmail.com> + 27 others); Wed, 20 Sep 2023 14:09:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229663AbjITSJT (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 20 Sep 2023 14:09:19 -0400 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07DD2D6; Wed, 20 Sep 2023 11:09:14 -0700 (PDT) Received: by mail-pj1-x102a.google.com with SMTP id 98e67ed59e1d1-274b01849c4so11531a91.3; Wed, 20 Sep 2023 11:09:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695233353; x=1695838153; darn=vger.kernel.org; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=B/lu8BcHJ/ysOPQIAbugBzzumndKD9GUIWEsPV6mHQU=; b=ATLStUVarJQARDf6LuL8kZwydKTbXAQ/6pcLEDT6yWMNTYVEZAbSuvl+NcGXPh/Vhp EmyweuFZXm9EC2M8uc/0aqzwLWxNL7UpgW/QgpgePqy+oHTtRIkn5+ZiPi0d9W0bkZ+m jQD/11Yv3UeXNmsy6gh332yjYvX8OSOjgEBDVqVvvWq9phGC1gtYsMSiEW441P9AW+/T g/twWg3sdks6xOMMMh8+HFdJPRMa3ptxor9mCfFTx0Pq8vwgKCVpg+zyfq4gZwO1olw0 prjXtJr5kVMMKeOevSLOQqOdz4cVQktcDk5J6oVmBAEzz3qQXMIW9h3imbl4hqkwazHJ IgxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695233353; x=1695838153; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=B/lu8BcHJ/ysOPQIAbugBzzumndKD9GUIWEsPV6mHQU=; b=CMnzmgpuJx1oX1LooHioviSyNvbWCwXVKQbcEf3VumK2LyaOWSgibbaDwYB4TEUFmH h+SDeQ8CFDUYg0116uVVYTmCjSmYLRftDjyAOM/3igtSlMzO+CBUjVUNtNie7DDYuupT IrkOyX1UIC3JeM/mR8tBbqjJ7pBMMIMoPbE2OKmlhPi8JKz/lEIO2jeEnN+DjxdTJwvL k0AyEiHJkSI0ARlMS8MYRYPAsyItLATnk28+uNu/u8jmDad6YIeqXSE1N3DtJT/7eonS TyBLgjFi2ev8EF+IiGM3nVuauizFQTu0A7s9S+l336cgvIUt0XQUXGQ9pkAf6HMSqPaD 9gKg== X-Gm-Message-State: AOJu0Ywjl5m5eQfrZsissj4JiRq+qbTwGdgD7cRl1LAs3s149UpYMdA+ JRvs4kWoeTn+5gM3SyZudCY= X-Received: by 2002:a17:90a:3ec6:b0:268:29cf:3231 with SMTP id k64-20020a17090a3ec600b0026829cf3231mr3278194pjc.3.1695233353165; Wed, 20 Sep 2023 11:09:13 -0700 (PDT) Received: from google.com ([2620:15c:9d:2:3073:3a17:4a3d:2738]) by smtp.gmail.com with ESMTPSA id v13-20020a17090ac90d00b002639c4f81cesm1632455pjt.3.2023.09.20.11.09.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 11:09:12 -0700 (PDT) Date: Wed, 20 Sep 2023 11:09:10 -0700 From: Dmitry Torokhov <dmitry.torokhov@gmail.com> To: Linus Walleij <linus.walleij@linaro.org> Cc: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] pinctrl: avoid unsafe code pattern in find_pinctrl() Message-ID: <ZQs1RgTKg6VJqmPs@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Wed, 20 Sep 2023 11:09:57 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777593902520286832 X-GMAIL-MSGID: 1777593902520286832 |
Series |
pinctrl: avoid unsafe code pattern in find_pinctrl()
|
|
Commit Message
Dmitry Torokhov
Sept. 20, 2023, 6:09 p.m. UTC
The code in find_pinctrl() takes a mutex and traverses a list of pinctrl
structures. Later the caller bumps up reference count on the found
structure. Such pattern is not safe as pinctrl that was found may get
deleted before the caller gets around to increasing the reference count.
Fix this by taking the reference count in find_pinctrl(), while it still
holds the mutex.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/pinctrl/core.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
Comments
On Wed, Sep 20, 2023 at 8:09 PM Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > The code in find_pinctrl() takes a mutex and traverses a list of pinctrl > structures. Later the caller bumps up reference count on the found > structure. Such pattern is not safe as pinctrl that was found may get > deleted before the caller gets around to increasing the reference count. > > Fix this by taking the reference count in find_pinctrl(), while it still > holds the mutex. > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> After some thinking, applied for fixes and tagged for stable as it is a very real problem that can cause random crashes under the right circumstances. Thanks for finding this Dmitry!! Yours, Linus Walleij
On Mon, Sep 25, 2023 at 03:30:53PM +0200, Linus Walleij wrote: > On Wed, Sep 20, 2023 at 8:09 PM Dmitry Torokhov > <dmitry.torokhov@gmail.com> wrote: > > > The code in find_pinctrl() takes a mutex and traverses a list of pinctrl > > structures. Later the caller bumps up reference count on the found > > structure. Such pattern is not safe as pinctrl that was found may get > > deleted before the caller gets around to increasing the reference count. > > > > Fix this by taking the reference count in find_pinctrl(), while it still > > holds the mutex. > > > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> > > After some thinking, applied for fixes and tagged for stable as > it is a very real problem that can cause random crashes under > the right circumstances. Follow the strange and weird bisection [1] this one at least confirmed to be the culprit by reverting the only one from the v6.6-rc6 based branch. Long story short, after this commit my user space setup (minimal Buildroot + Busybox) has become broken in a sense of MMC enumeration. My all scripts were pointed to mmcblk0 which becomes out of a sudden mmcblk1! git bisect start # status: waiting for both good and bad commits # bad: [58720809f52779dc0f08e53e54b014209d13eebb] Linux 6.6-rc6 git bisect bad 58720809f52779dc0f08e53e54b014209d13eebb # status: waiting for good commit(s), bad commit known # good: [2dde18cd1d8fac735875f2e4987f11817cc0bc2c] Linux 6.5 git bisect good 2dde18cd1d8fac735875f2e4987f11817cc0bc2c # good: [47ca50600efcf994adb62a9a4e75c77d91bd0781] Merge tag 'soc-defconfig-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc git bisect good 47ca50600efcf994adb62a9a4e75c77d91bd0781 # good: [b89b029377c8c441649c7a6be908386e74ea9420] Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi git bisect good b89b029377c8c441649c7a6be908386e74ea9420 # good: [2a5a4326e58339a26cd1510259e7310b8c0980ff] Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi git bisect good 2a5a4326e58339a26cd1510259e7310b8c0980ff # good: [85eba5f1759f9eb89273225027254ced57bd18a2] Merge tag 'mm-hotfixes-stable-2023-09-23-10-31' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm git bisect good 85eba5f1759f9eb89273225027254ced57bd18a2 # good: [b78b18fb8ee19f7a05f20c3abc865b3bfe182884] Merge tag 'erofs-for-6.6-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs git bisect good b78b18fb8ee19f7a05f20c3abc865b3bfe182884 # bad: [9a5a14948574ee09f339990cab69b4ab997d2f7d] Merge tag 'soc-fixes-6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc git bisect bad 9a5a14948574ee09f339990cab69b4ab997d2f7d # good: [b9ddbb0cde2adcedda26045cc58f31316a492215] Merge tag 'parisc-for-6.6-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux git bisect good b9ddbb0cde2adcedda26045cc58f31316a492215 # good: [b711538a40b794ccc83838fb66990a091c56c101] Merge tag 'hyperv-fixes-signed-20231009' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux git bisect good b711538a40b794ccc83838fb66990a091c56c101 # good: [bab19d1b21547046b0a38dde948086f6cbcaefaa] Merge tag 'for-linus-2023101101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid git bisect good bab19d1b21547046b0a38dde948086f6cbcaefaa # bad: [82a040a8fa9b4f3845eff73a69a9931a59335902] Merge tag 'pinctrl-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl git bisect bad 82a040a8fa9b4f3845eff73a69a9931a59335902 # good: [759d1b653f3c7c2249b7fe5f6b218f87a5842822] Merge tag 'for-6.6-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux git bisect good 759d1b653f3c7c2249b7fe5f6b218f87a5842822 # bad: [c153a4edff6ab01370fcac8e46f9c89cca1060c2] pinctrl: avoid unsafe code pattern in find_pinctrl() git bisect bad c153a4edff6ab01370fcac8e46f9c89cca1060c2 # good: [87d315a34133edcb29c4cadbf196ec6c30dfd47b] pinctrl: nuvoton: wpcm450: fix out of bounds write git bisect good 87d315a34133edcb29c4cadbf196ec6c30dfd47b # good: [64061b67335e958e6328bcb5bb2b5490d57f3f59] pinctrl: starfive: jh7110: Add system pm ops to save and restore context git bisect good 64061b67335e958e6328bcb5bb2b5490d57f3f59 # first bad commit: [c153a4edff6ab01370fcac8e46f9c89cca1060c2] pinctrl: avoid unsafe code pattern in find_pinctrl() [1]: https://lore.kernel.org/r/20230830102434.xnlh66omhs6ninet@quack3
On Tue, Oct 17, 2023 at 05:08:05PM +0300, Andy Shevchenko wrote: > On Mon, Sep 25, 2023 at 03:30:53PM +0200, Linus Walleij wrote: > > On Wed, Sep 20, 2023 at 8:09 PM Dmitry Torokhov > > <dmitry.torokhov@gmail.com> wrote: > > > > > The code in find_pinctrl() takes a mutex and traverses a list of pinctrl > > > structures. Later the caller bumps up reference count on the found > > > structure. Such pattern is not safe as pinctrl that was found may get > > > deleted before the caller gets around to increasing the reference count. > > > > > > Fix this by taking the reference count in find_pinctrl(), while it still > > > holds the mutex. > > > > > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> > > > > After some thinking, applied for fixes and tagged for stable as > > it is a very real problem that can cause random crashes under > > the right circumstances. > > Follow the strange and weird bisection [1] this one at least confirmed to be > the culprit by reverting the only one from the v6.6-rc6 based branch. > > Long story short, after this commit my user space setup (minimal Buildroot + Busybox) > has become broken in a sense of MMC enumeration. My all scripts were pointed to > mmcblk0 which becomes out of a sudden mmcblk1! `dmesg` after revert: [ 36.439057] mmc0: SDHCI controller on PCI [0000:00:01.0] using ADMA [ 36.450924] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA [ 36.459355] mmc1: SDHCI controller on PCI [0000:00:01.2] using ADMA [ 36.706399] mmc0: new DDR MMC card at address 0001 [ 37.058972] mmc2: new ultra high speed DDR50 SDIO card at address 0001 [ 37.278977] mmcblk0: mmc0:0001 H4G1d 3.64 GiB [ 37.297300] mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 and before: [ 36.436704] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA [ 36.436720] mmc1: SDHCI controller on PCI [0000:00:01.0] using ADMA [ 36.463685] mmc0: SDHCI controller on PCI [0000:00:01.2] using ADMA [ 36.720627] mmc1: new DDR MMC card at address 0001 [ 37.068181] mmc2: new ultra high speed DDR50 SDIO card at address 0001 [ 37.279998] mmcblk1: mmc1:0001 H4G1d 3.64 GiB [ 37.302670] mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 Reproducibility 100%. > git bisect start > # status: waiting for both good and bad commits > # bad: [58720809f52779dc0f08e53e54b014209d13eebb] Linux 6.6-rc6 > git bisect bad 58720809f52779dc0f08e53e54b014209d13eebb > # status: waiting for good commit(s), bad commit known > # good: [2dde18cd1d8fac735875f2e4987f11817cc0bc2c] Linux 6.5 > git bisect good 2dde18cd1d8fac735875f2e4987f11817cc0bc2c > # good: [47ca50600efcf994adb62a9a4e75c77d91bd0781] Merge tag 'soc-defconfig-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc > git bisect good 47ca50600efcf994adb62a9a4e75c77d91bd0781 > # good: [b89b029377c8c441649c7a6be908386e74ea9420] Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi > git bisect good b89b029377c8c441649c7a6be908386e74ea9420 > # good: [2a5a4326e58339a26cd1510259e7310b8c0980ff] Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi > git bisect good 2a5a4326e58339a26cd1510259e7310b8c0980ff > # good: [85eba5f1759f9eb89273225027254ced57bd18a2] Merge tag 'mm-hotfixes-stable-2023-09-23-10-31' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm > git bisect good 85eba5f1759f9eb89273225027254ced57bd18a2 > # good: [b78b18fb8ee19f7a05f20c3abc865b3bfe182884] Merge tag 'erofs-for-6.6-rc5-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs > git bisect good b78b18fb8ee19f7a05f20c3abc865b3bfe182884 > # bad: [9a5a14948574ee09f339990cab69b4ab997d2f7d] Merge tag 'soc-fixes-6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc > git bisect bad 9a5a14948574ee09f339990cab69b4ab997d2f7d > # good: [b9ddbb0cde2adcedda26045cc58f31316a492215] Merge tag 'parisc-for-6.6-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux > git bisect good b9ddbb0cde2adcedda26045cc58f31316a492215 > # good: [b711538a40b794ccc83838fb66990a091c56c101] Merge tag 'hyperv-fixes-signed-20231009' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux > git bisect good b711538a40b794ccc83838fb66990a091c56c101 > # good: [bab19d1b21547046b0a38dde948086f6cbcaefaa] Merge tag 'for-linus-2023101101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid > git bisect good bab19d1b21547046b0a38dde948086f6cbcaefaa > # bad: [82a040a8fa9b4f3845eff73a69a9931a59335902] Merge tag 'pinctrl-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl > git bisect bad 82a040a8fa9b4f3845eff73a69a9931a59335902 > # good: [759d1b653f3c7c2249b7fe5f6b218f87a5842822] Merge tag 'for-6.6-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux > git bisect good 759d1b653f3c7c2249b7fe5f6b218f87a5842822 > # bad: [c153a4edff6ab01370fcac8e46f9c89cca1060c2] pinctrl: avoid unsafe code pattern in find_pinctrl() > git bisect bad c153a4edff6ab01370fcac8e46f9c89cca1060c2 > # good: [87d315a34133edcb29c4cadbf196ec6c30dfd47b] pinctrl: nuvoton: wpcm450: fix out of bounds write > git bisect good 87d315a34133edcb29c4cadbf196ec6c30dfd47b > # good: [64061b67335e958e6328bcb5bb2b5490d57f3f59] pinctrl: starfive: jh7110: Add system pm ops to save and restore context > git bisect good 64061b67335e958e6328bcb5bb2b5490d57f3f59 > # first bad commit: [c153a4edff6ab01370fcac8e46f9c89cca1060c2] pinctrl: avoid unsafe code pattern in find_pinctrl() > > [1]: https://lore.kernel.org/r/20230830102434.xnlh66omhs6ninet@quack3
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index e9dc9638120a..e2f7519bef04 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -1022,17 +1022,20 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev, static struct pinctrl *find_pinctrl(struct device *dev) { - struct pinctrl *p; + struct pinctrl *entry, *p = NULL; mutex_lock(&pinctrl_list_mutex); - list_for_each_entry(p, &pinctrl_list, node) - if (p->dev == dev) { - mutex_unlock(&pinctrl_list_mutex); - return p; + + list_for_each_entry(entry, &pinctrl_list, node) { + if (entry->dev == dev) { + p = entry; + kref_get(&p->users); + break; } + } mutex_unlock(&pinctrl_list_mutex); - return NULL; + return p; } static void pinctrl_free(struct pinctrl *p, bool inlist); @@ -1140,7 +1143,6 @@ struct pinctrl *pinctrl_get(struct device *dev) p = find_pinctrl(dev); if (p) { dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n"); - kref_get(&p->users); return p; }