> > Currently rte_security_set_pkt_metadata() and rte_security_get_userdata() > methods to set pkt metadata on Inline outbound and get userdata > after Inline inbound processing is always driver specific callbacks. > > For drivers that do not have much to do in the callbacks but just > to update metadata in rte_security dynamic field and get userdata > from rte_security dynamic field, having to just to PMD specific > callback is costly per packet operation. This patch provides > a mechanism to do the same in inline function and avoid function > pointer jump if a driver supports the same. > > Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com> > Acked-by: Akhil Goyal <gak...@marvell.com> > --- > doc/guides/rel_notes/deprecation.rst | 4 --- > doc/guides/rel_notes/release_21_08.rst | 6 +++++ > lib/security/rte_security.c | 8 +++--- > lib/security/rte_security.h | 48 > +++++++++++++++++++++++++++++++--- > lib/security/version.map | 2 ++ > 5 files changed, 56 insertions(+), 12 deletions(-) > > diff --git a/doc/guides/rel_notes/deprecation.rst > b/doc/guides/rel_notes/deprecation.rst > index 59445a6..70ef45e 100644 > --- a/doc/guides/rel_notes/deprecation.rst > +++ b/doc/guides/rel_notes/deprecation.rst > @@ -276,10 +276,6 @@ Deprecation Notices > content. On Linux and FreeBSD, supported prior to DPDK 20.11, > original structure will be kept until DPDK 21.11. > > -* security: The functions ``rte_security_set_pkt_metadata`` and > - ``rte_security_get_userdata`` will be made inline functions and additional > - flags will be added in structure ``rte_security_ctx`` in DPDK 21.11. > - > * cryptodev: The structure ``rte_crypto_op`` would be updated to reduce > reserved bytes to 2 (from 3), and use 1 byte to indicate warnings and other > information from the crypto/security operation. This field will be used to > diff --git a/doc/guides/rel_notes/release_21_08.rst > b/doc/guides/rel_notes/release_21_08.rst > index b4cbf2d..59ff15a 100644 > --- a/doc/guides/rel_notes/release_21_08.rst > +++ b/doc/guides/rel_notes/release_21_08.rst > @@ -223,6 +223,12 @@ ABI Changes > > * No ABI change that would break compatibility with 20.11. > > +* security: ``rte_security_set_pkt_metadata`` and > ``rte_security_get_userdata`` > + routines used by Inline outbound and Inline inbound security processing are > + made inline and enhanced to do simple 64-bit set/get for PMD's that donot > + have much processing in PMD specific callbacks but just 64-bit set/get. > + This avoids a per-pkt function pointer jump overhead for such PMD's. > + > > Known Issues > ------------ > diff --git a/lib/security/rte_security.c b/lib/security/rte_security.c > index e8116d5..fe81ed3 100644 > --- a/lib/security/rte_security.c > +++ b/lib/security/rte_security.c > @@ -122,9 +122,9 @@ rte_security_session_destroy(struct rte_security_ctx > *instance, > } > > int > -rte_security_set_pkt_metadata(struct rte_security_ctx *instance, > - struct rte_security_session *sess, > - struct rte_mbuf *m, void *params) > +__rte_security_set_pkt_metadata(struct rte_security_ctx *instance, > + struct rte_security_session *sess, > + struct rte_mbuf *m, void *params) > { > #ifdef RTE_DEBUG > RTE_PTR_OR_ERR_RET(sess, -EINVAL); > @@ -137,7 +137,7 @@ rte_security_set_pkt_metadata(struct rte_security_ctx > *instance, > } > > void * > -rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md) > +__rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md) > { > void *userdata = NULL; > > diff --git a/lib/security/rte_security.h b/lib/security/rte_security.h > index 2e136d7..3124134 100644 > --- a/lib/security/rte_security.h > +++ b/lib/security/rte_security.h > @@ -71,8 +71,18 @@ struct rte_security_ctx { > /**< Pointer to security ops for the device */ > uint16_t sess_cnt; > /**< Number of sessions attached to this context */ > + uint32_t flags; > + /**< Flags for security context */ > }; > > +#define RTE_SEC_CTX_F_FAST_SET_MDATA 0x00000001 > +/**< Driver uses fast metadata update without using driver specific callback > */
Probably worth to mention somewhere that it is driver responsibility to call rte_security_dynfield_register() to expose that flag. > + > +#define RTE_SEC_CTX_F_FAST_GET_UDATA 0x00000002 > +/**< Driver provides udata using fast method without using driver specific > + * callback. > + */ > + > /** > * IPSEC tunnel parameters > * > @@ -494,6 +504,12 @@ static inline bool > rte_security_dynfield_is_registered(void) > return rte_security_dynfield_offset >= 0; > } > > +/** Function to call PMD specific function pointer set_pkt_metadata() */ > +__rte_experimental > +extern int __rte_security_set_pkt_metadata(struct rte_security_ctx *instance, > + struct rte_security_session *sess, > + struct rte_mbuf *m, void *params); > + > /** > * Updates the buffer with device-specific defined metadata > * > @@ -507,10 +523,26 @@ static inline bool > rte_security_dynfield_is_registered(void) > * - On success, zero. > * - On failure, a negative value. > */ > -int > +static inline int > rte_security_set_pkt_metadata(struct rte_security_ctx *instance, > struct rte_security_session *sess, > - struct rte_mbuf *mb, void *params); > + struct rte_mbuf *mb, void *params) > +{ > + /* Fast Path */ > + if (instance->flags & RTE_SEC_CTX_F_FAST_SET_MDATA) { > + *rte_security_dynfield(mb) = > + (rte_security_dynfield_t)(sess->sess_private_data); > + return 0; > + } > + > + /* Jump to PMD specific function pointer */ > + return __rte_security_set_pkt_metadata(instance, sess, mb, params); > +} > + > +/** Function to call PMD specific function pointer get_userdata() */ > +__rte_experimental > +extern void *__rte_security_get_userdata(struct rte_security_ctx *instance, > + uint64_t md); > > /** > * Get userdata associated with the security session. Device specific > metadata > @@ -530,8 +562,16 @@ rte_security_set_pkt_metadata(struct rte_security_ctx > *instance, > * - On failure, NULL > */ > __rte_experimental > -void * > -rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md); > +static inline void * > +rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md) > +{ > + /* Fast Path */ > + if (instance->flags & RTE_SEC_CTX_F_FAST_GET_UDATA) > + return (void *)(uintptr_t)md; > + > + /* Jump to PMD specific function pointer */ > + return __rte_security_get_userdata(instance, md); > +} > > /** > * Attach a session to a symmetric crypto operation > diff --git a/lib/security/version.map b/lib/security/version.map > index c44c7f5..45ace9c 100644 > --- a/lib/security/version.map > +++ b/lib/security/version.map > @@ -20,4 +20,6 @@ EXPERIMENTAL { > rte_security_get_userdata; > rte_security_session_stats_get; > rte_security_session_update; > + __rte_security_set_pkt_metadata; > + __rte_security_get_userdata; > }; > -- > 2.8.4 Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com>