O2IB_SYMVER=$LINUX_OBJ/Module.symvers
fi
if test -n "$O2IB_SYMVER"; then
- if test !"$O2IB_SYMVER" -ef "$LINUX_OBJ/Module.symvers"; then
+ if test ! "$O2IB_SYMVER" -ef "$LINUX_OBJ/Module.symvers"; then
AC_MSG_NOTICE([adding $O2IB_SYMVER to Symbol Path O2IB])
EXTRA_SYMBOLS="$EXTRA_SYMBOLS $O2IB_SYMVER"
AC_SUBST(EXTRA_SYMBOLS)
])
])
+ # MOFED 5.5 fails with:
+ # ERROR: "ib_dma_virt_map_sg" [.../ko2iblnd.ko] undefined!
+ # See if we have a broken ib_dma_map_sg()
+ AC_DEFUN([LN_SRC_SANE_IB_DMA_MAP_SG], [
+ LB2_LINUX_TEST_SRC([sane_ib_dma_map_sg], [
+ #ifdef HAVE_COMPAT_RDMA
+ #undef PACKAGE_NAME
+ #undef PACKAGE_TARNAME
+ #undef PACKAGE_VERSION
+ #undef PACKAGE_STRING
+ #undef PACKAGE_BUGREPORT
+ #undef PACKAGE_URL
+ #include <linux/compat-2.6.h>
+ #endif
+ #include <rdma/ib_verbs.h>
+ ],[
+ ib_dma_map_sg((struct ib_device *)NULL,
+ (struct scatterlist *)NULL, 1, 0);
+ ],[-Werror],[$EXTRA_OFED_CONFIG $EXTRA_OFED_INCLUDE])
+ ])
+ AC_DEFUN([LN_SANE_IB_DMA_MAP_SG], [
+ AC_MSG_CHECKING([if ib_dma_map_sg() is sane])
+ LB2_LINUX_TEST_RESULT([sane_ib_dma_map_sg], [
+ AC_DEFINE(HAVE_SANE_IB_DMA_MAP_SG, 1,
+ [ib_dma_map_sg is sane])
+ ])
+ ])
+
#
# LN_IB_DEVICE_OPS_EXISTS
#
static inline
int kiblnd_dma_map_sg(struct kib_hca_dev *hdev, struct kib_tx *tx)
{
+ struct ib_device *dev = hdev->ibh_ibdev;
struct scatterlist *sg = tx->tx_frags;
int nents = tx->tx_nfrags;
enum dma_data_direction direction = tx->tx_dmadir;
if (tx->tx_gpu)
- return lnet_rdma_map_sg_attrs(hdev->ibh_ibdev->dma_device,
- sg, nents, direction);
+ return lnet_rdma_map_sg_attrs(dev->dma_device, sg, nents,
+ direction);
- return ib_dma_map_sg(hdev->ibh_ibdev, sg, nents, direction);
+#ifdef HAVE_SANE_IB_DMA_MAP_SG
+ return ib_dma_map_sg(dev, sg, nents, direction);
+#else
+ #ifdef CONFIG_INFINIBAND_VIRT_DMA
+ if (!dev->dma_device) {
+ struct scatterlist *s;
+ int i;
+
+ /* NOTE: open coded ib_dma_virt_map_sg() */
+ for_each_sg(sg, s, nents, i) {
+ sg_dma_address(s) = (uintptr_t)sg_virt(s);
+ sg_dma_len(s) = s->length;
+ }
+ return nents;
+ }
+ #endif
+ return dma_map_sg_attrs(dev->dma_device, sg, nents, direction, 0);
+#endif
}
static inline