Aligned the security session create and destroy as per the recent changes in rte_security and used the fast mdata field introduced in rte_security. Enabled compilation of cnxk driver.
Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com> Signed-off-by: Akhil Goyal <gak...@marvell.com> --- drivers/net/cnxk/cn10k_ethdev_sec.c | 64 +++++++++++------------------ drivers/net/cnxk/cn9k_ethdev_sec.c | 59 ++++++++++---------------- drivers/net/cnxk/cnxk_ethdev.c | 6 +-- drivers/net/cnxk/cnxk_ethdev.h | 6 --- drivers/net/cnxk/cnxk_ethdev_sec.c | 21 ---------- drivers/net/meson.build | 2 +- 6 files changed, 48 insertions(+), 110 deletions(-) diff --git a/drivers/net/cnxk/cn10k_ethdev_sec.c b/drivers/net/cnxk/cn10k_ethdev_sec.c index 82dc6367dd..3d0f4044d9 100644 --- a/drivers/net/cnxk/cn10k_ethdev_sec.c +++ b/drivers/net/cnxk/cn10k_ethdev_sec.c @@ -228,15 +228,14 @@ cn10k_eth_sec_sso_work_cb(uint64_t *gw, void *args) static int cn10k_eth_sec_session_create(void *device, struct rte_security_session_conf *conf, - struct rte_security_session *sess, - struct rte_mempool *mempool) + void *sess_priv) { struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device; struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cnxk_eth_sec_sess *eth_sec = sess_priv; struct rte_security_ipsec_xform *ipsec; - struct cn10k_sec_sess_priv sess_priv; + struct cn10k_sec_sess_priv fast_mdata; struct rte_crypto_sym_xform *crypto; - struct cnxk_eth_sec_sess *eth_sec; bool inbound, inl_dev; int rc = 0; @@ -264,13 +263,8 @@ cn10k_eth_sec_session_create(void *device, return -EEXIST; } - if (rte_mempool_get(mempool, (void **)ð_sec)) { - plt_err("Could not allocate security session private data"); - return -ENOMEM; - } - memset(eth_sec, 0, sizeof(struct cnxk_eth_sec_sess)); - sess_priv.u64 = 0; + fast_mdata.u64 = 0; /* Acquire lock on inline dev for inbound */ if (inbound && inl_dev) @@ -290,11 +284,11 @@ cn10k_eth_sec_session_create(void *device, plt_err("Failed to create ingress sa, inline dev " "not found or spi not in range"); rc = -ENOTSUP; - goto mempool_put; + goto err; } else if (!sa) { plt_err("Failed to create ingress sa"); rc = -EFAULT; - goto mempool_put; + goto err; } inb_sa = (struct roc_ot_ipsec_inb_sa *)sa; @@ -304,7 +298,7 @@ cn10k_eth_sec_session_create(void *device, plt_err("Inbound SA with SPI %u already in use", ipsec->spi); rc = -EBUSY; - goto mempool_put; + goto err; } memset(inb_sa, 0, sizeof(struct roc_ot_ipsec_inb_sa)); @@ -313,7 +307,7 @@ cn10k_eth_sec_session_create(void *device, rc = cnxk_ot_ipsec_inb_sa_fill(inb_sa, ipsec, crypto); if (rc) { plt_err("Failed to init inbound sa, rc=%d", rc); - goto mempool_put; + goto err; } inb_priv = roc_nix_inl_ot_ipsec_inb_sa_sw_rsvd(inb_sa); @@ -326,12 +320,11 @@ cn10k_eth_sec_session_create(void *device, inb_sa->w1.s.cookie = rte_cpu_to_be_32(ipsec->spi); /* Prepare session priv */ - sess_priv.inb_sa = 1; - sess_priv.sa_idx = ipsec->spi; + fast_mdata.inb_sa = 1; + fast_mdata.sa_idx = ipsec->spi; /* Pointer from eth_sec -> inb_sa */ eth_sec->sa = inb_sa; - eth_sec->sess = sess; eth_sec->sa_idx = ipsec->spi; eth_sec->spi = ipsec->spi; eth_sec->inl_dev = !!dev->inb.inl_dev; @@ -352,7 +345,7 @@ cn10k_eth_sec_session_create(void *device, /* Alloc an sa index */ rc = cnxk_eth_outb_sa_idx_get(dev, &sa_idx); if (rc) - goto mempool_put; + goto err; outb_sa = roc_nix_inl_ot_ipsec_outb_sa(sa_base, sa_idx); outb_priv = roc_nix_inl_ot_ipsec_outb_sa_sw_rsvd(outb_sa); @@ -365,7 +358,7 @@ cn10k_eth_sec_session_create(void *device, if (rc) { plt_err("Failed to init outbound sa, rc=%d", rc); rc |= cnxk_eth_outb_sa_idx_put(dev, sa_idx); - goto mempool_put; + goto err; } /* Save userdata */ @@ -377,16 +370,15 @@ cn10k_eth_sec_session_create(void *device, cnxk_ipsec_outb_rlens_get(rlens, ipsec, crypto); /* Prepare session priv */ - sess_priv.sa_idx = outb_priv->sa_idx; - sess_priv.roundup_byte = rlens->roundup_byte; - sess_priv.roundup_len = rlens->roundup_len; - sess_priv.partial_len = rlens->partial_len; - sess_priv.mode = outb_sa->w2.s.ipsec_mode; - sess_priv.outer_ip_ver = outb_sa->w2.s.outer_ip_ver; + fast_mdata.sa_idx = outb_priv->sa_idx; + fast_mdata.roundup_byte = rlens->roundup_byte; + fast_mdata.roundup_len = rlens->roundup_len; + fast_mdata.partial_len = rlens->partial_len; + fast_mdata.mode = outb_sa->w2.s.ipsec_mode; + fast_mdata.outer_ip_ver = outb_sa->w2.s.outer_ip_ver; /* Pointer from eth_sec -> outb_sa */ eth_sec->sa = outb_sa; - eth_sec->sess = sess; eth_sec->sa_idx = sa_idx; eth_sec->spi = ipsec->spi; @@ -407,29 +399,23 @@ cn10k_eth_sec_session_create(void *device, /* * Update fast path info in priv area. */ - set_sec_session_private_data(sess, (void *)sess_priv.u64); + rte_security_session_fast_mdata_set(sess_priv, fast_mdata.u64); return 0; -mempool_put: +err: if (inbound && inl_dev) roc_nix_inl_dev_unlock(); - rte_mempool_put(mempool, eth_sec); return rc; } static int -cn10k_eth_sec_session_destroy(void *device, struct rte_security_session *sess) +cn10k_eth_sec_session_destroy(void *device, void *sess_priv) { struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device; struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); - struct roc_ot_ipsec_inb_sa *inb_sa; + struct cnxk_eth_sec_sess *eth_sec = sess_priv; struct roc_ot_ipsec_outb_sa *outb_sa; - struct cnxk_eth_sec_sess *eth_sec; - struct rte_mempool *mp; - - eth_sec = cnxk_eth_sec_sess_get_by_sess(dev, sess); - if (!eth_sec) - return -ENOENT; + struct roc_ot_ipsec_inb_sa *inb_sa; if (eth_sec->inl_dev) roc_nix_inl_dev_lock(); @@ -464,9 +450,7 @@ cn10k_eth_sec_session_destroy(void *device, struct rte_security_session *sess) eth_sec->sa_idx, eth_sec->inl_dev); /* Put eth_sec object back to pool */ - mp = rte_mempool_from_obj(eth_sec); - set_sec_session_private_data(sess, NULL); - rte_mempool_put(mp, eth_sec); + rte_security_session_fast_mdata_set(sess_priv, 0); return 0; } diff --git a/drivers/net/cnxk/cn9k_ethdev_sec.c b/drivers/net/cnxk/cn9k_ethdev_sec.c index b070ad57fc..8a6fa75b37 100644 --- a/drivers/net/cnxk/cn9k_ethdev_sec.c +++ b/drivers/net/cnxk/cn9k_ethdev_sec.c @@ -137,15 +137,14 @@ ar_window_init(struct cn9k_inb_priv_data *inb_priv) static int cn9k_eth_sec_session_create(void *device, struct rte_security_session_conf *conf, - struct rte_security_session *sess, - struct rte_mempool *mempool) + void *sess_priv) { struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device; struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cnxk_eth_sec_sess *eth_sec = sess_priv; struct rte_security_ipsec_xform *ipsec; - struct cn9k_sec_sess_priv sess_priv; + struct cn9k_sec_sess_priv fast_mdata; struct rte_crypto_sym_xform *crypto; - struct cnxk_eth_sec_sess *eth_sec; bool inbound; int rc = 0; @@ -169,13 +168,8 @@ cn9k_eth_sec_session_create(void *device, return -EEXIST; } - if (rte_mempool_get(mempool, (void **)ð_sec)) { - plt_err("Could not allocate security session private data"); - return -ENOMEM; - } - memset(eth_sec, 0, sizeof(struct cnxk_eth_sec_sess)); - sess_priv.u64 = 0; + fast_mdata.u64 = 0; if (inbound) { struct cn9k_inb_priv_data *inb_priv; @@ -192,7 +186,7 @@ cn9k_eth_sec_session_create(void *device, if (!inb_sa) { plt_err("Failed to create ingress sa"); rc = -EFAULT; - goto mempool_put; + goto err; } /* Check if SA is already in use */ @@ -200,7 +194,7 @@ cn9k_eth_sec_session_create(void *device, plt_err("Inbound SA with SPI %u already in use", ipsec->spi); rc = -EBUSY; - goto mempool_put; + goto err; } memset(inb_sa, 0, sizeof(struct roc_onf_ipsec_inb_sa)); @@ -209,7 +203,7 @@ cn9k_eth_sec_session_create(void *device, rc = cnxk_onf_ipsec_inb_sa_fill(inb_sa, ipsec, crypto); if (rc) { plt_err("Failed to init inbound sa, rc=%d", rc); - goto mempool_put; + goto err; } inb_priv = roc_nix_inl_onf_ipsec_inb_sa_sw_rsvd(inb_sa); @@ -223,16 +217,15 @@ cn9k_eth_sec_session_create(void *device, if (inb_priv->replay_win_sz) { rc = ar_window_init(inb_priv); if (rc) - goto mempool_put; + goto err; } /* Prepare session priv */ - sess_priv.inb_sa = 1; - sess_priv.sa_idx = ipsec->spi; + fast_mdata.inb_sa = 1; + fast_mdata.sa_idx = ipsec->spi; /* Pointer from eth_sec -> inb_sa */ eth_sec->sa = inb_sa; - eth_sec->sess = sess; eth_sec->sa_idx = ipsec->spi; eth_sec->spi = ipsec->spi; eth_sec->inb = true; @@ -252,7 +245,7 @@ cn9k_eth_sec_session_create(void *device, /* Alloc an sa index */ rc = cnxk_eth_outb_sa_idx_get(dev, &sa_idx); if (rc) - goto mempool_put; + goto err; outb_sa = roc_nix_inl_onf_ipsec_outb_sa(sa_base, sa_idx); outb_priv = roc_nix_inl_onf_ipsec_outb_sa_sw_rsvd(outb_sa); @@ -265,7 +258,7 @@ cn9k_eth_sec_session_create(void *device, if (rc) { plt_err("Failed to init outbound sa, rc=%d", rc); rc |= cnxk_eth_outb_sa_idx_put(dev, sa_idx); - goto mempool_put; + goto err; } /* Save userdata */ @@ -282,14 +275,13 @@ cn9k_eth_sec_session_create(void *device, /* Save rlen info */ cnxk_ipsec_outb_rlens_get(rlens, ipsec, crypto); - sess_priv.sa_idx = outb_priv->sa_idx; - sess_priv.roundup_byte = rlens->roundup_byte; - sess_priv.roundup_len = rlens->roundup_len; - sess_priv.partial_len = rlens->partial_len; + fast_mdata.sa_idx = outb_priv->sa_idx; + fast_mdata.roundup_byte = rlens->roundup_byte; + fast_mdata.roundup_len = rlens->roundup_len; + fast_mdata.partial_len = rlens->partial_len; /* Pointer from eth_sec -> outb_sa */ eth_sec->sa = outb_sa; - eth_sec->sess = sess; eth_sec->sa_idx = sa_idx; eth_sec->spi = ipsec->spi; @@ -306,27 +298,21 @@ cn9k_eth_sec_session_create(void *device, /* * Update fast path info in priv area. */ - set_sec_session_private_data(sess, (void *)sess_priv.u64); + rte_security_session_fast_mdata_set(sess_priv, fast_mdata.u64); return 0; -mempool_put: - rte_mempool_put(mempool, eth_sec); +err: return rc; } static int -cn9k_eth_sec_session_destroy(void *device, struct rte_security_session *sess) +cn9k_eth_sec_session_destroy(void *device, void *sess_priv) { struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)device; struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cnxk_eth_sec_sess *eth_sec = sess_priv; struct roc_onf_ipsec_outb_sa *outb_sa; struct roc_onf_ipsec_inb_sa *inb_sa; - struct cnxk_eth_sec_sess *eth_sec; - struct rte_mempool *mp; - - eth_sec = cnxk_eth_sec_sess_get_by_sess(dev, sess); - if (!eth_sec) - return -ENOENT; if (eth_sec->inb) { inb_sa = eth_sec->sa; @@ -353,10 +339,7 @@ cn9k_eth_sec_session_destroy(void *device, struct rte_security_session *sess) eth_sec->inb ? "inbound" : "outbound", eth_sec->spi, eth_sec->sa_idx); - /* Put eth_sec object back to pool */ - mp = rte_mempool_from_obj(eth_sec); - set_sec_session_private_data(sess, NULL); - rte_mempool_put(mp, eth_sec); + rte_security_session_fast_mdata_set(sess_priv, 0); return 0; } diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c index 966bd23c7f..572b40e11b 100644 --- a/drivers/net/cnxk/cnxk_ethdev.c +++ b/drivers/net/cnxk/cnxk_ethdev.c @@ -154,8 +154,7 @@ nix_security_release(struct cnxk_eth_dev *dev) /* Destroy inbound sessions */ tvar = NULL; RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->inb.list, entry, tvar) - cnxk_eth_sec_ops.session_destroy(eth_dev, - eth_sec->sess); + cnxk_eth_sec_ops.session_destroy(eth_dev, eth_sec); /* Clear lookup mem */ cnxk_nix_lookup_mem_sa_base_clear(dev); @@ -172,8 +171,7 @@ nix_security_release(struct cnxk_eth_dev *dev) /* Destroy outbound sessions */ tvar = NULL; RTE_TAILQ_FOREACH_SAFE(eth_sec, &dev->outb.list, entry, tvar) - cnxk_eth_sec_ops.session_destroy(eth_dev, - eth_sec->sess); + cnxk_eth_sec_ops.session_destroy(eth_dev, eth_sec); rc = roc_nix_inl_outb_fini(nix); if (rc) diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h index ff21b977b7..eca6c77e7a 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -174,9 +174,6 @@ struct cnxk_eth_sec_sess { /* SPI */ uint32_t spi; - /* Back pointer to session */ - struct rte_security_session *sess; - /* Inbound */ bool inb; @@ -497,9 +494,6 @@ __rte_internal int cnxk_nix_inb_mode_set(struct cnxk_eth_dev *dev, bool use_inl_dev); struct cnxk_eth_sec_sess *cnxk_eth_sec_sess_get_by_spi(struct cnxk_eth_dev *dev, uint32_t spi, bool inb); -struct cnxk_eth_sec_sess * -cnxk_eth_sec_sess_get_by_sess(struct cnxk_eth_dev *dev, - struct rte_security_session *sess); /* Other private functions */ int nix_recalc_mtu(struct rte_eth_dev *eth_dev); diff --git a/drivers/net/cnxk/cnxk_ethdev_sec.c b/drivers/net/cnxk/cnxk_ethdev_sec.c index ae3e49cc82..b220f4d2cf 100644 --- a/drivers/net/cnxk/cnxk_ethdev_sec.c +++ b/drivers/net/cnxk/cnxk_ethdev_sec.c @@ -87,27 +87,6 @@ cnxk_eth_sec_sess_get_by_spi(struct cnxk_eth_dev *dev, uint32_t spi, bool inb) return NULL; } -struct cnxk_eth_sec_sess * -cnxk_eth_sec_sess_get_by_sess(struct cnxk_eth_dev *dev, - struct rte_security_session *sess) -{ - struct cnxk_eth_sec_sess *eth_sec = NULL; - - /* Search in inbound list */ - TAILQ_FOREACH(eth_sec, &dev->inb.list, entry) { - if (eth_sec->sess == sess) - return eth_sec; - } - - /* Search in outbound list */ - TAILQ_FOREACH(eth_sec, &dev->outb.list, entry) { - if (eth_sec->sess == sess) - return eth_sec; - } - - return NULL; -} - static unsigned int cnxk_eth_sec_session_get_size(void *device __rte_unused) { diff --git a/drivers/net/meson.build b/drivers/net/meson.build index 7a09f7183d..bcf488f203 100644 --- a/drivers/net/meson.build +++ b/drivers/net/meson.build @@ -12,7 +12,7 @@ drivers = [ 'bnx2x', 'bnxt', 'bonding', -# 'cnxk', + 'cnxk', 'cxgbe', 'dpaa', 'dpaa2', -- 2.25.1