diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-23 15:03:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-23 15:03:18 -0400 |
commit | 5554b35933245e95710d709175e14c02cbc956a4 (patch) | |
tree | 2eeb2f05a7061da3c9a3bc9ea69a344b990c6b49 /crypto/async_tx/async_tx.c | |
parent | 0f6e38a6381446eff5175b77d1094834a633a90f (diff) | |
parent | 7f1b358a236ee9c19657a619ac6f2dcabcaa0924 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx: (24 commits)
I/OAT: I/OAT version 3.0 support
I/OAT: tcp_dma_copybreak default value dependent on I/OAT version
I/OAT: Add watchdog/reset functionality to ioatdma
iop_adma: cleanup iop_chan_xor_slot_count
iop_adma: document how to calculate the minimum descriptor pool size
iop_adma: directly reclaim descriptors on allocation failure
async_tx: make async_tx_test_ack a boolean routine
async_tx: remove depend_tx from async_tx_sync_epilog
async_tx: export async_tx_quiesce
async_tx: fix handling of the "out of descriptor" condition in async_xor
async_tx: ensure the xor destination buffer remains dma-mapped
async_tx: list_for_each_entry_rcu() cleanup
dmaengine: Driver for the Synopsys DesignWare DMA controller
dmaengine: Add slave DMA interface
dmaengine: add DMA_COMPL_SKIP_{SRC,DEST}_UNMAP flags to control dma unmap
dmaengine: Add dma_client parameter to device_alloc_chan_resources
dmatest: Simple DMA memcpy test client
dmaengine: DMA engine driver for Marvell XOR engine
iop-adma: fix platform driver hotplug/coldplug
dmaengine: track the number of clients using a channel
...
Fixed up conflict in drivers/dca/dca-sysfs.c manually
Diffstat (limited to 'crypto/async_tx/async_tx.c')
-rw-r--r-- | crypto/async_tx/async_tx.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c index 095c798d3170..85eaf7b1c531 100644 --- a/crypto/async_tx/async_tx.c +++ b/crypto/async_tx/async_tx.c | |||
@@ -295,7 +295,7 @@ dma_channel_add_remove(struct dma_client *client, | |||
295 | case DMA_RESOURCE_REMOVED: | 295 | case DMA_RESOURCE_REMOVED: |
296 | found = 0; | 296 | found = 0; |
297 | spin_lock_irqsave(&async_tx_lock, flags); | 297 | spin_lock_irqsave(&async_tx_lock, flags); |
298 | list_for_each_entry_rcu(ref, &async_tx_master_list, node) | 298 | list_for_each_entry(ref, &async_tx_master_list, node) |
299 | if (ref->chan == chan) { | 299 | if (ref->chan == chan) { |
300 | /* permit backing devices to go away */ | 300 | /* permit backing devices to go away */ |
301 | dma_chan_put(ref->chan); | 301 | dma_chan_put(ref->chan); |
@@ -608,23 +608,34 @@ async_trigger_callback(enum async_tx_flags flags, | |||
608 | pr_debug("%s: (sync)\n", __func__); | 608 | pr_debug("%s: (sync)\n", __func__); |
609 | 609 | ||
610 | /* wait for any prerequisite operations */ | 610 | /* wait for any prerequisite operations */ |
611 | if (depend_tx) { | 611 | async_tx_quiesce(&depend_tx); |
612 | /* if ack is already set then we cannot be sure | ||
613 | * we are referring to the correct operation | ||
614 | */ | ||
615 | BUG_ON(async_tx_test_ack(depend_tx)); | ||
616 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) | ||
617 | panic("%s: DMA_ERROR waiting for depend_tx\n", | ||
618 | __func__); | ||
619 | } | ||
620 | 612 | ||
621 | async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); | 613 | async_tx_sync_epilog(cb_fn, cb_param); |
622 | } | 614 | } |
623 | 615 | ||
624 | return tx; | 616 | return tx; |
625 | } | 617 | } |
626 | EXPORT_SYMBOL_GPL(async_trigger_callback); | 618 | EXPORT_SYMBOL_GPL(async_trigger_callback); |
627 | 619 | ||
620 | /** | ||
621 | * async_tx_quiesce - ensure tx is complete and freeable upon return | ||
622 | * @tx - transaction to quiesce | ||
623 | */ | ||
624 | void async_tx_quiesce(struct dma_async_tx_descriptor **tx) | ||
625 | { | ||
626 | if (*tx) { | ||
627 | /* if ack is already set then we cannot be sure | ||
628 | * we are referring to the correct operation | ||
629 | */ | ||
630 | BUG_ON(async_tx_test_ack(*tx)); | ||
631 | if (dma_wait_for_async_tx(*tx) == DMA_ERROR) | ||
632 | panic("DMA_ERROR waiting for transaction\n"); | ||
633 | async_tx_ack(*tx); | ||
634 | *tx = NULL; | ||
635 | } | ||
636 | } | ||
637 | EXPORT_SYMBOL_GPL(async_tx_quiesce); | ||
638 | |||
628 | module_init(async_tx_init); | 639 | module_init(async_tx_init); |
629 | module_exit(async_tx_exit); | 640 | module_exit(async_tx_exit); |
630 | 641 | ||