Date: Mon, 25 May 2020 22:23:13 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r361484 - head/sys/dev/cxgbe/crypto Message-ID: <202005252223.04PMND8G009789@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Mon May 25 22:23:13 2020 New Revision: 361484 URL: https://svnweb.freebsd.org/changeset/base/361484 Log: Support separate output buffers in ccr(4). Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D24545 Modified: head/sys/dev/cxgbe/crypto/t4_crypto.c Modified: head/sys/dev/cxgbe/crypto/t4_crypto.c ============================================================================== --- head/sys/dev/cxgbe/crypto/t4_crypto.c Mon May 25 22:21:09 2020 (r361483) +++ head/sys/dev/cxgbe/crypto/t4_crypto.c Mon May 25 22:23:13 2020 (r361484) @@ -193,13 +193,16 @@ struct ccr_softc { /* * Pre-allocate S/G lists used when preparing a work request. - * 'sg_crp' contains an sglist describing the entire buffer - * for a 'struct cryptop'. 'sg_ulptx' is used to describe - * the data the engine should DMA as input via ULPTX_SGL. - * 'sg_dsgl' is used to describe the destination that cipher - * text and a tag should be written to. + * 'sg_input' contains an sglist describing the entire input + * buffer for a 'struct cryptop'. 'sg_output' contains an + * sglist describing the entire output buffer. 'sg_ulptx' is + * used to describe the data the engine should DMA as input + * via ULPTX_SGL. 'sg_dsgl' is used to describe the + * destination that cipher text and a tag should be written + * to. */ - struct sglist *sg_crp; + struct sglist *sg_input; + struct sglist *sg_output; struct sglist *sg_ulptx; struct sglist *sg_dsgl; @@ -495,7 +498,7 @@ ccr_hash(struct ccr_softc *sc, struct ccr_session *s, } else { imm_len = 0; sglist_reset(sc->sg_ulptx); - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); @@ -617,10 +620,14 @@ ccr_blkcipher(struct ccr_softc *sc, struct ccr_session op_type = CHCR_ENCRYPT_OP; else op_type = CHCR_DECRYPT_OP; - + sglist_reset(sc->sg_dsgl); - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_payload_start, crp->crp_payload_length); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_payload_output_start, crp->crp_payload_length); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); dsgl_nsegs = ccr_count_sgl(sc->sg_dsgl, DSGL_SGE_MAXLEN); @@ -645,7 +652,7 @@ ccr_blkcipher(struct ccr_softc *sc, struct ccr_session } else { imm_len = 0; sglist_reset(sc->sg_ulptx); - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); @@ -844,13 +851,21 @@ ccr_eta(struct ccr_softc *sc, struct ccr_session *s, s iv_len + crp->crp_aad_length); if (error) return (error); - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_payload_start, crp->crp_payload_length); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_payload_output_start, crp->crp_payload_length); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_ENCRYPT_OP) { - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_digest_start, hash_size_in_response); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_digest_start, hash_size_in_response); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_digest_start, hash_size_in_response); if (error) return (error); } @@ -903,17 +918,17 @@ ccr_eta(struct ccr_softc *sc, struct ccr_session *s, s imm_len = 0; sglist_reset(sc->sg_ulptx); if (crp->crp_aad_length != 0) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_aad_start, crp->crp_aad_length); if (error) return (error); } - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_DECRYPT_OP) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_digest_start, hash_size_in_response); if (error) return (error); @@ -1153,13 +1168,21 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, s crp->crp_aad_length); if (error) return (error); - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_payload_start, crp->crp_payload_length); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_payload_output_start, crp->crp_payload_length); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_ENCRYPT_OP) { - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_digest_start, hash_size_in_response); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_digest_start, hash_size_in_response); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_digest_start, hash_size_in_response); if (error) return (error); } @@ -1199,17 +1222,17 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, s imm_len = 0; sglist_reset(sc->sg_ulptx); if (crp->crp_aad_length != 0) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_aad_start, crp->crp_aad_length); if (error) return (error); } - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_DECRYPT_OP) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_digest_start, hash_size_in_response); if (error) return (error); @@ -1593,13 +1616,21 @@ ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, s aad_len); if (error) return (error); - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_payload_start, crp->crp_payload_length); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_payload_output_start, crp->crp_payload_length); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_ENCRYPT_OP) { - error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp, - crp->crp_digest_start, hash_size_in_response); + if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output, + crp->crp_digest_start, hash_size_in_response); + else + error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input, + crp->crp_digest_start, hash_size_in_response); if (error) return (error); } @@ -1641,17 +1672,17 @@ ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, s sglist_reset(sc->sg_ulptx); if (crp->crp_aad_length != 0) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_aad_start, crp->crp_aad_length); if (error) return (error); } - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_payload_start, crp->crp_payload_length); if (error) return (error); if (op_type == CHCR_DECRYPT_OP) { - error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp, + error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input, crp->crp_digest_start, hash_size_in_response); if (error) return (error); @@ -2080,7 +2111,8 @@ ccr_attach(device_t dev) sc->adapter->ccr_softc = sc; mtx_init(&sc->lock, "ccr", NULL, MTX_DEF); - sc->sg_crp = sglist_alloc(TX_SGL_SEGS, M_WAITOK); + sc->sg_input = sglist_alloc(TX_SGL_SEGS, M_WAITOK); + sc->sg_output = sglist_alloc(TX_SGL_SEGS, M_WAITOK); sc->sg_ulptx = sglist_alloc(TX_SGL_SEGS, M_WAITOK); sc->sg_dsgl = sglist_alloc(MAX_RX_PHYS_DSGL_SGE, M_WAITOK); sc->iv_aad_buf = malloc(MAX_AAD_LEN, M_CCR, M_WAITOK); @@ -2108,7 +2140,8 @@ ccr_detach(device_t dev) free(sc->iv_aad_buf, M_CCR); sglist_free(sc->sg_dsgl); sglist_free(sc->sg_ulptx); - sglist_free(sc->sg_crp); + sglist_free(sc->sg_output); + sglist_free(sc->sg_input); sc->adapter->ccr_softc = NULL; return (0); } @@ -2294,7 +2327,7 @@ ccr_probesession(device_t dev, const struct crypto_ses { unsigned int cipher_mode; - if (csp->csp_flags != 0) + if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT)) != 0) return (EINVAL); switch (csp->csp_mode) { case CSP_MODE_DIGEST: @@ -2576,7 +2609,9 @@ ccr_process(device_t dev, struct cryptop *crp, int hin sc = device_get_softc(dev); mtx_lock(&sc->lock); - error = ccr_populate_sglist(sc->sg_crp, &crp->crp_buf); + error = ccr_populate_sglist(sc->sg_input, &crp->crp_buf); + if (error == 0 && CRYPTO_HAS_OUTPUT_BUFFER(crp)) + error = ccr_populate_sglist(sc->sg_output, &crp->crp_obuf); if (error) { sc->stats_sglist_error++; goto out;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005252223.04PMND8G009789>