Commit ccc1d052 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dmaengine-fix-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine

Pull dmaengine fix from Vinod Koul:
 "Fix dmatest for misconfigured channel"

* tag 'dmaengine-fix-5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine:
  dmaengine: dmatest: Prevent to run on misconfigured channel
parents 1ccfa66d ce65d55f
...@@ -129,6 +129,7 @@ struct dmatest_params { ...@@ -129,6 +129,7 @@ struct dmatest_params {
* @nr_channels: number of channels under test * @nr_channels: number of channels under test
* @lock: access protection to the fields of this structure * @lock: access protection to the fields of this structure
* @did_init: module has been initialized completely * @did_init: module has been initialized completely
* @last_error: test has faced configuration issues
*/ */
static struct dmatest_info { static struct dmatest_info {
/* Test parameters */ /* Test parameters */
...@@ -137,6 +138,7 @@ static struct dmatest_info { ...@@ -137,6 +138,7 @@ static struct dmatest_info {
/* Internal state */ /* Internal state */
struct list_head channels; struct list_head channels;
unsigned int nr_channels; unsigned int nr_channels;
int last_error;
struct mutex lock; struct mutex lock;
bool did_init; bool did_init;
} test_info = { } test_info = {
...@@ -1184,10 +1186,22 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp) ...@@ -1184,10 +1186,22 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp)
return ret; return ret;
} else if (dmatest_run) { } else if (dmatest_run) {
if (!is_threaded_test_pending(info)) { if (!is_threaded_test_pending(info)) {
pr_info("No channels configured, continue with any\n"); /*
if (!is_threaded_test_run(info)) * We have nothing to run. This can be due to:
stop_threaded_test(info); */
add_threaded_test(info); ret = info->last_error;
if (ret) {
/* 1) Misconfiguration */
pr_err("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); start_threaded_tests(info);
} else { } else {
...@@ -1204,7 +1218,7 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) ...@@ -1204,7 +1218,7 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp)
struct dmatest_info *info = &test_info; struct dmatest_info *info = &test_info;
struct dmatest_chan *dtc; struct dmatest_chan *dtc;
char chan_reset_val[20]; char chan_reset_val[20];
int ret = 0; int ret;
mutex_lock(&info->lock); mutex_lock(&info->lock);
ret = param_set_copystring(val, kp); ret = param_set_copystring(val, kp);
...@@ -1259,12 +1273,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp) ...@@ -1259,12 +1273,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp)
goto add_chan_err; goto add_chan_err;
} }
info->last_error = ret;
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
return ret; return ret;
add_chan_err: add_chan_err:
param_set_copystring(chan_reset_val, kp); param_set_copystring(chan_reset_val, kp);
info->last_error = ret;
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment