linux_old1/drivers/infiniband/hw/qib
Mike Marciniszyn 6a82649f21 IB/qib: Avoid returning EBUSY from MR deregister
A timing issue can occur where qib_mr_dereg can return -EBUSY if the
MR use count is not zero.

This can occur if the MR is de-registered while RDMA read response
packets are being progressed from the SDMA ring.  The suspicion is
that the peer sent an RDMA read request, which has already been copied
across to the peer.  The peer sees the completion of his request and
then communicates to the responder that the MR is not needed any
longer.  The responder tries to de-register the MR, catching some
responses remaining in the SDMA ring holding the MR use count.

The code now uses a get/put paradigm to track MR use counts and
coordinates with the MR de-registration process using a completion
when the count has reached zero.  A timeout on the delay is in place
to catch other EBUSY issues.

The reference count protocol is as follows:
- The return to the user counts as 1
- A reference from the lk_table or the qib_ibdev counts as 1.
- Transient I/O operations increase/decrease as necessary

A lot of code duplication has been folded into the new routines
init_qib_mregion() and deinit_qib_mregion().  Additionally, explicit
initialization of fields to zero is now handled by kzalloc().

Also, duplicated code 'while.*num_sge' that decrements reference
counts have been consolidated in qib_put_ss().

Reviewed-by: Ramkrishna Vepa <ramkrishna.vepa@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
2012-07-08 18:05:19 -07:00
..
Kconfig RDMA: Add netlink infrastructure 2011-05-20 11:46:11 -07:00
Makefile IB/qib: Use request_firmware() to load SD7220 firmware 2010-07-08 13:27:05 -07:00
qib.h IB/qib: Add cache line awareness to qib_qp and qib_devdata structures 2012-05-14 12:43:34 -07:00
qib_6120_regs.h
qib_7220.h IB/qib: Eliminate 64-bit jiffies use 2012-01-03 20:52:12 -08:00
qib_7220_regs.h
qib_7322_regs.h IB/qib: Mask hardware error during link reset 2010-07-06 14:13:20 -07:00
qib_common.h IB/qib: Allow PSM to select from multiple port assignment algorithms 2010-07-21 11:39:36 -07:00
qib_cq.c IB/qib: Generate completion callback on errors 2011-01-10 17:42:19 -08:00
qib_diag.c infiniband: add in export.h for files using EXPORT_SYMBOL/THIS_MODULE 2011-10-31 19:31:35 -04:00
qib_dma.c
qib_driver.c IB/qib: Add prefetch for eager buffers 2012-05-14 12:36:18 -07:00
qib_eeprom.c
qib_file_ops.c IB/qib: Correct sense on freectxts increment and decrement 2011-12-19 09:19:34 -08:00
qib_fs.c infiniband: umode_t noise, including open-coded S_ISDIR() 2012-01-03 22:55:03 -05:00
qib_iba6120.c IB/qib: Optimize pio ack buffer allocation 2012-05-14 12:37:03 -07:00
qib_iba7220.c IB/qib: Optimize pio ack buffer allocation 2012-05-14 12:37:03 -07:00
qib_iba7322.c IB/qib: Fix QLE734X link cycling 2012-05-14 12:39:26 -07:00
qib_init.c IB/qib: Display correct value for number of contexts 2012-05-14 12:39:04 -07:00
qib_intr.c IB/qib: Ensure that LOS and DFE are being turned off 2011-06-17 11:56:59 -07:00
qib_keys.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_mad.c IB/qib: MADs with misset M_Keys should return failure 2012-05-14 12:42:44 -07:00
qib_mad.h IB/pma: Add include file for IBA performance counters definitions 2011-07-18 21:04:35 -07:00
qib_mmap.c
qib_mr.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_pcie.c IB/qib: Add logic for affinity hint 2012-02-25 17:45:49 -08:00
qib_pio_copy.c
qib_qp.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_qsfp.c IB/qib: Fix over-scheduling of QSFP work 2011-11-28 12:17:33 -08:00
qib_qsfp.h IB/qib: Eliminate 64-bit jiffies use 2012-01-03 20:52:12 -08:00
qib_rc.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_ruc.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_sd7220.c IB/qib: Fix style issues 2012-01-03 20:51:42 -08:00
qib_sdma.c infiniband: add moduleparam.h to drivers/infiniband as required 2011-10-31 19:31:36 -04:00
qib_srq.c RDMA/core: Add SRQ type field 2011-10-13 09:13:26 -07:00
qib_sysfs.c IB/qib: Display correct value for number of contexts 2012-05-14 12:39:04 -07:00
qib_twsi.c Fix common misspellings 2011-03-31 11:26:23 -03:00
qib_tx.c IB/qib: Optimize pio ack buffer allocation 2012-05-14 12:37:03 -07:00
qib_uc.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_ud.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_user_pages.c mm: distinguish between mlocked and pinned pages 2011-10-31 17:30:46 -07:00
qib_user_sdma.c Fix common misspellings 2011-03-31 11:26:23 -03:00
qib_user_sdma.h
qib_verbs.c IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_verbs.h IB/qib: Avoid returning EBUSY from MR deregister 2012-07-08 18:05:19 -07:00
qib_verbs_mcast.c
qib_wc_ppc64.c
qib_wc_x86_64.c