All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Osipenko <digetx@gmail.com>
To: Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Laxman Dewangan <ldewangan@nvidia.com>,
	Wolfram Sang <wsa@the-dreams.de>
Cc: linux-i2c@vger.kernel.org, linux-tegra@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2 1/2] i2c: tegra: Better handle case where CPU0 is busy for a long time
Date: Tue, 24 Mar 2020 22:12:16 +0300	[thread overview]
Message-ID: <20200324191217.1829-2-digetx@gmail.com> (raw)
In-Reply-To: <20200324191217.1829-1-digetx@gmail.com>

Boot CPU0 always handle I2C interrupt and under some rare circumstances
(like running KASAN + NFS root) it may stuck in uninterruptible state for
a significant time. In this case we will get timeout if I2C transfer is
running on a sibling CPU, despite of IRQ being raised. In order to handle
this rare condition, the IRQ status needs to be checked after completion
timeout.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/i2c/busses/i2c-tegra.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index cbc2ad49043e..0daa863fb26f 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -1000,14 +1000,13 @@ tegra_i2c_poll_completion_timeout(struct tegra_i2c_dev *i2c_dev,
 	do {
 		u32 status = i2c_readl(i2c_dev, I2C_INT_STATUS);
 
-		if (status) {
+		if (status)
 			tegra_i2c_isr(i2c_dev->irq, i2c_dev);
 
-			if (completion_done(complete)) {
-				s64 delta = ktime_ms_delta(ktimeout, ktime);
+		if (completion_done(complete)) {
+			s64 delta = ktime_ms_delta(ktimeout, ktime);
 
-				return msecs_to_jiffies(delta) ?: 1;
-			}
+			return msecs_to_jiffies(delta) ?: 1;
 		}
 
 		ktime = ktime_get();
@@ -1034,14 +1033,18 @@ tegra_i2c_wait_completion_timeout(struct tegra_i2c_dev *i2c_dev,
 		disable_irq(i2c_dev->irq);
 
 		/*
-		 * There is a chance that completion may happen after IRQ
-		 * synchronization, which is done by disable_irq().
+		 * Under some rare circumstances (like running KASAN +
+		 * NFS root) CPU, which handles interrupt, may stuck in
+		 * uninterruptible state for a significant time.  In this
+		 * case we will get timeout if I2C transfer is running on
+		 * a sibling CPU, despite of IRQ being raised.
+		 *
+		 * In order to handle this rare condition, the IRQ status
+		 * needs to be checked after timeout.
 		 */
-		if (ret == 0 && completion_done(complete)) {
-			dev_warn(i2c_dev->dev,
-				 "completion done after timeout\n");
-			ret = 1;
-		}
+		if (ret == 0)
+			ret = tegra_i2c_poll_completion_timeout(i2c_dev,
+								complete, 0);
 	}
 
 	return ret;
-- 
2.25.1

  reply	other threads:[~2020-03-24 19:13 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-24 19:12 [PATCH v2 0/2] NVIDIA Tegra I2C synchronization correction Dmitry Osipenko
2020-03-24 19:12 ` Dmitry Osipenko [this message]
2020-04-15 16:31   ` [PATCH v2 1/2] i2c: tegra: Better handle case where CPU0 is busy for a long time Wolfram Sang
2020-04-15 16:31     ` Wolfram Sang
2020-04-20 19:53   ` Jon Hunter
2020-04-20 19:53     ` Jon Hunter
2020-04-20 22:11     ` Dmitry Osipenko
2020-04-20 22:11       ` Dmitry Osipenko
2020-04-21  0:32       ` Dmitry Osipenko
2020-04-21  0:32         ` Dmitry Osipenko
2020-04-21  9:49         ` Jon Hunter
2020-04-21  9:49           ` Jon Hunter
2020-04-21 12:39           ` Manikanta Maddireddy
2020-04-21 12:39             ` Manikanta Maddireddy
2020-04-21 13:08             ` Jon Hunter
2020-04-21 13:08               ` Jon Hunter
2020-04-21 13:49               ` Manikanta Maddireddy
2020-04-21 13:49                 ` Manikanta Maddireddy
2020-04-21 13:25           ` Dmitry Osipenko
2020-04-21 13:25             ` Dmitry Osipenko
2020-04-21 14:40             ` Jon Hunter
2020-04-21 14:40               ` Jon Hunter
2020-04-21 15:08               ` Dmitry Osipenko
2020-04-21 19:42                 ` Jon Hunter
2020-04-21 19:42                   ` Jon Hunter
2020-04-22 13:40                   ` Dmitry Osipenko
2020-04-22 13:40                     ` Dmitry Osipenko
2020-04-22 13:59                     ` Jon Hunter
2020-04-22 13:59                       ` Jon Hunter
2020-04-22 14:07                       ` Dmitry Osipenko
2020-04-22 14:07                         ` Dmitry Osipenko
2020-04-23 10:56                         ` Jon Hunter
2020-04-23 10:56                           ` Jon Hunter
2020-04-23 16:33                           ` Dmitry Osipenko
2020-04-23 16:33                             ` Dmitry Osipenko
2020-04-24  7:10                             ` Jon Hunter
2020-04-24  7:10                               ` Jon Hunter
2020-04-24 14:45                               ` Dmitry Osipenko
2020-04-24 14:45                                 ` Dmitry Osipenko
2020-04-24 15:19                                 ` Jon Hunter
2020-04-24 15:19                                   ` Jon Hunter
2020-04-27  7:48                                   ` Thierry Reding
2020-04-27  7:48                                     ` Thierry Reding
2020-04-27  8:44                                     ` Wolfram Sang
2020-04-27  8:44                                       ` Wolfram Sang
2020-04-27  9:07                                       ` Dmitry Osipenko
2020-04-27  9:07                                         ` Dmitry Osipenko
2020-04-27 10:35                                         ` Wolfram Sang
2020-04-27 10:50                                           ` Thierry Reding
2020-04-27 15:32                                             ` Thierry Reding
2020-04-27 15:32                                               ` Thierry Reding
2020-04-27 16:02                                               ` Dmitry Osipenko
2020-04-27 10:49                                         ` Thierry Reding
2020-04-27 10:49                                           ` Thierry Reding
2020-04-27  9:52                                     ` Dmitry Osipenko
2020-04-27 10:38                                       ` Wolfram Sang
2020-04-27 10:38                                         ` Wolfram Sang
2020-04-27 13:15                                         ` Dmitry Osipenko
2020-04-27 14:19                                           ` Thierry Reding
2020-04-27 15:31                                             ` Wolfram Sang
2020-04-27 15:31                                               ` Wolfram Sang
2020-05-02 14:40                                               ` Dmitry Osipenko
2020-05-02 14:40                                                 ` Dmitry Osipenko
2020-05-02 14:43                                                 ` Wolfram Sang
2020-05-02 14:43                                                   ` Wolfram Sang
2020-05-04 15:42                                                 ` Thierry Reding
2020-05-04 15:42                                                   ` Thierry Reding
2020-05-04 20:55                                                   ` Dmitry Osipenko
2020-05-04 20:55                                                     ` Dmitry Osipenko
2020-04-27 11:00                                       ` Thierry Reding
2020-04-27 11:00                                         ` Thierry Reding
2020-04-27 14:21                                         ` Dmitry Osipenko
2020-04-27 14:21                                           ` Dmitry Osipenko
2020-04-27 15:12                                           ` Thierry Reding
2020-04-27 15:12                                             ` Thierry Reding
2020-04-27 15:18                                             ` Dmitry Osipenko
2020-04-28  8:01                                               ` Jon Hunter
2020-04-28  8:01                                                 ` Jon Hunter
2020-04-28 12:37                                                 ` Dmitry Osipenko
2020-04-28 12:37                                                   ` Dmitry Osipenko
2020-04-29  8:14                                               ` Thierry Reding
2020-04-29  8:14                                                 ` Thierry Reding
2020-04-29  8:55                                                 ` Thierry Reding
2020-04-29 12:35                                                   ` Dmitry Osipenko
2020-04-29 13:57                                                     ` Jon Hunter
2020-04-29 13:57                                                       ` Jon Hunter
2020-04-29 14:46                                                       ` Dmitry Osipenko
2020-04-29 14:46                                                         ` Dmitry Osipenko
2020-04-29 16:24                                                         ` Thierry Reding
2020-04-29 16:24                                                           ` Thierry Reding
2020-04-29 17:02                                                           ` Dmitry Osipenko
2020-04-29 17:02                                                             ` Dmitry Osipenko
2020-04-29 16:30                                                     ` Thierry Reding
2020-04-29 16:54                                                       ` Dmitry Osipenko
2020-04-29 16:54                                                         ` Dmitry Osipenko
2020-04-29 17:34                                                         ` Dmitry Osipenko
2020-04-29 17:34                                                           ` Dmitry Osipenko
2020-04-27 12:46                           ` Dmitry Osipenko
2020-04-27 12:46                             ` Dmitry Osipenko
2020-04-27 14:13                             ` Dmitry Osipenko
2020-04-27 14:13                               ` Dmitry Osipenko
2020-04-27 14:45                               ` Dmitry Osipenko
2020-04-27 14:45                                 ` Dmitry Osipenko
2020-04-27 15:38                                 ` Dmitry Osipenko
2020-04-27 15:38                                   ` Dmitry Osipenko
2020-04-28  8:02                                   ` Jon Hunter
2020-04-28  8:02                                     ` Jon Hunter
2020-04-28 23:12                                     ` Dmitry Osipenko
2020-04-28 23:12                                       ` Dmitry Osipenko
2020-04-21 15:18               ` Dmitry Osipenko
2020-04-21 15:34                 ` Jon Hunter
2020-04-21 15:34                   ` Jon Hunter
2020-04-21 19:07                   ` Dmitry Osipenko
2020-04-21 19:07                     ` Dmitry Osipenko
2020-04-28 13:43     ` Dmitry Osipenko
2020-03-24 19:12 ` [PATCH v2 2/2] i2c: tegra: Synchronize DMA before termination Dmitry Osipenko
2020-04-15 16:31   ` Wolfram Sang
2020-04-15 16:31     ` Wolfram Sang
2020-04-15 11:45 ` [PATCH v2 0/2] NVIDIA Tegra I2C synchronization correction Wolfram Sang
2020-04-15 14:14   ` Dmitry Osipenko
2020-04-15 14:14     ` Dmitry Osipenko
2020-04-15 16:23     ` Wolfram Sang
2020-04-15 16:23       ` Wolfram Sang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200324191217.1829-2-digetx@gmail.com \
    --to=digetx@gmail.com \
    --cc=jonathanh@nvidia.com \
    --cc=ldewangan@nvidia.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.