From patchwork Wed Sep 16 13:34:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 11780383 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7F01492C for ; Wed, 16 Sep 2020 18:19:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6F32121D43 for ; Wed, 16 Sep 2020 18:19:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727757AbgIPSTn (ORCPT ); Wed, 16 Sep 2020 14:19:43 -0400 Received: from mga04.intel.com ([192.55.52.120]:22384 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727737AbgIPSTb (ORCPT ); Wed, 16 Sep 2020 14:19:31 -0400 IronPort-SDR: inwCnAckeQHGiYDTUJMXwHP7UeAXFszsATdIjyYMH4GfDnZ1MPdSGaOAHwHfI5nUwjK5grXUD6 Lk1m1mmqr0SQ== X-IronPort-AV: E=McAfee;i="6000,8403,9745"; a="156849605" X-IronPort-AV: E=Sophos;i="5.76,433,1592895600"; d="scan'208";a="156849605" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2020 06:34:58 -0700 IronPort-SDR: 3AIm6u1nQJbdDwFt84EoeRt955wZ/bxlwbgSOMDsvLDChO2GAaozdApeR1tjVOFUFwmJ4lIYoX m8TV0Yh0wzJA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,433,1592895600"; d="scan'208";a="508005234" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga005.fm.intel.com with ESMTP; 16 Sep 2020 06:34:57 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 95FCE2D0; Wed, 16 Sep 2020 16:34:56 +0300 (EEST) From: Andy Shevchenko To: Dan Williams , dmaengine@vger.kernel.org, Vinod Koul Cc: Vladimir Murzin , Andy Shevchenko Subject: [PATCH v1 1/3] dmaengine: dmatest: Fix regression when run command on misconfigured channel Date: Wed, 16 Sep 2020 16:34:54 +0300 Message-Id: <20200916133456.79280-1-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org From: Vladimir Murzin Andy reported that commit 6b41030fdc79 ("dmaengine: dmatest: Restore default for channel") broke his scripts for the case where "busy" channel is used for configuration with expectation that run command would do nothing (and return 0). Instead, behavior was (unintentionally) changed to treat such case as under-configuration and progress with defaults, i.e. run command would start a test with default setting for channel (which would use all channels). Restore original behavior with tracking status of channel setter so we can distinguish between misconfigured and under-configured cases in run command and act accordingly. Fixes: 6b41030fdc79 ("dmaengine: dmatest: Restore default for channel") Reported-by: Andy Shevchenko Tested-by: Andy Shevchenko Signed-off-by: Vladimir Murzin Signed-off-by: Andy Shevchenko --- drivers/dma/dmatest.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index b2790641370a..4c9a9d7b48bb 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -129,6 +129,7 @@ struct dmatest_params { * @nr_channels: number of channels under test * @lock: access protection to the fields of this structure * @did_init: module has been initialized completely + * @last_error: test has faced configuration issues */ static struct dmatest_info { /* Test parameters */ @@ -137,6 +138,7 @@ static struct dmatest_info { /* Internal state */ struct list_head channels; unsigned int nr_channels; + int last_error; struct mutex lock; bool did_init; } test_info = { @@ -1202,10 +1204,22 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp) return ret; } else if (dmatest_run) { if (!is_threaded_test_pending(info)) { - pr_info("No channels configured, continue with any\n"); - if (!is_threaded_test_run(info)) - stop_threaded_test(info); - add_threaded_test(info); + /* + * We have nothing to run. This can be due to: + */ + ret = info->last_error; + if (ret) { + /* 1) Mis-configuration */ + pr_warn("Channel misconfigured, can't continue\n"); + mutex_unlock(&info->lock); + return ret; + } else { + /* 2) We rely on defaults */ + pr_info("No channels configured, continue with any\n"); + if (!is_threaded_test_run(info)) + stop_threaded_test(info); + add_threaded_test(info); + } } start_threaded_tests(info); } else { @@ -1222,7 +1236,7 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) struct dmatest_info *info = &test_info; struct dmatest_chan *dtc; char chan_reset_val[20]; - int ret = 0; + int ret; mutex_lock(&info->lock); ret = param_set_copystring(val, kp); @@ -1230,7 +1244,7 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) mutex_unlock(&info->lock); return ret; } - /*Clear any previously run threads */ + /* Clear any previously run threads */ if (!is_threaded_test_run(info) && !is_threaded_test_pending(info)) stop_threaded_test(info); /* Reject channels that are already registered */ @@ -1277,12 +1291,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) goto add_chan_err; } + info->last_error = ret; mutex_unlock(&info->lock); return ret; add_chan_err: param_set_copystring(chan_reset_val, kp); + info->last_error = ret; mutex_unlock(&info->lock); return ret; From patchwork Wed Sep 16 13:34:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 11780837 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3EF9192C for ; Wed, 16 Sep 2020 20:35:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 25E422087D for ; Wed, 16 Sep 2020 20:35:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727047AbgIPUeD (ORCPT ); Wed, 16 Sep 2020 16:34:03 -0400 Received: from mga09.intel.com ([134.134.136.24]:6031 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726900AbgIPRMy (ORCPT ); Wed, 16 Sep 2020 13:12:54 -0400 IronPort-SDR: dK4pn6I6l80sleAiyOCJKEm4sxk7rOvb2rIY9cZvyixr/QgWFNtTxkxQb/LpG4dWuYsYhCPAJt 5vLvR6b7RM+w== X-IronPort-AV: E=McAfee;i="6000,8403,9745"; a="160390001" X-IronPort-AV: E=Sophos;i="5.76,432,1592895600"; d="scan'208";a="160390001" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2020 06:34:59 -0700 IronPort-SDR: 3JJFnI70kQiYyeypnqq1TpKKMdJAP8B8LRsBX/ot/I1YGYbnmzLwN/4dUd7OTjAZGD++SLqqxZ 5BiCTPFzOJ7g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,432,1592895600"; d="scan'208";a="331680617" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga004.fm.intel.com with ESMTP; 16 Sep 2020 06:34:57 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id A138F277; Wed, 16 Sep 2020 16:34:56 +0300 (EEST) From: Andy Shevchenko To: Dan Williams , dmaengine@vger.kernel.org, Vinod Koul Cc: Andy Shevchenko , Vladimir Murzin Subject: [PATCH v1 2/3] dmaengine: dmatest: Check list for emptiness before access its last entry Date: Wed, 16 Sep 2020 16:34:55 +0300 Message-Id: <20200916133456.79280-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200916133456.79280-1-andriy.shevchenko@linux.intel.com> References: <20200916133456.79280-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org After writing a garbage to the channel we get an Oops in dmatest_chan_set() due to access to last entry in the empty list. [ 212.670672] BUG: unable to handle page fault for address: fffffff000000020 [ 212.677562] #PF: supervisor read access in kernel mode [ 212.682702] #PF: error_code(0x0000) - not-present page ... [ 212.710074] RIP: 0010:dmatest_chan_set+0x149/0x2d0 [dmatest] [ 212.715739] Code: e8 cc f9 ff ff 48 8b 1d 0d 55 00 00 48 83 7b 10 00 0f 84 63 01 00 00 48 c7 c7 d0 65 4d c0 e8 ee 4a f5 e1 48 89 c6 48 8b 43 10 <48> 8b 40 20 48 8b 78 58 48 85 ff 0f 84 f5 00 00 00 e8 b1 41 f5 e1 Fix this by checking list for emptiness before accessing its last entry. Fixes: d53513d5dc28 ("dmaengine: dmatest: Add support for multi channel testing") Cc: Vladimir Murzin Signed-off-by: Andy Shevchenko --- drivers/dma/dmatest.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 4c9a9d7b48bb..757eb1727a04 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -1267,15 +1267,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) add_threaded_test(info); /* Check if channel was added successfully */ - dtc = list_last_entry(&info->channels, struct dmatest_chan, node); - - if (dtc->chan) { + if (!list_empty(&info->channels)) { /* * if new channel was not successfully added, revert the * "test_channel" string to the name of the last successfully * added channel. exception for when users issues empty string * to channel parameter. */ + dtc = list_last_entry(&info->channels, struct dmatest_chan, node); if ((strcmp(dma_chan_name(dtc->chan), strim(test_channel)) != 0) && (strcmp("", strim(test_channel)) != 0)) { ret = -EINVAL; From patchwork Wed Sep 16 13:34:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 11780839 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2CADD1580 for ; Wed, 16 Sep 2020 20:35:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 175D021941 for ; Wed, 16 Sep 2020 20:35:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726627AbgIPUfK (ORCPT ); Wed, 16 Sep 2020 16:35:10 -0400 Received: from mga05.intel.com ([192.55.52.43]:18480 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726901AbgIPRMy (ORCPT ); Wed, 16 Sep 2020 13:12:54 -0400 IronPort-SDR: c29paDL3xnb/xiJg2wNG0e5D3Boo3kmO2cSxkT0kcueqxSpNXvL0lIuX9xhtX0mR+G4Kc65xPE peZ+tDeFqV5g== X-IronPort-AV: E=McAfee;i="6000,8403,9745"; a="244296443" X-IronPort-AV: E=Sophos;i="5.76,432,1592895600"; d="scan'208";a="244296443" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2020 06:34:59 -0700 IronPort-SDR: yd7ldFaLa1khZrsvdCfN5gzu/BkiRi0IEruFAoO/TCjvQOpXXZLgZQ9nZ4X90dk7qANNr/YfXu rM3046Z1S0Qw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,432,1592895600"; d="scan'208";a="451855525" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga004.jf.intel.com with ESMTP; 16 Sep 2020 06:34:57 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id AABDB2E0; Wed, 16 Sep 2020 16:34:56 +0300 (EEST) From: Andy Shevchenko To: Dan Williams , dmaengine@vger.kernel.org, Vinod Koul Cc: Andy Shevchenko , Vladimir Murzin Subject: [PATCH v1 3/3] dmaengine: dmatest: Return boolean result directly in filter() Date: Wed, 16 Sep 2020 16:34:56 +0300 Message-Id: <20200916133456.79280-3-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200916133456.79280-1-andriy.shevchenko@linux.intel.com> References: <20200916133456.79280-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org There is no need to have a conditional for boolean expression when function returns bool. Drop unnecessary code and return boolean result directly. While at it, drop unneeded casting from void *. Cc: Vladimir Murzin Signed-off-by: Andy Shevchenko Tested-by: Peter Ujfalusi --- drivers/dma/dmatest.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 757eb1727a04..cf1379189316 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -1070,13 +1070,7 @@ static int dmatest_add_channel(struct dmatest_info *info, static bool filter(struct dma_chan *chan, void *param) { - struct dmatest_params *params = param; - - if (!dmatest_match_channel(params, chan) || - !dmatest_match_device(params, chan->device)) - return false; - else - return true; + return dmatest_match_channel(param, chan) && dmatest_match_device(param, chan->device); } static void request_channels(struct dmatest_info *info,