From patchwork Tue Mar 24 19:12:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1260919 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ByzkfVsg; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48n1B83Hd0z9sR4 for ; Wed, 25 Mar 2020 06:13:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728047AbgCXTNa (ORCPT ); Tue, 24 Mar 2020 15:13:30 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:38859 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727747AbgCXTN3 (ORCPT ); Tue, 24 Mar 2020 15:13:29 -0400 Received: by mail-lj1-f196.google.com with SMTP id w1so19829658ljh.5; Tue, 24 Mar 2020 12:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8e7+L+UHZHa2zA2O9LK9VZBpvO0sNomc3WT2/0CqCjU=; b=ByzkfVsgRm5bJi+U8RCJHRQt9tjP2J474FwUvPZZtITq5rx5+eU82yk90R3S+6x81T ZXMiflZ4qDlC3MA0hUkYLhnhVtjVKmMdo8EYgH3JAH0Sq28mQUYQXD9q9Xrh9w0pvvtt g2o/uj5Ke6DudG4zTgun1YXTssK+frT6CBzPN9hWnaK64YX18YLZm/gYOH1nU/d2FVBN bYbe9U+kY/Zl6i2wDxO73uIEZXAJIdS9RuXf5bxPpqpwRJjCIRFiWTntWt7MGaAQVSC2 iFMnewIylkBTehqrn56LrXk0RBrI+vKxGWjhh7PBNlrtmfhEVYAIovTEAKyo4tq4oN+9 qKrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8e7+L+UHZHa2zA2O9LK9VZBpvO0sNomc3WT2/0CqCjU=; b=iadn6XWpmDv8b5i9r+m0f3J4lSmY+KVzbLtYVtR2xiE9/aVsX4i528aXtmFMbZdR4c g9jUdMm8/KJebtTy19+B9L+zkLrvCR/F6hfLa9nQ1BkSLnJLiqEA5NPRspmRP1uKDCQs AFzO/GyYdh8E1yTEulI1tOM7GV18hzXEf/ShFT6wQdJoJtd44aAOFq81tjjYjX8IBu+p NwY8DmNZNRmXFQSGITSWLmB73hC7CzyCToIOT1eoKA8EveoEa998TCJeTjPH3IE+yfk0 TepTMwY4JEIaiXY4pyu/b+9i/BsB5dvLi4tEXak0XfHisYJXtRqharOpDEPm++O2vXwk yVcQ== X-Gm-Message-State: ANhLgQ2ZMbY660+IQ2YCN2DCZofmu3AgVZEZwLWXvniJZxn0dUSDrWv8 N01J2+hE2w+pfDeYj4K/uew= X-Google-Smtp-Source: ADFU+vuiAlL6Nfj0JpdKx9a6iHCBFnG2bGLQweFpi5dg/eF6KCPlw0Vh1GVnHbPzEfXKdAhKoyBNeg== X-Received: by 2002:a2e:6809:: with SMTP id c9mr10101355lja.251.1585077207778; Tue, 24 Mar 2020 12:13:27 -0700 (PDT) Received: from localhost.localdomain (94-29-39-224.dynamic.spd-mgts.ru. [94.29.39.224]) by smtp.gmail.com with ESMTPSA id z23sm6347723ljz.52.2020.03.24.12.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 12:13:27 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Laxman Dewangan , Wolfram Sang 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 Message-Id: <20200324191217.1829-2-digetx@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200324191217.1829-1-digetx@gmail.com> References: <20200324191217.1829-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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 --- 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; From patchwork Tue Mar 24 19:12:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1260921 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=l+gUJAYd; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48n1BD24DTz9sRN for ; Wed, 25 Mar 2020 06:13:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727747AbgCXTNf (ORCPT ); Tue, 24 Mar 2020 15:13:35 -0400 Received: from mail-lj1-f193.google.com ([209.85.208.193]:42161 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727999AbgCXTNb (ORCPT ); Tue, 24 Mar 2020 15:13:31 -0400 Received: by mail-lj1-f193.google.com with SMTP id q19so19791746ljp.9; Tue, 24 Mar 2020 12:13:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jzcdODLP0bHV5KexQQTzdWyhTj19LdLpMLvVPCui0eA=; b=l+gUJAYdrgzLt3eLoI04QicNrazbv0v+FgYsKc5KoGBu5YFAIrTVAiCOBKdoV1ngoh 0deLxHa1n/6oUByrwhYO9rKBsC8iDCQJoyjr8SHwOGNl7YpwJxvJB+GEEOACJqZgC9qU TRnv9gtrZOIDcpih7GDiNyv8wu0HUswtMoJXj3JlyR2PxjN/vCf4BVcrdpPuLT2a6Vnd 8YWYQPvcAxt2m1bneX4xjIfz6krJozZvFnYpyNShqmdk6hMh9hzRHJ+RTvTHZa+mdTKv U0Zw9I5U4hqX4/JuOmytNJPNTZNkIJQWnfIoO/SSRsjY0h94mVLQCLDvMr6uYeV75g/L 92Bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jzcdODLP0bHV5KexQQTzdWyhTj19LdLpMLvVPCui0eA=; b=jKWqyyMp1IQ3j5wpWMDl3k73MNw1v7lIcTPKt2dnbk3ef+i77KO4tCxSSF44bu+NhQ FT1z0AmMH+gAC4fK/XnQHc8Q0F2WIzc2560sjVgTUro2X6qwo4oCeDoZ3HYsVZLuWdHB O51LPgT28Opw2LYqjs0ZM2dPKcsEyqxRbBcWkEdO5ywO9HZUAbgsXnbHk+4rYG1DM7yb hzW8r07uOgbxzPdhInbTPQpeLelvyS+QbHtppMvrB7O4CQu8yoPZM9tvpVlm1coWoQ7z MMgJGuFAkraM+ZG0Z04uq9nIYR5+Afo9Huka3Zkx+FYOY+jl2Vpn6mstrS6561WG6rb1 pXdw== X-Gm-Message-State: ANhLgQ2LFW3hJ5Wputerv4X64GKiYbSsj6VtBfzsmvfVlAIahkIu47d4 ohF6oI44sV6UWYzfr3/tSSc= X-Google-Smtp-Source: ADFU+vvXcCNXExgmOgRhQdzvVwwjdgeb/M53b6DLd/ZJF0pjeI+wUwRDDFat9JdSB/+780j3l9i3YQ== X-Received: by 2002:a2e:93c5:: with SMTP id p5mr17839557ljh.192.1585077208915; Tue, 24 Mar 2020 12:13:28 -0700 (PDT) Received: from localhost.localdomain (94-29-39-224.dynamic.spd-mgts.ru. [94.29.39.224]) by smtp.gmail.com with ESMTPSA id z23sm6347723ljz.52.2020.03.24.12.13.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 12:13:28 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Laxman Dewangan , Wolfram Sang Cc: linux-i2c@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] i2c: tegra: Synchronize DMA before termination Date: Tue, 24 Mar 2020 22:12:17 +0300 Message-Id: <20200324191217.1829-3-digetx@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200324191217.1829-1-digetx@gmail.com> References: <20200324191217.1829-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org DMA transfer could be completed, but CPU (which handles DMA interrupt) may get too busy and can't handle the interrupt in a timely manner, despite of DMA IRQ being raised. In this case the DMA state needs to synchronized before terminating DMA transfer in order not to miss the DMA transfer completion. Signed-off-by: Dmitry Osipenko --- drivers/i2c/busses/i2c-tegra.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 0daa863fb26f..0c6dac770fc3 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -1223,6 +1223,15 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev, time_left = tegra_i2c_wait_completion_timeout( i2c_dev, &i2c_dev->dma_complete, xfer_time); + /* + * Synchronize DMA first, since dmaengine_terminate_sync() + * performs synchronization after the transfer's termination + * and we want to get a completion if transfer succeeded. + */ + dmaengine_synchronize(i2c_dev->msg_read ? + i2c_dev->rx_dma_chan : + i2c_dev->tx_dma_chan); + dmaengine_terminate_sync(i2c_dev->msg_read ? i2c_dev->rx_dma_chan : i2c_dev->tx_dma_chan);