diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2011-08-18 10:50:51 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2011-08-29 08:31:27 -0400 |
commit | 981ed70d8e4faf3689dbf3c48868a31d5b004d7a (patch) | |
tree | f2fbc7a92971eb6684e39d376f04606fe54697ab /drivers | |
parent | 57001a606f845ce2eda21a0f23e6aab20ee0cb04 (diff) |
dmatest: make dmatest threads freezable
Making dmatest threads freezable allows its use for system PM testing.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dma/dmatest.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index accc18441b16..eb1d8641cf5c 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/delay.h> | 10 | #include <linux/delay.h> |
11 | #include <linux/dma-mapping.h> | 11 | #include <linux/dma-mapping.h> |
12 | #include <linux/dmaengine.h> | 12 | #include <linux/dmaengine.h> |
13 | #include <linux/freezer.h> | ||
13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
14 | #include <linux/kthread.h> | 15 | #include <linux/kthread.h> |
15 | #include <linux/module.h> | 16 | #include <linux/module.h> |
@@ -251,6 +252,7 @@ static int dmatest_func(void *data) | |||
251 | int i; | 252 | int i; |
252 | 253 | ||
253 | thread_name = current->comm; | 254 | thread_name = current->comm; |
255 | set_freezable_with_signal(); | ||
254 | 256 | ||
255 | ret = -ENOMEM; | 257 | ret = -ENOMEM; |
256 | 258 | ||
@@ -305,7 +307,8 @@ static int dmatest_func(void *data) | |||
305 | dma_addr_t dma_srcs[src_cnt]; | 307 | dma_addr_t dma_srcs[src_cnt]; |
306 | dma_addr_t dma_dsts[dst_cnt]; | 308 | dma_addr_t dma_dsts[dst_cnt]; |
307 | struct completion cmp; | 309 | struct completion cmp; |
308 | unsigned long tmo = msecs_to_jiffies(timeout); | 310 | unsigned long start, tmo, end = 0 /* compiler... */; |
311 | bool reload = true; | ||
309 | u8 align = 0; | 312 | u8 align = 0; |
310 | 313 | ||
311 | total_tests++; | 314 | total_tests++; |
@@ -404,7 +407,17 @@ static int dmatest_func(void *data) | |||
404 | } | 407 | } |
405 | dma_async_issue_pending(chan); | 408 | dma_async_issue_pending(chan); |
406 | 409 | ||
407 | tmo = wait_for_completion_timeout(&cmp, tmo); | 410 | do { |
411 | start = jiffies; | ||
412 | if (reload) | ||
413 | end = start + msecs_to_jiffies(timeout); | ||
414 | else if (end <= start) | ||
415 | end = start + 1; | ||
416 | tmo = wait_for_completion_interruptible_timeout(&cmp, | ||
417 | end - start); | ||
418 | reload = try_to_freeze(); | ||
419 | } while (tmo == -ERESTARTSYS); | ||
420 | |||
408 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | 421 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); |
409 | 422 | ||
410 | if (tmo == 0) { | 423 | if (tmo == 0) { |