linux/drivers/of
Jon Hunter 9743a3b62d of: dma: fix protection of DMA controller data stored by DMA helpers
In the current implementation of the OF DMA helpers, read-copy-update (RCU)
linked lists are being used for storing and accessing the DMA controller data.
This part of implementation is based upon V2 of the DMA helpers by Nicolas [1].
During a recent review of RCU, it became apparent that the code is missing the
required rcu_read_lock()/unlock() calls as well as synchronisation calls before
freeing any memory protected by RCU.

Having looked into adding the appropriate RCU calls to protect the DMA data it
became apparent that with the current DMA helper implementation, using RCU is
not as attractive as it may have been before. The main reasons being that ...

1. We need to protect the DMA data around calls to the xlate function.
2. The of_dma_simple_xlate() function calls the DMA engine function
   dma_request_channel() which employs a mutex and so could sleep.
3. The RCU read-side critical sections must not sleep and so we cannot hold
   an RCU read lock around the xlate function.

Therefore, instead of using RCU, an alternative for this use-case is to employ
a simple spinlock inconjunction with a usage count variable to keep track of
how many current users of the DMA data structure there are. With this
implementation, the DMA data cannot be freed until all current users of the
DMA data are finished.

This patch is based upon the DMA helpers fix for potential deadlock [2].

[1] http://article.gmane.org/gmane.linux.ports.arm.omap/73622
[2] http://marc.info/?l=linux-arm-kernel&m=134859982520984&w=2

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
2013-01-07 22:05:01 -08:00
..
Kconfig of_i2c: sparc: Allow OF_I2C for sparc 2012-12-07 09:17:55 -08:00
Makefile of: Add generic device tree DMA helpers 2013-01-06 20:57:46 -08:00
address.c of/address: sparse fixes 2012-10-17 15:53:01 -05:00
base.c of: Fix export of of_find_matching_node_and_match() 2012-12-19 10:58:53 +00:00
device.c drivercore: Output common devicetree information in uevent 2012-02-01 14:26:30 -07:00
dma.c of: dma: fix protection of DMA controller data stored by DMA helpers 2013-01-07 22:05:01 -08:00
fdt.c drivers/of/fdt.c: re-use kernel's kbasename() 2012-12-17 17:15:18 -08:00
irq.c of/irq: sparse fixes 2012-10-17 15:53:02 -05:00
of_i2c.c of_i2c: Honour "status=disabled" property of device 2012-11-29 17:28:08 +00:00
of_mdio.c of_mdio: Honour "status=disabled" property of device 2012-11-29 17:36:16 +00:00
of_mtd.c of: mtd: nuke useless const qualifier 2012-07-10 10:32:06 -05:00
of_net.c drivers/of: include export.h for EXPORT_SYMBOL_GPL/THIS_MODULE as required 2011-10-31 19:31:56 -04:00
of_pci.c of: of_pci.c needs export.h since it uses EXPORT_SYMBOLS 2011-10-31 19:31:14 -04:00
of_pci_irq.c OF: PCI: const usage needed by MIPS 2012-05-21 14:31:48 +01:00
pdt.c Fix build when CONFIG_W1_MASTER_GPIO=m b exporting "allnodes" 2012-11-30 10:04:06 +00:00
platform.c of/platform: sparse fix 2012-10-17 15:53:03 -05:00
selftest.c of: Add of_property_match_string() to find index into a string list 2012-01-28 10:29:20 -07:00