lkml.org 
[lkml]   [2022]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 12/19] crypto: sun8i-ss: rework debugging
    Date
    The "Fallback for xxx" message is annoying, remove it and store the
    information in the debugfs.
    In the same time, reports more fallback statistics.

    Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
    ---
    .../allwinner/sun8i-ss/sun8i-ss-cipher.c | 41 ++++++++++++++-----
    .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 21 ++++++++++
    .../crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 36 ++++++++++++----
    drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 7 +++-
    4 files changed, 83 insertions(+), 22 deletions(-)

    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c
    index c4cb1ab1eeaa..7f1940c6cc41 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c
    @@ -22,35 +22,54 @@

    static bool sun8i_ss_need_fallback(struct skcipher_request *areq)
    {
    + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
    + struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
    + struct sun8i_ss_alg_template *algt = container_of(alg, struct sun8i_ss_alg_template, alg.skcipher);
    struct scatterlist *in_sg = areq->src;
    struct scatterlist *out_sg = areq->dst;
    struct scatterlist *sg;

    - if (areq->cryptlen == 0 || areq->cryptlen % 16)
    + if (areq->cryptlen == 0 || areq->cryptlen % 16) {
    + algt->stat_fb_len++;
    return true;
    + }

    if (sg_nents_for_len(areq->src, areq->cryptlen) > 8 ||
    - sg_nents_for_len(areq->dst, areq->cryptlen) > 8)
    + sg_nents_for_len(areq->dst, areq->cryptlen) > 8) {
    + algt->stat_fb_sgnum++;
    return true;
    + }

    sg = areq->src;
    while (sg) {
    - if ((sg->length % 16) != 0)
    + if ((sg->length % 16) != 0) {
    + algt->stat_fb_sglen++;
    return true;
    - if ((sg_dma_len(sg) % 16) != 0)
    + }
    + if ((sg_dma_len(sg) % 16) != 0) {
    + algt->stat_fb_sglen++;
    return true;
    - if (!IS_ALIGNED(sg->offset, 16))
    + }
    + if (!IS_ALIGNED(sg->offset, 16)) {
    + algt->stat_fb_align++;
    return true;
    + }
    sg = sg_next(sg);
    }
    sg = areq->dst;
    while (sg) {
    - if ((sg->length % 16) != 0)
    + if ((sg->length % 16) != 0) {
    + algt->stat_fb_sglen++;
    return true;
    - if ((sg_dma_len(sg) % 16) != 0)
    + }
    + if ((sg_dma_len(sg) % 16) != 0) {
    + algt->stat_fb_sglen++;
    return true;
    - if (!IS_ALIGNED(sg->offset, 16))
    + }
    + if (!IS_ALIGNED(sg->offset, 16)) {
    + algt->stat_fb_align++;
    return true;
    + }
    sg = sg_next(sg);
    }

    @@ -385,9 +404,9 @@ int sun8i_ss_cipher_init(struct crypto_tfm *tfm)
    crypto_skcipher_reqsize(op->fallback_tfm);


    - dev_info(op->ss->dev, "Fallback for %s is %s\n",
    - crypto_tfm_alg_driver_name(&sktfm->base),
    - crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm)));
    + memcpy(algt->fbname,
    + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm)),
    + CRYPTO_MAX_ALG_NAME);

    op->enginectx.op.do_one_request = sun8i_ss_handle_cipher_request;
    op->enginectx.op.prepare_request = NULL;
    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    index 8d31fd4968f3..f09de5737e8b 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c
    @@ -430,6 +430,17 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq, void *v)
    ss_algs[i].alg.skcipher.base.cra_driver_name,
    ss_algs[i].alg.skcipher.base.cra_name,
    ss_algs[i].stat_req, ss_algs[i].stat_fb);
    +
    + seq_printf(seq, "\tLast fallback is: %s\n",
    + ss_algs[i].fbname);
    + seq_printf(seq, "\tFallback due to length: %lu\n",
    + ss_algs[i].stat_fb_len);
    + seq_printf(seq, "\tFallback due to SG length: %lu\n",
    + ss_algs[i].stat_fb_sglen);
    + seq_printf(seq, "\tFallback due to alignment: %lu\n",
    + ss_algs[i].stat_fb_align);
    + seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
    + ss_algs[i].stat_fb_sgnum);
    break;
    case CRYPTO_ALG_TYPE_RNG:
    seq_printf(seq, "%s %s reqs=%lu tsize=%lu\n",
    @@ -442,6 +453,16 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq, void *v)
    ss_algs[i].alg.hash.halg.base.cra_driver_name,
    ss_algs[i].alg.hash.halg.base.cra_name,
    ss_algs[i].stat_req, ss_algs[i].stat_fb);
    + seq_printf(seq, "\tLast fallback is: %s\n",
    + ss_algs[i].fbname);
    + seq_printf(seq, "\tFallback due to length: %lu\n",
    + ss_algs[i].stat_fb_len);
    + seq_printf(seq, "\tFallback due to SG length: %lu\n",
    + ss_algs[i].stat_fb_sglen);
    + seq_printf(seq, "\tFallback due to alignment: %lu\n",
    + ss_algs[i].stat_fb_align);
    + seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
    + ss_algs[i].stat_fb_sgnum);
    break;
    }
    }
    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    index 1b44c1a115d6..cb510ec21ec4 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c
    @@ -51,9 +51,8 @@ int sun8i_ss_hash_crainit(struct crypto_tfm *tfm)
    sizeof(struct sun8i_ss_hash_reqctx) +
    crypto_ahash_reqsize(op->fallback_tfm));

    - dev_info(op->ss->dev, "Fallback for %s is %s\n",
    - crypto_tfm_alg_driver_name(tfm),
    - crypto_tfm_alg_driver_name(&op->fallback_tfm->base));
    + memcpy(algt->fbname, crypto_tfm_alg_driver_name(&op->fallback_tfm->base), CRYPTO_MAX_ALG_NAME);
    +
    err = pm_runtime_get_sync(op->ss->dev);
    if (err < 0)
    goto error_pm;
    @@ -259,16 +258,29 @@ static int sun8i_ss_run_hash_task(struct sun8i_ss_dev *ss,

    static bool sun8i_ss_hash_need_fallback(struct ahash_request *areq)
    {
    + struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
    + struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
    + struct sun8i_ss_alg_template *algt;
    struct scatterlist *sg;

    - if (areq->nbytes == 0)
    + algt = container_of(alg, struct sun8i_ss_alg_template, alg.hash);
    +
    + if (areq->nbytes == 0) {
    + algt->stat_fb_len++;
    return true;
    - if (areq->nbytes >= MAX_PAD_SIZE - 64)
    + }
    +
    + if (areq->nbytes >= MAX_PAD_SIZE - 64) {
    + algt->stat_fb_len++;
    return true;
    + }

    /* we need to reserve one SG for the padding one */
    - if (sg_nents(areq->src) > MAX_SG - 1)
    + if (sg_nents(areq->src) > MAX_SG - 1) {
    + algt->stat_fb_sgnum++;
    return true;
    + }
    +
    sg = areq->src;
    while (sg) {
    /* SS can operate hash only on full block size
    @@ -276,12 +288,18 @@ static bool sun8i_ss_hash_need_fallback(struct ahash_request *areq)
    * is always 64
    */
    /* Only the last block could be bounced to the pad buffer */
    - if (sg->length % 64 && sg_next(sg))
    + if (sg->length % 64 && sg_next(sg)) {
    + algt->stat_fb_sglen++;
    return true;
    - if (!IS_ALIGNED(sg->offset, sizeof(u32)))
    + }
    + if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
    + algt->stat_fb_align++;
    return true;
    - if (sg->length % 4)
    + }
    + if (sg->length % 4) {
    + algt->stat_fb_sglen++;
    return true;
    + }
    sg = sg_next(sg);
    }
    return false;
    diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    index 2e3524654aca..b56038de333b 100644
    --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h
    @@ -279,11 +279,14 @@ struct sun8i_ss_alg_template {
    struct rng_alg rng;
    struct ahash_alg hash;
    } alg;
    -#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG
    unsigned long stat_req;
    unsigned long stat_fb;
    unsigned long stat_bytes;
    -#endif
    + unsigned long stat_fb_len;
    + unsigned long stat_fb_sglen;
    + unsigned long stat_fb_align;
    + unsigned long stat_fb_sgnum;
    + char fbname[CRYPTO_MAX_ALG_NAME];
    };

    int sun8i_ss_enqueue(struct crypto_async_request *areq, u32 type);
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-05-02 22:22    [W:22.604 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site