layerscape: fix DPAA2 QDMA issue
This patch is to reverse a upstream dmatest patch for now which is causing DPAA2 QDMA test issue. Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
This commit is contained in:
		| @@ -0,0 +1,134 @@ | |||||||
|  | From 8772422ee95b17d87b5cb6cb4318b7ec73f4cfcf Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Yangbo Lu <yangbo.lu@nxp.com> | ||||||
|  | Date: Mon, 29 Jan 2018 18:04:07 +0800 | ||||||
|  | Subject: [PATCH] Revert "dmaengine: dmatest: move callback wait queue to | ||||||
|  |  thread context" | ||||||
|  |  | ||||||
|  | This reverts commit 679dbeac0b6bb551e1f3b95673695b22b2ac953d. | ||||||
|  | --- | ||||||
|  |  drivers/dma/dmatest.c | 55 ++++++++++++++++++++++----------------------------- | ||||||
|  |  1 file changed, 24 insertions(+), 31 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/dma/dmatest.c | ||||||
|  | +++ b/drivers/dma/dmatest.c | ||||||
|  | @@ -158,12 +158,6 @@ MODULE_PARM_DESC(run, "Run the test (def | ||||||
|  |  #define PATTERN_OVERWRITE	0x20 | ||||||
|  |  #define PATTERN_COUNT_MASK	0x1f | ||||||
|  |   | ||||||
|  | -/* poor man's completion - we want to use wait_event_freezable() on it */ | ||||||
|  | -struct dmatest_done { | ||||||
|  | -	bool			done; | ||||||
|  | -	wait_queue_head_t	*wait; | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  |  struct dmatest_thread { | ||||||
|  |  	struct list_head	node; | ||||||
|  |  	struct dmatest_info	*info; | ||||||
|  | @@ -172,8 +166,6 @@ struct dmatest_thread { | ||||||
|  |  	u8			**srcs; | ||||||
|  |  	u8			**dsts; | ||||||
|  |  	enum dma_transaction_type type; | ||||||
|  | -	wait_queue_head_t done_wait; | ||||||
|  | -	struct dmatest_done test_done; | ||||||
|  |  	bool			done; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | @@ -334,25 +326,18 @@ static unsigned int dmatest_verify(u8 ** | ||||||
|  |  	return error_count; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +/* poor man's completion - we want to use wait_event_freezable() on it */ | ||||||
|  | +struct dmatest_done { | ||||||
|  | +	bool			done; | ||||||
|  | +	wait_queue_head_t	*wait; | ||||||
|  | +}; | ||||||
|  |   | ||||||
|  |  static void dmatest_callback(void *arg) | ||||||
|  |  { | ||||||
|  |  	struct dmatest_done *done = arg; | ||||||
|  | -	struct dmatest_thread *thread = | ||||||
|  | -		container_of(arg, struct dmatest_thread, done_wait); | ||||||
|  | -	if (!thread->done) { | ||||||
|  | -		done->done = true; | ||||||
|  | -		wake_up_all(done->wait); | ||||||
|  | -	} else { | ||||||
|  | -		/* | ||||||
|  | -		 * If thread->done, it means that this callback occurred | ||||||
|  | -		 * after the parent thread has cleaned up. This can | ||||||
|  | -		 * happen in the case that driver doesn't implement | ||||||
|  | -		 * the terminate_all() functionality and a dma operation | ||||||
|  | -		 * did not occur within the timeout period | ||||||
|  | -		 */ | ||||||
|  | -		WARN(1, "dmatest: Kernel memory may be corrupted!!\n"); | ||||||
|  | -	} | ||||||
|  | + | ||||||
|  | +	done->done = true; | ||||||
|  | +	wake_up_all(done->wait); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static unsigned int min_odd(unsigned int x, unsigned int y) | ||||||
|  | @@ -423,8 +408,9 @@ static unsigned long long dmatest_KBs(s6 | ||||||
|  |   */ | ||||||
|  |  static int dmatest_func(void *data) | ||||||
|  |  { | ||||||
|  | +	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_wait); | ||||||
|  |  	struct dmatest_thread	*thread = data; | ||||||
|  | -	struct dmatest_done	*done = &thread->test_done; | ||||||
|  | +	struct dmatest_done	done = { .wait = &done_wait }; | ||||||
|  |  	struct dmatest_info	*info; | ||||||
|  |  	struct dmatest_params	*params; | ||||||
|  |  	struct dma_chan		*chan; | ||||||
|  | @@ -651,9 +637,9 @@ static int dmatest_func(void *data) | ||||||
|  |  			continue; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | -		done->done = false; | ||||||
|  | +		done.done = false; | ||||||
|  |  		tx->callback = dmatest_callback; | ||||||
|  | -		tx->callback_param = done; | ||||||
|  | +		tx->callback_param = &done; | ||||||
|  |  		cookie = tx->tx_submit(tx); | ||||||
|  |   | ||||||
|  |  		if (dma_submit_error(cookie)) { | ||||||
|  | @@ -666,12 +652,21 @@ static int dmatest_func(void *data) | ||||||
|  |  		} | ||||||
|  |  		dma_async_issue_pending(chan); | ||||||
|  |   | ||||||
|  | -		wait_event_freezable_timeout(thread->done_wait, done->done, | ||||||
|  | +		wait_event_freezable_timeout(done_wait, done.done, | ||||||
|  |  					     msecs_to_jiffies(params->timeout)); | ||||||
|  |   | ||||||
|  |  		status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | ||||||
|  |   | ||||||
|  | -		if (!done->done) { | ||||||
|  | +		if (!done.done) { | ||||||
|  | +			/* | ||||||
|  | +			 * We're leaving the timed out dma operation with | ||||||
|  | +			 * dangling pointer to done_wait.  To make this | ||||||
|  | +			 * correct, we'll need to allocate wait_done for | ||||||
|  | +			 * each test iteration and perform "who's gonna | ||||||
|  | +			 * free it this time?" dancing.  For now, just | ||||||
|  | +			 * leave it dangling. | ||||||
|  | +			 */ | ||||||
|  | +			WARN(1, "dmatest: Kernel stack may be corrupted!!\n"); | ||||||
|  |  			dmaengine_unmap_put(um); | ||||||
|  |  			result("test timed out", total_tests, src_off, dst_off, | ||||||
|  |  			       len, 0); | ||||||
|  | @@ -752,7 +747,7 @@ err_thread_type: | ||||||
|  |  		dmatest_KBs(runtime, total_len), ret); | ||||||
|  |   | ||||||
|  |  	/* terminate all transfers on specified channels */ | ||||||
|  | -	if (ret || failed_tests) | ||||||
|  | +	if (ret) | ||||||
|  |  		dmaengine_terminate_all(chan); | ||||||
|  |   | ||||||
|  |  	thread->done = true; | ||||||
|  | @@ -812,8 +807,6 @@ static int dmatest_add_threads(struct dm | ||||||
|  |  		thread->info = info; | ||||||
|  |  		thread->chan = dtc->chan; | ||||||
|  |  		thread->type = type; | ||||||
|  | -		thread->test_done.wait = &thread->done_wait; | ||||||
|  | -		init_waitqueue_head(&thread->done_wait); | ||||||
|  |  		smp_wmb(); | ||||||
|  |  		thread->task = kthread_create(dmatest_func, thread, "%s-%s%u", | ||||||
|  |  				dma_chan_name(chan), op, i); | ||||||
		Reference in New Issue
	
	Block a user
	 Yangbo Lu
					Yangbo Lu