summaryrefslogtreecommitdiffstats
path: root/drivers
Commit message (Collapse)AuthorAgeFilesLines
* bonding: Convert miimon to new lockingJay Vosburgh2007-10-231-19/+51
| | | | | | | | | | | | | | | | | | | | | Convert mii (link state) monitor to acquire correct locks for failover events. In particular, failovers generally require RTNL at a low level (when manipulating device MAC addresses, for example) and no other locks. The high level monitor is responsible for acquiring a known set of locks, RTNL, the bond->lock for read and the slave_lock for write, and the low level failover processing can then release appropriate locks as needed. This patch provides the high level portion. As it is undesirable to acquire RTNL for every monitor pass (which may occur as often as every 10 ms), the miimon has been converted to do conditional locking. A first pass inspects all slaves to determine if any action is required, and if so, a second pass (after acquring RTNL) is done to perform any actions (doing a complete rescan, as the situation may have changed when all locks were released). Signed-off-by: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* bonding: Convert balance-rr transmit to new lockingJay Vosburgh2007-10-232-13/+13
| | | | | | | | | | | | | | Change locking in balance-rr transmit processing to use a free running counter to determine which slave to transmit on. Instead, a free-running counter is maintained, and modulo arithmetic used to select a slave for transmit. This removes lock operations from the TX path, and eliminates a deadlock introduced by the conversion to work queues. Signed-off-by: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* Convert bonding timers to workqueuesJay Vosburgh2007-10-237-122/+117
| | | | | | | | | | | Convert bonding timers to workqueues. This converts the various monitor functions to run in periodic work queues instead of timers. This patch introduces the framework and convers the calls, but does not resolve various locking issues, and does not stand alone. Signed-off-by: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* pasemi_mac: fix typoOlof Johansson2007-10-231-1/+1
| | | | | | | | | | | Add missing &: drivers/net/pasemi_mac.c: In function 'pasemi_mac_clean_rx': drivers/net/pasemi_mac.c:553: warning: passing argument 1 of 'prefetch' makes pointer from integer without a cast Signed-off-by: Olof Johansson <olof@lixom.net> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* defxx.c: dfx_bus_init() is __devexit not __devinitMaciej W. Rozycki2007-10-231-1/+1
| | | | | | | | The dfx_bus_uninit() call is called from dfx_unregister() which is __devexit and which is ultimately the ->remove call for the device. Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* sky2: crash on removeStephen Hemminger2007-10-231-2/+2
| | | | | | | Fix off-by one in remove logic that just got introduced. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* MIPSnet: Delete all the useless debugging printks.Ralf Baechle2007-10-231-40/+4
| | | | | | | Plus minor formatting fixes. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* AR7 ethernet: small post-merge cleanups and fixesMatteo Croce2007-10-231-19/+12
| | | | | | | Signed-off-by: Matteo Croce <technoboy85@gmail.com> Signed-off-by: Eugene Konev <ejka@imfi.kspu.ru> Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* Merge branch 'features' of git://farnsworth.org/dale/linux-2.6-mv643xx_eth ↵Jeff Garzik2007-10-233-512/+677
|\ | | | | | | into upstream
| * mv643xx_eth: Remove obsolete checksum offload commentDale Farnsworth2007-10-231-3/+0
| | | | | | | | | | | | | | We fixed checksum offload a while back. Remove the note that it doesn't work. Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Merge drivers/net/mv643xx_eth.h into mv643xx_eth.cLennert Buytenhek2007-10-232-568/+557
| | | | | | | | | | | | | | | | | | Since drivers/net/mv643xx_eth.c is the only user of drivers/net/mv643xx_eth.h, there's not much use in having the header file as a separate file, so merge the header into the driver. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Remove unused register definesLennert Buytenhek2007-10-231-87/+0
| | | | | | | | | | | | | | | | | | | | | | Most of the register defines in drivers/net/mv643xx_eth.h aren't used at all. Nuke them -- we can always re-add them if/when we need them, and meanwhile, they unnecessarily clutter up the header file. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Clean up mv643xx_eth.hLennert Buytenhek2007-10-231-283/+250
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apply the following cleanups to drivers/net/mv643xx_eth.h: * Change "#define<tab>" to "#define<space>". * Fix comment block style. * Wrap lines to fit in 80 columns. * Change "foo<<1" to "foo << 1". * Align addresses in the same column. * Parenthesize macro arguments. * Replace "(1<<24) | (1<<23) | (1<<22)" type constructs with "(7 << 22)". Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Remove MV643XX_ETH_ register prefixLennert Buytenhek2007-10-232-410/+397
| | | | | | | | | | | | | | | | | | | | Now that all register address and bit defines are in private namespace (drivers/net/mv643xx_eth.h), we can safely remove the MV643XX_ETH_ prefix to conserve horizontal space. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Remove SHARED_REGS register address biasLennert Buytenhek2007-10-232-125/+117
| | | | | | | | | | | | | | | | | | Start counting mv643xx_eth register addresses from zero, instead of from 0x2000 (MV643XX_ETH_SHARED_REGS.) Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Enable use on Orion platformsLennert Buytenhek2007-10-232-6/+9
| | | | | | | | | | | | | | | | Allow Orion ARM platforms to use the mv643xx_eth driver. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Disable RX/TX byte swapping on little-endian systemsLennert Buytenhek2007-10-231-0/+11
| | | | | | | | | | | | | | | | | | On little-endian systems, configure the SDMA unit with MV643XX_ETH_BLM_RX_NO_SWAP and MV643XX_ETH_BLM_TX_NO_SWAP. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
| * mv643xx_eth: Move ethernet register definitions into private headerLennert Buytenhek2007-10-231-1/+307
| | | | | | | | | | | | | | | | | | | | Move the mv643xx's ethernet-related register definitions from include/linux/mv643xx.h into drivers/net/mv643xx_eth.h, since they aren't of any use outside the ethernet driver. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Acked-by: Tzachi Perelstein <tzachi@marvell.com> Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
* | Merge branch 'bug-fixes' of git://farnsworth.org/dale/linux-2.6-mv643xx_eth ↵Jeff Garzik2007-10-231-0/+1
|\ \ | | | | | | | | | into upstream
| * | mv643xx_eth: Hook up mv643xx_get_sset_countDale Farnsworth2007-10-231-0/+1
| |/ | | | | | | | | | | | | | | | | Commit b9f2c044 replaced mv643xx_get_stats_count() with mv643xx_get_sset_count(), but forgot to hook it up. drivers/net/mv643xx_eth.c:2678: warning: mv643xx_get_sset_count defined but not used Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
* | Merge branch 'upstream-jeff' of ↵Jeff Garzik2007-10-231-141/+265
|\ \ | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/romieu/netdev-2.6 into upstream
| * | r8169: more phy init for the 8168Francois Romieu2007-10-181-0/+34
| | | | | | | | | | | | | | | | | | | | | | | | Realtek's r8168 driver version 8.003.00 adds new init sequences (they do not appear in version 8.002.00). Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: update the phy init for the 8168CFrancois Romieu2007-10-181-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | The values have been updated between version 8.002.00 and version 8.003.00 of Realtek's r8168 driver. This modification syncs the 8168C with version 8.003.00. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: phy init cleanupFrancois Romieu2007-10-181-7/+11
| | | | | | | | | | | | | | | | | | | | | Consistent use of hexadecimal. No change of behavior otherwise. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: phy init for the 8168Francois Romieu2007-10-181-0/+52
| | | | | | | | | | | | | | | | | | | | | | | | The values have been extracted from Realtek's r8168 driver version 8.002.00. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: make room for more phy init changesFrancois Romieu2007-10-181-25/+31
| | | | | | | | | | | | | | | | | | | | | | | | The code is reworked to easily add phy-dependant init changes. No change of behavior should be noticed. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: remove dead woodFrancois Romieu2007-10-181-64/+2
| | | | | | | | | | | | | | | Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: add MAC identifiersFrancois Romieu2007-10-181-23/+64
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The identifiers have been extracted from Realtek's drivers: - version 8.002.00 of the r8168 driver - version 6.002.00 of the r8169 driver - version 1.002.00 of the r8101 driver 1. RTL_GIGA_MAC_VER_17 (8168Bf) is isolated from RTL_GIGA_MAC_VER_12 (8168Be) Both are still handled the same in rtl8169_set_speed_xmii and in rtl_set_rx_mode to avoid changes of behavior in this patch. 2. RTL_GIGA_MAC_VER_16 (8101Ec) is isolated from RTL_GIGA_MAC_VER_13 (8101Eb) Same thing as above with relation to rtl8169_set_speed_xmii, rtl_set_rx_mode and rtl_hw_start_8101. 3. The remaining new identifiers should not hurt. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: use the existing symbolic name of vendor PCI ID 0x1259Francois Romieu2007-10-181-1/+1
| | | | | | | | | | | | | | | Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: remove private net_device_stats structureFrancois Romieu2007-10-181-17/+17
| | | | | | | | | | | | | | | | | | | | | Use net_device_stats in the net_device structure. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: MSI supportFrancois Romieu2007-10-181-6/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | It is currently limited to the tested 0x8136 and 0x8168. 8169sb/8110sb ought to handle it as well where they support MSI. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw> Tester-Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>
| * | r8169: convert bitfield to plain enum maskFrancois Romieu2007-10-181-3/+11
| | | | | | | | | | | | | | | Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: KERN_XXX vs PFX (trivial)Joe Perches2007-10-181-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Wrong ordering in printk. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
| * | r8169: add KERN_DEBUG to dprintk (trivial)Joe Perches2007-10-181-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | - prefix dprintk with KERN_DEBUG - fix a bug with existing use of dprintk (PFX KERN_INFO PFX) Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
* | | [PATCH] Fix breakage after SG cleanupsRalf Baechle2007-10-238-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commits 58b053e4ce9d2fc3023645c1b96e537c72aa8d9a ("Update arch/ to use sg helpers") 45711f1af6eff1a6d010703b4862e0d2b9afd056 ("[SG] Update drivers to use sg helpers") fa05f1286be25a8ce915c5dd492aea61126b3f33 ("Update net/ to use sg helpers") converted many files to use the scatter gather helpers without ensuring that the necessary headerfile <linux/scatterlist> is included. This happened to work for ia64, powerpc, sparc64 and x86 because they happened to drag in that file via their <asm/dma-mapping.h>. On most of the others this probably broke. Instead of increasing the header file spider web I choose to include <linux/scatterlist.h> directly into the affectes files. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: Jens Axboe <jens.axboe@oracle.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* | | mmc: fix sg->page falloutEmil Medve2007-10-231-1/+1
| | | | | | | | | | | | | | | Signed-off-by: Emil Medve <Emilian.Medve@Freescale.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
* | | Merge branch 'for-linus' of ↵Linus Torvalds2007-10-2318-313/+284
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: mlx4_core: Increase command timeout for INIT_HCA to 10 seconds IPoIB/cm: Use common CQ for CM send completions IB/uverbs: Fix checking of userspace object ownership IB/mlx4: Sanity check userspace send queue sizes IPoIB: Rewrite "if (!likely(...))" as "if (unlikely(!(...)))" IB/ehca: Enable large page MRs by default IB/ehca: Change meaning of hca_cap_mr_pgsize IB/ehca: Fix ehca_encode_hwpage_size() and alloc_fmr() IB/ehca: Fix masking error in {,re}reg_phys_mr() IB/ehca: Supply QP token for SRQ base QPs IPoIB: Use round_jiffies() for ah_reap_task RDMA/cma: Fix deadlock destroying listen requests RDMA/cma: Add locking around QP accesses IB/mthca: Avoid alignment traps when writing doorbells mlx4_core: Kill mlx4_write64_raw()
| * | | mlx4_core: Increase command timeout for INIT_HCA to 10 secondsJack Morgenstein2007-10-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The current INIT_HCA firmware command timeout is sufficient for the default number of resources (QPs, CQs, etc) being allocated, but if the HCA profile is modified to increase the amount of resources, then a spurious timeout is detected and HCA initialization fails. Increase the timeout for the INIT_HCA command to 10 seconds, which also brings it into line with all the other command timeouts. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IPoIB/cm: Use common CQ for CM send completionsMichael S. Tsirkin2007-10-194-95/+82
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use the same CQ for CM send completions as for all other IPoIB completions. This means all completions are processed via the same NAPI polling routine. This should help reduce the number of interrupts for bi-directional traffic (such as TCP) and fixes "driver is hogging interrupts" errors reported for IPoIB send side, e.g. <https://bugs.openfabrics.org/show_bug.cgi?id=508> To do this, keep a per-interface counter of outstanding send WRs, and stop the interface when this counter reaches the send queue size to avoid CQ overruns. Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/uverbs: Fix checking of userspace object ownershipRoland Dreier2007-10-191-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 9ead190b ("IB/uverbs: Don't serialize with ib_uverbs_idr_mutex") rewrote how userspace objects are looked up in the uverbs module's idrs, and introduced a severe bug in the process: there is no checking that an operation is being performed by the right process any more. Fix this by adding the missing check of uobj->context in __idr_get_uobj(). Apparently everyone is being very careful to only touch their own objects, because this bug was introduced in June 2006 in 2.6.18, and has gone undetected until now. Cc: stable <stable@kernel.org> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/mlx4: Sanity check userspace send queue sizesJack Morgenstein2007-10-181-2/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add sanity checks to send queue sizes passed in from userspace. The minimum sq stride value below is taken from the MT25408 PRM (section 11.10, Table 306, log_sq_stride definition). Without this check, userspace can submit arbitrarily large/small values for the number of WQEs and the stride, which can crash the kernel. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IPoIB: Rewrite "if (!likely(...))" as "if (unlikely(!(...)))"Roland Dreier2007-10-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | It's too hard to figure out what "!likely(...)" really means, and who knows how compilers interpret the hint. Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/ehca: Enable large page MRs by defaultJoachim Fenkes2007-10-171-1/+1
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/ehca: Change meaning of hca_cap_mr_pgsizeJoachim Fenkes2007-10-174-22/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ehca_shca.hca_cap_mr_pgsize now contains all supported page sizes ORed together. This makes some checks easier to code and understand, plus we can return this value verbatim in query_hca(), fixing a problem with SRP (reported by Anton Blanchard -- thanks!). Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/ehca: Fix ehca_encode_hwpage_size() and alloc_fmr()Joachim Fenkes2007-10-171-11/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Simplify ehca_encode_hwpage_size(), fixing an infinite loop for pgsize == 0 in the process. Fix the bug in alloc_fmr() that triggered the loop. Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/ehca: Fix masking error in {,re}reg_phys_mr()Joachim Fenkes2007-10-171-2/+2
| | | | | | | | | | | | | | | | | | | | Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IB/ehca: Supply QP token for SRQ base QPsJoachim Fenkes2007-10-171-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Because hardware reports the SRQ token in RWQEs of SRQ base QPs, supply the base QP token as SRQ token, so we can properly find the SRQ base QP. Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | IPoIB: Use round_jiffies() for ah_reap_taskAnton Blanchard2007-10-161-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use round_jiffies() to align the 1 second ah_reap_task with other work and potentially save power by sleeping cores for longer. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | RDMA/cma: Fix deadlock destroying listen requestsSean Hefty2007-10-161-47/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Deadlock condition reported by Kanoj Sarcar <kanoj@netxen.com>. The deadlock occurs when a connection request arrives at the same time that a wildcard listen is being destroyed. A wildcard listen maintains per device listen requests for each RDMA device in the system. The per device listens are automatically added and removed when RDMA devices are inserted or removed from the system. When a wildcard listen is destroyed, rdma_destroy_id() acquires the rdma_cm's device mutex ('lock') to protect against hot-plug events adding or removing per device listens. It then tries to destroy the per device listens by calling ib_destroy_cm_id() or iw_destroy_cm_id(). It does this while holding the device mutex. However, if the underlying iw/ib CM reports a connection request while this is occurring, the rdma_cm callback function will try to acquire the same device mutex. Since we're in a callback, the ib_destroy_cm_id() or iw_destroy_cm_id() calls will block until their callback thread returns, but the callback is blocked waiting for the device mutex. Fix this by re-working how per device listens are destroyed. Use rdma_destroy_id(), which avoids the deadlock, in place of cma_destroy_listen(). Additional synchronization is added to handle device hot-plug events and ensure that the id is not destroyed twice. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
| * | | RDMA/cma: Add locking around QP accessesSean Hefty2007-10-161-30/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a user allocates a QP on an rdma_cm_id, the rdma_cm will automatically transition the QP through its states (RTR, RTS, error, etc.) While the QP state transitions are occurring, the QP itself must remain valid. Provide locking around the QP pointer to prevent its destruction while accessing the pointer. This fixes an issue reported by Olaf Kirch from Oracle that resulted in a system crash: "An incoming connection arrives and we decide to tear down the nascent connection. The remote ends decides to do the same. We start to shut down the connection, and call rdma_destroy_qp on our cm_id. ... Now apparently a 'connect reject' message comes in from the other host, and cma_ib_handler() is called with an event of IB_CM_REJ_RECEIVED. It calls cma_modify_qp_err, which for some odd reason tries to modify the exact same QP we just destroyed." Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
OpenPOWER on IntegriCloud