From patchwork Wed Dec 6 09:06:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jensen Huang X-Patchwork-Id: 13481306 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 80DF2C4167B for ; Wed, 6 Dec 2023 09:07:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=zS9Rr5krSrHqcqk88lbtQUTxua6w+4by5sFNTFp01g0=; b=Pq+KABYNgcPKKK SKKonLRRpBZ8+6FzJUXzUvMMGFmrj1bK1UkwsOkLxLvHrmhIZcYR5ucb5etGJ1ytolNNEJ+TPm4w4 0mrKYxsYDpmxbff8i8SIu2fBAuMWKDBO4Cf700ezWPzvVvkJhqYII8hfrtEk538HPZ1Ubyv75gR4z MmXxmnR/UmHnLC01ca5nTrqiUwnUMI03WBt5f4w/pvrebCyhh5bGE71VxGrTl60MXuYB9NEA4xxHL OTkdEcmtgXLZE25jjQWfdeVk4lkKFCSojKuYCHvb6euJa3BXadNp7djhzvlJTSLBeSS010ilvz13D te4NEUbi3Oum7IjJA6Sg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rAnsD-009VwT-2q; Wed, 06 Dec 2023 09:07:17 +0000 Received: from mail-pg1-x52c.google.com ([2607:f8b0:4864:20::52c]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rAnsB-009VqZ-0p for linux-arm-kernel@lists.infradead.org; Wed, 06 Dec 2023 09:07:16 +0000 Received: by mail-pg1-x52c.google.com with SMTP id 41be03b00d2f7-5c66988c2eeso486376a12.1 for ; Wed, 06 Dec 2023 01:06:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=friendlyarm-com.20230601.gappssmtp.com; s=20230601; t=1701853617; x=1702458417; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=vkgnInx34MsdRC00k2I9y+o/ne93gzAEsHKwXhaX8A0=; b=pLe6OMqalB7WmUO/eEjE/p43NOJqyrz48zNglL1Hr9rQJGx2B0Wjtdc+sFIcT3CHOo CLlJcoX43VSpEmGgkryaz1VsIOHEeiFM50mBXvQnAbU15NAlPLwpU2l4TvMyjq8qZEe5 GPAzRorxu5LD/rHCnEVliDaPMFJ3ESpd1A04igar62hwivi2AFXkSOIHKo3tUcMZTIJH I7+OWB67wSuscFxzghT7AN02g+bCwfI12wL+kg6cua5r8WAuTELJQJJ81zpk1YdTGe3r cilpU8/sn4Gu6PXOf1hL0HDF2kfzX+/MB8L5W5R7FEL3Uj2cc0zFtPJoKvWjSYWuDAZQ ZktA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701853617; x=1702458417; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=vkgnInx34MsdRC00k2I9y+o/ne93gzAEsHKwXhaX8A0=; b=cJA0+hiLy2pD6l2jrAGyFD75qv7xhhT+5AGKA8m3ux2BYLnD1I9ckq/P3Inzz2M8gt Es/fpBdX0yNm258DQEBVHwj5geZeM2JkNALzoKeAhaiOrN29wTB0sFuHmmMDcyfZQaz1 C1dz9appGHK6FpdQrSsbzrkrO4UMbbRYqCRxiarfr6NTPsNEh8/yCaTAYdvemRaGUTDQ ciN2l1+2SIfgt4diA6a2w9f6/YCKFVugwfQpDYRyR8nx45TCOL58c0PW5GnGFvqY7Rri la8ymTtUIpU2v8Z7WTgIK/ecjSLpznaYpcVHvPj4No25kZYK4O8tkwKlP7ZYmd4DPNXQ tzeQ== X-Gm-Message-State: AOJu0YxwAFGPB+UBmwBDcypL4U1DbVDEqOijmWgAYKwdWFWjyWGW7QD3 V4AeCDcxEp5Md7J+FQF4mQtYOg== X-Google-Smtp-Source: AGHT+IHrGxsDqoubS9LhJ6U+qoCk+pQ/zFRwTborkh3P26N1W35bYry7lNZkS91ue9idDeKXGjDzeQ== X-Received: by 2002:a17:90b:1b46:b0:286:c155:10e0 with SMTP id nv6-20020a17090b1b4600b00286c15510e0mr827953pjb.31.1701853616973; Wed, 06 Dec 2023 01:06:56 -0800 (PST) Received: from jensen.next (li999-236.members.linode.com. [45.33.49.236]) by smtp.gmail.com with ESMTPSA id mi7-20020a17090b4b4700b00286a708cd07sm4967797pjb.57.2023.12.06.01.06.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 01:06:56 -0800 (PST) From: Jensen Huang To: Heiko Stuebner , Andi Shyti Cc: Jensen Huang , linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] i2c: rk3x: fix potential spinlock recursion on poll Date: Wed, 6 Dec 2023 17:06:40 +0800 Message-ID: <20231206090641.18849-1-jensenhuang@friendlyarm.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231206_010715_296011_0B2749A6 X-CRM114-Status: GOOD ( 13.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Possible deadlock scenario (on reboot): rk3x_i2c_xfer_common(polling) -> rk3x_i2c_wait_xfer_poll() -> rk3x_i2c_irq(0, i2c); --> spin_lock(&i2c->lock); ... -> rk3x_i2c_irq(0, i2c); --> spin_lock(&i2c->lock); (deadlock here) Store the IRQ number and disable/enable it around the polling transfer. This patch has been tested on NanoPC-T4. Signed-off-by: Jensen Huang Reviewed-by: Heiko Stuebner Reviewed-by: Andi Shyti --- drivers/i2c/busses/i2c-rk3x.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c index a044ca0c35a1..94514637c3bd 100644 --- a/drivers/i2c/busses/i2c-rk3x.c +++ b/drivers/i2c/busses/i2c-rk3x.c @@ -200,6 +200,7 @@ struct rk3x_i2c { struct clk *clk; struct clk *pclk; struct notifier_block clk_rate_nb; + int irq; /* Settings */ struct i2c_timings t; @@ -1087,13 +1088,18 @@ static int rk3x_i2c_xfer_common(struct i2c_adapter *adap, spin_unlock_irqrestore(&i2c->lock, flags); - rk3x_i2c_start(i2c); - if (!polling) { + rk3x_i2c_start(i2c); + timeout = wait_event_timeout(i2c->wait, !i2c->busy, msecs_to_jiffies(WAIT_TIMEOUT)); } else { + disable_irq(i2c->irq); + rk3x_i2c_start(i2c); + timeout = rk3x_i2c_wait_xfer_poll(i2c); + + enable_irq(i2c->irq); } spin_lock_irqsave(&i2c->lock, flags); @@ -1310,6 +1316,8 @@ static int rk3x_i2c_probe(struct platform_device *pdev) return ret; } + i2c->irq = irq; + platform_set_drvdata(pdev, i2c); if (i2c->soc_data->calc_timings == rk3x_i2c_v0_calc_timings) {