net/bnxt: delay EEM sysmem mapping
authorPeter Spreadborough <peter.spreadborough@broadcom.com>
Wed, 15 Jul 2020 13:50:29 +0000 (19:20 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Jul 2020 11:54:53 +0000 (13:54 +0200)
- The mapping of kernel pages for EEM sysmem operation takes
  a significant amount of time. This change give the build option
  to delay the sysmem mapping until the first write to EEM

Signed-off-by: Peter Spreadborough <peter.spreadborough@broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
drivers/net/bnxt/tf_core/tf_core.c
drivers/net/bnxt/tf_core/tf_em.h
drivers/net/bnxt/tf_core/tf_em_common.c
drivers/net/bnxt/tf_core/tf_em_internal.c
drivers/net/bnxt/tf_core/tf_em_system.c

index 00b2775..a404cb8 100644 (file)
@@ -49,9 +49,22 @@ tf_open_session(struct tf *tfp,
                    &slot,
                    &device);
        if (rc != 4) {
-               TFP_DRV_LOG(ERR,
+               /* PCI Domain not provided (optional in DPDK), thus we
+                * force domain to 0 and recheck.
+                */
+               domain = 0;
+
+               /* Check parsing of bus/slot/device */
+               rc = sscanf(parms->ctrl_chan_name,
+                           "%x:%x.%d",
+                           &bus,
+                           &slot,
+                           &device);
+               if (rc != 3) {
+                       TFP_DRV_LOG(ERR,
                            "Failed to scan device ctrl_chan_name\n");
-               return -EINVAL;
+                       return -EINVAL;
+               }
        }
 
        parms->session_id.internal.domain = domain;
index 0890261..ae2e64d 100644 (file)
@@ -9,6 +9,16 @@
 #include "tf_core.h"
 #include "tf_session.h"
 
+#ifdef TF_USE_SYSTEM_MEM
+/**
+ * Select EEM sysmem mmap export to be done at init
+ * or on the first write to EEM.
+ */
+#define TF_EM_SYSMEM_DELAY_EXPORT 1
+#else
+#define TF_EM_SYSMEM_DELAY_EXPORT 0
+#endif
+
 #define SUPPORT_CFA_HW_P4 1
 #define SUPPORT_CFA_HW_P58 0
 #define SUPPORT_CFA_HW_P59 0
@@ -482,4 +492,5 @@ int
 tf_em_ext_system_bind(struct tf *tfp,
                      struct tf_em_cfg_parms *parms);
 
+int offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb);
 #endif /* _TF_EM_H_ */
index 8b02b8b..65b9abf 100644 (file)
@@ -700,6 +700,26 @@ tf_insert_eem_entry(struct tf_tbl_scope_cb *tbl_scope_cb,
        uint64_t big_hash;
        int rc;
 
+#if (TF_EM_SYSMEM_DELAY_EXPORT == 1)
+       if (!tbl_scope_cb->valid) {
+               rc = offload_system_mmap(tbl_scope_cb);
+
+               if (rc) {
+                       struct tf_rm_free_parms fparms = { 0 };
+
+                       TFP_DRV_LOG(ERR,
+                                   "System alloc mmap failed\n");
+                       /* Free Table control block */
+                       fparms.rm_db = eem_db[TF_DIR_RX];
+                       fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
+                       fparms.index = parms->tbl_scope_id;
+                       tf_rm_free(&fparms);
+                       return -EINVAL;
+               }
+
+               tbl_scope_cb->valid = true;
+       }
+#endif
        /* Get mask to use on hash */
        mask = tf_em_get_key_mask(tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_KEY0_TABLE].num_entries);
 
@@ -1017,6 +1037,27 @@ int tf_tbl_ext_common_set(struct tf *tfp,
                return -EINVAL;
        }
 
+#if (TF_EM_SYSMEM_DELAY_EXPORT == 1)
+       if (!tbl_scope_cb->valid) {
+               rc = offload_system_mmap(tbl_scope_cb);
+
+               if (rc) {
+                       struct tf_rm_free_parms fparms = { 0 };
+
+                       TFP_DRV_LOG(ERR,
+                                   "System alloc mmap failed\n");
+                       /* Free Table control block */
+                       fparms.rm_db = eem_db[TF_DIR_RX];
+                       fparms.db_index = TF_EM_TBL_TYPE_TBL_SCOPE;
+                       fparms.index = parms->tbl_scope_id;
+                       tf_rm_free(&fparms);
+                       return -EINVAL;
+               }
+
+               tbl_scope_cb->valid = true;
+       }
+#endif
+
        op.opcode = HCAPI_CFA_HWOPS_PUT;
        key_tbl.base0 =
                (uint8_t *)&tbl_scope_cb->em_ctx_info[parms->dir].em_tables[TF_RECORD_TABLE];
index 3129fbe..462d0fa 100644 (file)
@@ -179,7 +179,7 @@ tf_em_insert_int_entry(struct tf *tfp,
                return -1;
 
        PMD_DRV_LOG
-                 (ERR,
+                 (DEBUG,
                   "%s, Internal entry @ Index:%d rptr_index:0x%x rptr_entry:0x%x num_of_entries:%d\n",
                   tf_dir_2_str(parms->dir),
                   index,
index 339392c..1c3c702 100644 (file)
@@ -272,8 +272,7 @@ tf_prepare_dmabuf_bnxt_lfc_device(struct tf_tbl_scope_cb *tbl_scope_cb)
        return 0;
 }
 
-static int
-offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb)
+int offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb)
 {
        int rc;
        int dmabuf_fd;
@@ -455,6 +454,7 @@ tf_em_ext_alloc(struct tf *tfp,
                }
        }
 
+#if (TF_EM_SYSMEM_DELAY_EXPORT == 0)
        rc = offload_system_mmap(tbl_scope_cb);
 
        if (rc) {
@@ -462,6 +462,7 @@ tf_em_ext_alloc(struct tf *tfp,
                            "System alloc mmap failed\n");
                goto cleanup_full;
        }
+#endif
 
        return rc;
 
@@ -527,6 +528,7 @@ tf_em_ext_free(struct tf *tfp,
        }
 
        tf_dmabuf_free(tfp, tbl_scope_cb);
+       tbl_scope_cb->valid = false;
 
        return rc;
 }