Commit ccc1d052 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -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 = {
@@ -1184,11 +1186,23 @@ 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)) {
			/*
			 * We have nothing to run. This can be due to:
			 */
			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);
	} else {
		stop_threaded_test(info);
@@ -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_chan *dtc;
	char chan_reset_val[20];
	int ret = 0;
	int ret;

	mutex_lock(&info->lock);
	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;
	}

	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;