]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
IB/mthca: Fix data corruption after FMR unmap on Sinai
authorMichael S. Tsirkin <mst@dev.mellanox.co.il>
Mon, 16 Apr 2007 21:17:42 +0000 (14:17 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 2 May 2007 00:05:54 +0000 (17:05 -0700)
In mthca_arbel_fmr_unmap(), the high bits of the key are masked off.
This gets rid of the effect of adjust_key(), which makes sure that
bits 3 and 23 of the key are equal when the Sinai throughput
optimization is enabled, and so it may happen that an FMR will end up
with bits 3 and 23 in the key being different.  This causes data
corruption, because when enabling the throughput optimization, the
driver promises the HCA firmware that bits 3 and 23 of all memory keys
will always be equal.

Fix by re-applying adjust_key() after masking the key.

Thanks to Or Gerlitz for reproducing the problem, and Ariel Shahar for
help in debug.

Signed-off-by: Michael S. Tsirkin <mst@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/infiniband/hw/mthca/mthca_mr.c

index f71ffa88db3a1066906ffbf261c9273c80338b06..58012acda3248e37453dad5dfd485970b9a30097 100644 (file)
@@ -751,6 +751,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr)
 
        key = arbel_key_to_hw_index(fmr->ibmr.lkey);
        key &= dev->limits.num_mpts - 1;
+       key = adjust_key(dev, key);
        fmr->ibmr.lkey = fmr->ibmr.rkey = arbel_hw_index_to_key(key);
 
        fmr->maps = 0;