* [dpdk-dev] [PATCH v1] crypto/qat: add DOCSIS performance optimization
@ 2020-07-20 15:37 David Coyle
2020-07-21 14:47 ` [dpdk-dev] [PATCH v2] " David Coyle
0 siblings, 1 reply; 4+ messages in thread
From: David Coyle @ 2020-07-20 15:37 UTC (permalink / raw)
To: fiona.trahe, akhil.goyal
Cc: dev, brendan.ryan, mairtin.oloingsigh, declan.doherty,
pablo.de.lara.guarch, David Coyle
DOCSIS protocol performance in the downlink direction can be improved
significantly in the QAT SYM PMD, especially for larger packets, by
pre-processing all CRC generations in a batch before building and
enqueuing any requests to the HW. This patch adds this optimization.
Fixes: 6f0ef237404b ("crypto/qat: support DOCSIS protocol")
Signed-off-by: David Coyle <david.coyle@intel.com>
---
drivers/common/qat/qat_qp.c | 2 +
drivers/crypto/qat/qat_sym.c | 75 ++++++++----------------------------
drivers/crypto/qat/qat_sym.h | 57 +++++++++++++++++++++++++++
3 files changed, 76 insertions(+), 58 deletions(-)
diff --git a/drivers/common/qat/qat_qp.c b/drivers/common/qat/qat_qp.c
index aacd4ab21..6fd836fdb 100644
--- a/drivers/common/qat/qat_qp.c
+++ b/drivers/common/qat/qat_qp.c
@@ -627,6 +627,8 @@ qat_enqueue_op_burst(void *qp, void **ops, uint16_t nb_ops)
}
}
+ if (tmp_qp->service_type == QAT_SERVICE_SYMMETRIC)
+ qat_sym_preprocess_requests(ops, nb_ops_possible);
while (nb_ops_sent != nb_ops_possible) {
if (tmp_qp->service_type == QAT_SERVICE_SYMMETRIC) {
diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c
index e6bf11523..e3f98a76b 100644
--- a/drivers/crypto/qat/qat_sym.c
+++ b/drivers/crypto/qat/qat_sym.c
@@ -9,9 +9,6 @@
#include <rte_crypto_sym.h>
#include <rte_bus_pci.h>
#include <rte_byteorder.h>
-#ifdef RTE_LIBRTE_SECURITY
-#include <rte_net_crc.h>
-#endif
#include "qat_sym.h"
@@ -102,29 +99,6 @@ qat_bpicipher_preprocess(struct qat_sym_session *ctx,
return sym_op->cipher.data.length - last_block_len;
}
-#ifdef RTE_LIBRTE_SECURITY
-static inline void
-qat_crc_generate(struct qat_sym_session *ctx,
- struct rte_crypto_op *op)
-{
- struct rte_crypto_sym_op *sym_op = op->sym;
- uint32_t *crc, crc_data_len;
- uint8_t *crc_data;
-
- if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT &&
- sym_op->auth.data.length != 0) {
-
- crc_data_len = sym_op->auth.data.length;
- crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
- sym_op->auth.data.offset);
- crc = (uint32_t *)(crc_data + crc_data_len);
-
- *crc = rte_net_crc_calc(crc_data, crc_data_len,
- RTE_NET_CRC32_ETH);
- }
-}
-#endif
-
static inline void
set_cipher_iv(uint16_t iv_length, uint16_t iv_offset,
struct icp_qat_fw_la_cipher_req_params *cipher_param,
@@ -187,7 +161,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
uint64_t auth_data_end = 0;
uint8_t do_sgl = 0;
uint8_t in_place = 1;
- uint8_t is_docsis_sec = 0;
int alignment_adjustment = 0;
struct rte_crypto_op *op = (struct rte_crypto_op *)in_op;
struct qat_sym_op_cookie *cookie =
@@ -211,13 +184,23 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
} else {
ctx = (struct qat_sym_session *)get_sec_session_private_data(
op->sym->sec_session);
- if (ctx && ctx->bpi_ctx == NULL) {
- QAT_DP_LOG(ERR, "QAT PMD only supports security"
- " operation requests for DOCSIS, op"
- " (%p) is not for DOCSIS.", op);
- return -EINVAL;
+ if (likely(ctx)) {
+ if (unlikely(ctx->bpi_ctx == NULL)) {
+ QAT_DP_LOG(ERR, "QAT PMD only supports security"
+ " operation requests for"
+ " DOCSIS, op (%p) is not for"
+ " DOCSIS.", op);
+ return -EINVAL;
+ } else if (unlikely(((op->sym->m_dst != NULL) &&
+ (op->sym->m_dst != op->sym->m_src)) ||
+ op->sym->m_src->nb_segs > 1)) {
+ QAT_DP_LOG(ERR, "OOP and/or multi-segment"
+ " buffers not supported for"
+ " DOCSIS security.");
+ op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+ return -EINVAL;
+ }
}
- is_docsis_sec = 1;
#endif
}
@@ -281,31 +264,7 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
cipher_ofs = op->sym->cipher.data.offset >> 3;
} else if (ctx->bpi_ctx) {
- /* DOCSIS processing */
-#ifdef RTE_LIBRTE_SECURITY
- if (is_docsis_sec) {
- /* Check for OOP or multi-segment buffers */
- if (unlikely(((op->sym->m_dst != NULL) &&
- (op->sym->m_dst !=
- op->sym->m_src)) ||
- op->sym->m_src->nb_segs > 1)) {
- QAT_DP_LOG(ERR,
- "OOP and/or multi-segment "
- "buffers are not supported for "
- "DOCSIS security");
- op->status =
- RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
- return -EINVAL;
- }
-
- /* Calculate CRC */
- qat_crc_generate(ctx, op);
- }
-#else
- RTE_SET_USED(is_docsis_sec);
-#endif
-
- /* Only send complete blocks to device.
+ /* DOCSIS - only send complete blocks to device.
* Process any partial block using CFB mode.
* Even if 0 complete blocks, still send this to device
* to get into rx queue for post-process and dequeuing
diff --git a/drivers/crypto/qat/qat_sym.h b/drivers/crypto/qat/qat_sym.h
index 7934dd478..1a9748849 100644
--- a/drivers/crypto/qat/qat_sym.h
+++ b/drivers/crypto/qat/qat_sym.h
@@ -158,6 +158,57 @@ qat_crc_verify(struct qat_sym_session *ctx, struct rte_crypto_op *op)
op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
}
}
+
+static inline void
+qat_crc_generate(struct qat_sym_session *ctx,
+ struct rte_crypto_op *op)
+{
+ struct rte_crypto_sym_op *sym_op = op->sym;
+ uint32_t *crc, crc_data_len;
+ uint8_t *crc_data;
+
+ if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT &&
+ sym_op->auth.data.length != 0 &&
+ sym_op->m_src->nb_segs == 1) {
+
+ crc_data_len = sym_op->auth.data.length;
+ crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
+ sym_op->auth.data.offset);
+ crc = (uint32_t *)(crc_data + crc_data_len);
+ *crc = rte_net_crc_calc(crc_data, crc_data_len,
+ RTE_NET_CRC32_ETH);
+ }
+}
+
+static inline void
+qat_sym_preprocess_requests(void **ops, uint16_t nb_ops)
+{
+ struct rte_crypto_op *op;
+ struct qat_sym_session *ctx;
+ uint16_t i;
+
+ for (i = 0; i < nb_ops; i++) {
+ op = (struct rte_crypto_op *)ops[i];
+
+ if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
+ ctx = (struct qat_sym_session *)
+ get_sec_session_private_data(
+ op->sym->sec_session);
+
+ if (ctx == NULL || ctx->bpi_ctx == NULL)
+ continue;
+
+ qat_crc_generate(ctx, op);
+ }
+ }
+}
+#else
+
+static inline void
+qat_sym_preprocess_requests(void **ops __rte_unused,
+ uint16_t nb_ops __rte_unused)
+{
+}
#endif
static inline void
@@ -215,6 +266,12 @@ qat_sym_process_response(void **op, uint8_t *resp)
}
#else
+static inline void
+qat_sym_preprocess_requests(void **ops __rte_unused,
+ uint16_t nb_ops __rte_unused)
+{
+}
+
static inline void
qat_sym_process_response(void **op __rte_unused, uint8_t *resp __rte_unused)
{
--
2.17.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [dpdk-dev] [PATCH v2] crypto/qat: add DOCSIS performance optimization
2020-07-20 15:37 [dpdk-dev] [PATCH v1] crypto/qat: add DOCSIS performance optimization David Coyle
@ 2020-07-21 14:47 ` David Coyle
2020-07-21 15:24 ` Trahe, Fiona
0 siblings, 1 reply; 4+ messages in thread
From: David Coyle @ 2020-07-21 14:47 UTC (permalink / raw)
To: fiona.trahe, akhil.goyal
Cc: dev, brendan.ryan, mairtin.oloingsigh, declan.doherty,
pablo.de.lara.guarch, David Coyle
DOCSIS protocol performance in the downlink direction can be improved
significantly in the QAT SYM PMD, especially for larger packets, by
pre-processing all CRC generations in a batch before building and
enqueuing any requests to the HW. This patch adds this optimization.
Fixes: 6f0ef237404b ("crypto/qat: support DOCSIS protocol")
Signed-off-by: David Coyle <david.coyle@intel.com>
---
v2:
* Added '#ifdef BUILD_QAT_SYM' guard around call to
qat_sym_preprocess_requests() in driver/common/qat_qp.c
drivers/common/qat/qat_qp.c | 4 ++
drivers/crypto/qat/qat_sym.c | 75 ++++++++----------------------------
drivers/crypto/qat/qat_sym.h | 57 +++++++++++++++++++++++++++
3 files changed, 78 insertions(+), 58 deletions(-)
diff --git a/drivers/common/qat/qat_qp.c b/drivers/common/qat/qat_qp.c
index aacd4ab21..953873933 100644
--- a/drivers/common/qat/qat_qp.c
+++ b/drivers/common/qat/qat_qp.c
@@ -627,6 +627,10 @@ qat_enqueue_op_burst(void *qp, void **ops, uint16_t nb_ops)
}
}
+#ifdef BUILD_QAT_SYM
+ if (tmp_qp->service_type == QAT_SERVICE_SYMMETRIC)
+ qat_sym_preprocess_requests(ops, nb_ops_possible);
+#endif
while (nb_ops_sent != nb_ops_possible) {
if (tmp_qp->service_type == QAT_SERVICE_SYMMETRIC) {
diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c
index e6bf11523..e3f98a76b 100644
--- a/drivers/crypto/qat/qat_sym.c
+++ b/drivers/crypto/qat/qat_sym.c
@@ -9,9 +9,6 @@
#include <rte_crypto_sym.h>
#include <rte_bus_pci.h>
#include <rte_byteorder.h>
-#ifdef RTE_LIBRTE_SECURITY
-#include <rte_net_crc.h>
-#endif
#include "qat_sym.h"
@@ -102,29 +99,6 @@ qat_bpicipher_preprocess(struct qat_sym_session *ctx,
return sym_op->cipher.data.length - last_block_len;
}
-#ifdef RTE_LIBRTE_SECURITY
-static inline void
-qat_crc_generate(struct qat_sym_session *ctx,
- struct rte_crypto_op *op)
-{
- struct rte_crypto_sym_op *sym_op = op->sym;
- uint32_t *crc, crc_data_len;
- uint8_t *crc_data;
-
- if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT &&
- sym_op->auth.data.length != 0) {
-
- crc_data_len = sym_op->auth.data.length;
- crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
- sym_op->auth.data.offset);
- crc = (uint32_t *)(crc_data + crc_data_len);
-
- *crc = rte_net_crc_calc(crc_data, crc_data_len,
- RTE_NET_CRC32_ETH);
- }
-}
-#endif
-
static inline void
set_cipher_iv(uint16_t iv_length, uint16_t iv_offset,
struct icp_qat_fw_la_cipher_req_params *cipher_param,
@@ -187,7 +161,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
uint64_t auth_data_end = 0;
uint8_t do_sgl = 0;
uint8_t in_place = 1;
- uint8_t is_docsis_sec = 0;
int alignment_adjustment = 0;
struct rte_crypto_op *op = (struct rte_crypto_op *)in_op;
struct qat_sym_op_cookie *cookie =
@@ -211,13 +184,23 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
} else {
ctx = (struct qat_sym_session *)get_sec_session_private_data(
op->sym->sec_session);
- if (ctx && ctx->bpi_ctx == NULL) {
- QAT_DP_LOG(ERR, "QAT PMD only supports security"
- " operation requests for DOCSIS, op"
- " (%p) is not for DOCSIS.", op);
- return -EINVAL;
+ if (likely(ctx)) {
+ if (unlikely(ctx->bpi_ctx == NULL)) {
+ QAT_DP_LOG(ERR, "QAT PMD only supports security"
+ " operation requests for"
+ " DOCSIS, op (%p) is not for"
+ " DOCSIS.", op);
+ return -EINVAL;
+ } else if (unlikely(((op->sym->m_dst != NULL) &&
+ (op->sym->m_dst != op->sym->m_src)) ||
+ op->sym->m_src->nb_segs > 1)) {
+ QAT_DP_LOG(ERR, "OOP and/or multi-segment"
+ " buffers not supported for"
+ " DOCSIS security.");
+ op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+ return -EINVAL;
+ }
}
- is_docsis_sec = 1;
#endif
}
@@ -281,31 +264,7 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,
cipher_ofs = op->sym->cipher.data.offset >> 3;
} else if (ctx->bpi_ctx) {
- /* DOCSIS processing */
-#ifdef RTE_LIBRTE_SECURITY
- if (is_docsis_sec) {
- /* Check for OOP or multi-segment buffers */
- if (unlikely(((op->sym->m_dst != NULL) &&
- (op->sym->m_dst !=
- op->sym->m_src)) ||
- op->sym->m_src->nb_segs > 1)) {
- QAT_DP_LOG(ERR,
- "OOP and/or multi-segment "
- "buffers are not supported for "
- "DOCSIS security");
- op->status =
- RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
- return -EINVAL;
- }
-
- /* Calculate CRC */
- qat_crc_generate(ctx, op);
- }
-#else
- RTE_SET_USED(is_docsis_sec);
-#endif
-
- /* Only send complete blocks to device.
+ /* DOCSIS - only send complete blocks to device.
* Process any partial block using CFB mode.
* Even if 0 complete blocks, still send this to device
* to get into rx queue for post-process and dequeuing
diff --git a/drivers/crypto/qat/qat_sym.h b/drivers/crypto/qat/qat_sym.h
index 7934dd478..1a9748849 100644
--- a/drivers/crypto/qat/qat_sym.h
+++ b/drivers/crypto/qat/qat_sym.h
@@ -158,6 +158,57 @@ qat_crc_verify(struct qat_sym_session *ctx, struct rte_crypto_op *op)
op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
}
}
+
+static inline void
+qat_crc_generate(struct qat_sym_session *ctx,
+ struct rte_crypto_op *op)
+{
+ struct rte_crypto_sym_op *sym_op = op->sym;
+ uint32_t *crc, crc_data_len;
+ uint8_t *crc_data;
+
+ if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT &&
+ sym_op->auth.data.length != 0 &&
+ sym_op->m_src->nb_segs == 1) {
+
+ crc_data_len = sym_op->auth.data.length;
+ crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
+ sym_op->auth.data.offset);
+ crc = (uint32_t *)(crc_data + crc_data_len);
+ *crc = rte_net_crc_calc(crc_data, crc_data_len,
+ RTE_NET_CRC32_ETH);
+ }
+}
+
+static inline void
+qat_sym_preprocess_requests(void **ops, uint16_t nb_ops)
+{
+ struct rte_crypto_op *op;
+ struct qat_sym_session *ctx;
+ uint16_t i;
+
+ for (i = 0; i < nb_ops; i++) {
+ op = (struct rte_crypto_op *)ops[i];
+
+ if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
+ ctx = (struct qat_sym_session *)
+ get_sec_session_private_data(
+ op->sym->sec_session);
+
+ if (ctx == NULL || ctx->bpi_ctx == NULL)
+ continue;
+
+ qat_crc_generate(ctx, op);
+ }
+ }
+}
+#else
+
+static inline void
+qat_sym_preprocess_requests(void **ops __rte_unused,
+ uint16_t nb_ops __rte_unused)
+{
+}
#endif
static inline void
@@ -215,6 +266,12 @@ qat_sym_process_response(void **op, uint8_t *resp)
}
#else
+static inline void
+qat_sym_preprocess_requests(void **ops __rte_unused,
+ uint16_t nb_ops __rte_unused)
+{
+}
+
static inline void
qat_sym_process_response(void **op __rte_unused, uint8_t *resp __rte_unused)
{
--
2.17.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH v2] crypto/qat: add DOCSIS performance optimization
2020-07-21 14:47 ` [dpdk-dev] [PATCH v2] " David Coyle
@ 2020-07-21 15:24 ` Trahe, Fiona
2020-07-26 19:11 ` Akhil Goyal
0 siblings, 1 reply; 4+ messages in thread
From: Trahe, Fiona @ 2020-07-21 15:24 UTC (permalink / raw)
To: Coyle, David, akhil.goyal
Cc: dev, Ryan, Brendan, O'loingsigh, Mairtin, Doherty, Declan,
De Lara Guarch, Pablo
> -----Original Message-----
> From: Coyle, David <david.coyle@intel.com>
> Sent: Tuesday, July 21, 2020 3:47 PM
> To: Trahe, Fiona <fiona.trahe@intel.com>; akhil.goyal@nxp.com
> Cc: dev@dpdk.org; Ryan, Brendan <brendan.ryan@intel.com>; O'loingsigh, Mairtin
> <mairtin.oloingsigh@intel.com>; Doherty, Declan <declan.doherty@intel.com>; De Lara Guarch, Pablo
> <pablo.de.lara.guarch@intel.com>; Coyle, David <david.coyle@intel.com>
> Subject: [PATCH v2] crypto/qat: add DOCSIS performance optimization
>
> DOCSIS protocol performance in the downlink direction can be improved
> significantly in the QAT SYM PMD, especially for larger packets, by
> pre-processing all CRC generations in a batch before building and
> enqueuing any requests to the HW. This patch adds this optimization.
>
> Fixes: 6f0ef237404b ("crypto/qat: support DOCSIS protocol")
>
> Signed-off-by: David Coyle <david.coyle@intel.com>
Acked-by: Fiona Trahe <fiona.trahe@intel.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH v2] crypto/qat: add DOCSIS performance optimization
2020-07-21 15:24 ` Trahe, Fiona
@ 2020-07-26 19:11 ` Akhil Goyal
0 siblings, 0 replies; 4+ messages in thread
From: Akhil Goyal @ 2020-07-26 19:11 UTC (permalink / raw)
To: Trahe, Fiona, Coyle, David
Cc: dev, Ryan, Brendan, O'loingsigh, Mairtin, Doherty, Declan,
De Lara Guarch, Pablo
> >
> > DOCSIS protocol performance in the downlink direction can be improved
> > significantly in the QAT SYM PMD, especially for larger packets, by
> > pre-processing all CRC generations in a batch before building and
> > enqueuing any requests to the HW. This patch adds this optimization.
> >
> > Fixes: 6f0ef237404b ("crypto/qat: support DOCSIS protocol")
> >
> > Signed-off-by: David Coyle <david.coyle@intel.com>
> Acked-by: Fiona Trahe <fiona.trahe@intel.com>
Applied to dpdk-next-crypto
Thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-07-26 19:11 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-20 15:37 [dpdk-dev] [PATCH v1] crypto/qat: add DOCSIS performance optimization David Coyle
2020-07-21 14:47 ` [dpdk-dev] [PATCH v2] " David Coyle
2020-07-21 15:24 ` Trahe, Fiona
2020-07-26 19:11 ` Akhil Goyal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).