|
@@ -716,8 +716,7 @@ static int dmatest_func(void *data)
|
|
|
}
|
|
|
dma_async_issue_pending(chan);
|
|
|
|
|
|
- wait_event_freezable_timeout(done_wait,
|
|
|
- done.done || kthread_should_stop(),
|
|
|
+ wait_event_freezable_timeout(done_wait, done.done,
|
|
|
msecs_to_jiffies(params->timeout));
|
|
|
|
|
|
status = dma_async_is_tx_complete(chan, cookie, NULL, NULL);
|
|
@@ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info)
|
|
|
static int __restart_threaded_test(struct dmatest_info *info, bool run)
|
|
|
{
|
|
|
struct dmatest_params *params = &info->params;
|
|
|
- int ret;
|
|
|
|
|
|
/* Stop any running test first */
|
|
|
__stop_threaded_test(info);
|
|
@@ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run)
|
|
|
memcpy(params, &info->dbgfs_params, sizeof(*params));
|
|
|
|
|
|
/* Run test with new parameters */
|
|
|
- ret = __run_threaded_test(info);
|
|
|
- if (ret) {
|
|
|
- __stop_threaded_test(info);
|
|
|
- pr_err("dmatest: Can't run test\n");
|
|
|
+ return __run_threaded_test(info);
|
|
|
+}
|
|
|
+
|
|
|
+static bool __is_threaded_test_run(struct dmatest_info *info)
|
|
|
+{
|
|
|
+ struct dmatest_chan *dtc;
|
|
|
+
|
|
|
+ list_for_each_entry(dtc, &info->channels, node) {
|
|
|
+ struct dmatest_thread *thread;
|
|
|
+
|
|
|
+ list_for_each_entry(thread, &dtc->threads, node) {
|
|
|
+ if (!thread->done)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return ret;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos,
|
|
@@ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf,
|
|
|
{
|
|
|
struct dmatest_info *info = file->private_data;
|
|
|
char buf[3];
|
|
|
- struct dmatest_chan *dtc;
|
|
|
- bool alive = false;
|
|
|
|
|
|
mutex_lock(&info->lock);
|
|
|
- list_for_each_entry(dtc, &info->channels, node) {
|
|
|
- struct dmatest_thread *thread;
|
|
|
-
|
|
|
- list_for_each_entry(thread, &dtc->threads, node) {
|
|
|
- if (!thread->done) {
|
|
|
- alive = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- if (alive) {
|
|
|
+ if (__is_threaded_test_run(info)) {
|
|
|
buf[0] = 'Y';
|
|
|
} else {
|
|
|
__stop_threaded_test(info);
|
|
@@ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf,
|
|
|
|
|
|
if (strtobool(buf, &bv) == 0) {
|
|
|
mutex_lock(&info->lock);
|
|
|
- ret = __restart_threaded_test(info, bv);
|
|
|
+
|
|
|
+ if (__is_threaded_test_run(info))
|
|
|
+ ret = -EBUSY;
|
|
|
+ else
|
|
|
+ ret = __restart_threaded_test(info, bv);
|
|
|
+
|
|
|
mutex_unlock(&info->lock);
|
|
|
}
|
|
|
|