dmaengine: dmatest: Prevent to run on misconfigured channel
Andy reported that commit6b41030fdc
("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. 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:6b41030fdc
("dmaengine: dmatest: Restore default for channel") Reported-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Tested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> Tested-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20200922115847.30100-1-andriy.shevchenko@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
Родитель
f4d51dffc6
Коммит
ce65d55f92
|
@ -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 {
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче