net/qede: remove flags from Tx entry
[dpdk.git] / drivers / net / mlx5 / mlx5_mr.c
index c91d6a4..3255393 100644 (file)
@@ -3,21 +3,12 @@
  * Copyright 2016 Mellanox Technologies, Ltd
  */
 
-#ifdef PEDANTIC
-#pragma GCC diagnostic ignored "-Wpedantic"
-#endif
-#include <infiniband/verbs.h>
-#ifdef PEDANTIC
-#pragma GCC diagnostic error "-Wpedantic"
-#endif
-
 #include <rte_eal_memconfig.h>
 #include <rte_mempool.h>
 #include <rte_malloc.h>
 #include <rte_rwlock.h>
 #include <rte_bus_pci.h>
 
-#include <mlx5_glue.h>
 #include <mlx5_common_mp.h>
 #include <mlx5_common_mr.h>
 
@@ -66,7 +57,7 @@ mlx5_mr_mem_event_free_cb(struct mlx5_dev_ctx_shared *sh,
        int i;
        int rebuild = 0;
 
-       DEBUG("device %s free callback: addr=%p, len=%zu",
+       DRV_LOG(DEBUG, "device %s free callback: addr=%p, len=%zu",
              sh->ibdev_name, addr, len);
        msl = rte_mem_virt2memseg_list(addr);
        /* addr and len must be page-aligned. */
@@ -96,13 +87,13 @@ mlx5_mr_mem_event_free_cb(struct mlx5_dev_ctx_shared *sh,
                pos = ms_idx - mr->ms_base_idx;
                MLX5_ASSERT(rte_bitmap_get(mr->ms_bmp, pos));
                MLX5_ASSERT(pos < mr->ms_bmp_n);
-               DEBUG("device %s MR(%p): clear bitmap[%u] for addr %p",
+               DRV_LOG(DEBUG, "device %s MR(%p): clear bitmap[%u] for addr %p",
                      sh->ibdev_name, (void *)mr, pos, (void *)start);
                rte_bitmap_clear(mr->ms_bmp, pos);
                if (--mr->ms_n == 0) {
                        LIST_REMOVE(mr, mr);
                        LIST_INSERT_HEAD(&sh->share_cache.mr_free_list, mr, mr);
-                       DEBUG("device %s remove MR(%p) from list",
+                       DRV_LOG(DEBUG, "device %s remove MR(%p) from list",
                              sh->ibdev_name, (void *)mr);
                }
                /*
@@ -123,7 +114,7 @@ mlx5_mr_mem_event_free_cb(struct mlx5_dev_ctx_shared *sh,
                 * before the core sees the newly allocated memory.
                 */
                ++sh->share_cache.dev_gen;
-               DEBUG("broadcasting local cache flush, gen=%d",
+               DRV_LOG(DEBUG, "broadcasting local cache flush, gen=%d",
                      sh->share_cache.dev_gen);
                rte_smp_wmb();
        }
@@ -276,7 +267,8 @@ mlx5_mr_update_ext_mp_cb(struct rte_mempool *mp, void *opaque,
                return;
        DRV_LOG(DEBUG, "port %u register MR for chunk #%d of mempool (%s)",
                dev->data->port_id, mem_idx, mp->name);
-       mr = mlx5_create_mr_ext(sh->pd, addr, len, mp->socket_id);
+       mr = mlx5_create_mr_ext(sh->pd, addr, len, mp->socket_id,
+                               sh->share_cache.reg_mr_cb);
        if (!mr) {
                DRV_LOG(WARNING,
                        "port %u unable to allocate a new MR of"
@@ -312,9 +304,10 @@ pci_dev_to_eth_dev(struct rte_pci_device *pdev)
 {
        uint16_t port_id;
 
-       RTE_ETH_FOREACH_DEV_OF(port_id, &pdev->device)
-               return &rte_eth_devices[port_id];
-       return NULL;
+       port_id = rte_eth_find_next_of(0, &pdev->device);
+       if (port_id == RTE_MAX_ETHPORTS)
+               return NULL;
+       return &rte_eth_devices[port_id];
 }
 
 /**
@@ -350,7 +343,8 @@ mlx5_dma_map(struct rte_pci_device *pdev, void *addr,
        }
        priv = dev->data->dev_private;
        sh = priv->sh;
-       mr = mlx5_create_mr_ext(sh->pd, (uintptr_t)addr, len, SOCKET_ID_ANY);
+       mr = mlx5_create_mr_ext(sh->pd, (uintptr_t)addr, len, SOCKET_ID_ANY,
+                               sh->share_cache.reg_mr_cb);
        if (!mr) {
                DRV_LOG(WARNING,
                        "port %u unable to dma map", dev->data->port_id);
@@ -410,8 +404,8 @@ mlx5_dma_unmap(struct rte_pci_device *pdev, void *addr,
                return -1;
        }
        LIST_REMOVE(mr, mr);
-       LIST_INSERT_HEAD(&sh->share_cache.mr_free_list, mr, mr);
-       DEBUG("port %u remove MR(%p) from list", dev->data->port_id,
+       mlx5_mr_free(mr, sh->share_cache.dereg_mr_cb);
+       DRV_LOG(DEBUG, "port %u remove MR(%p) from list", dev->data->port_id,
              (void *)mr);
        mlx5_mr_rebuild_cache(&sh->share_cache);
        /*
@@ -424,7 +418,7 @@ mlx5_dma_unmap(struct rte_pci_device *pdev, void *addr,
         * before the core sees the newly allocated memory.
         */
        ++sh->share_cache.dev_gen;
-       DEBUG("broadcasting local cache flush, gen=%d",
+       DRV_LOG(DEBUG, "broadcasting local cache flush, gen=%d",
              sh->share_cache.dev_gen);
        rte_smp_wmb();
        rte_rwlock_read_unlock(&sh->share_cache.rwlock);
@@ -541,7 +535,21 @@ mlx5_mr_update_mp(struct rte_eth_dev *dev, struct mlx5_mr_ctrl *mr_ctrl,
                .mr_ctrl = mr_ctrl,
                .ret = 0,
        };
+       uint32_t flags = rte_pktmbuf_priv_flags(mp);
 
+       if (flags & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF) {
+               /*
+                * The pinned external buffer should be registered for DMA
+                * operations by application. The mem_list of the pool contains
+                * the list of chunks with mbuf structures w/o built-in data
+                * buffers and DMA actually does not happen there, no need
+                * to create MR for these chunks.
+                */
+               return 0;
+       }
+       DRV_LOG(DEBUG, "Port %u Rx queue registering mp %s "
+                      "having %u chunks.", dev->data->port_id,
+                      mp->name, mp->nb_mem_chunks);
        rte_mempool_mem_iter(mp, mlx5_mr_update_mp_cb, &data);
        if (data.ret < 0 && rte_errno == ENXIO) {
                /* Mempool may have externally allocated memory. */