net/bnxt: delay EEM sysmem mapping

- 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>
This commit is contained in:
Peter Spreadborough 2020-07-15 19:20:29 +05:30 committed by Ferruh Yigit
parent ea0dceba0f
commit be19e7fe87
5 changed files with 72 additions and 5 deletions

View 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;

View 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_ */

View 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];

View 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,

View 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;
}