From nobody Sat Oct 4 12:47:30 2025 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA294279DCE; Mon, 18 Aug 2025 06:57:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.188 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755500240; cv=none; b=HthZNCeMAyF3RmR6w1PK7AHahhegXoKqa9r84FsIsi+yVnwg3+swbMqG+p/KYQxYtEJEGo1UfVj6nJLOaeESwCSSKQZ7ZZRixzC6KSXJ2MX4/16j2Gqr2aIL3FLJ1V5XhbV/TfN5lXtowV1EbSX5S5KJvoWa9neNzFwCb/vI/r4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755500240; c=relaxed/simple; bh=VZsuGeZRdPCWNg6T6HQEKhZN8ss8knjbtAqlaoTDdA8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VB8fFdm+lzFAlN6zR3XhMP1SKXsSQqO5ULOf0xC/FGSsGhkZp/2MDj9kKHLn2JnHONc01eRCZBXFA+Q5IckUJT2l3SyAkTFVoLXI01H2c1mbGJUfI1lR1EeJ73jJPM2LNSl7ypnLsHghxZK2CAgeVjyGTQSMUY54KtOaelKpfwI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.188 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4c53Ld1PpFzFrjQ; Mon, 18 Aug 2025 14:52:41 +0800 (CST) Received: from dggemv706-chm.china.huawei.com (unknown [10.3.19.33]) by mail.maildlp.com (Postfix) with ESMTPS id F0F1C140132; Mon, 18 Aug 2025 14:57:16 +0800 (CST) Received: from kwepemq200001.china.huawei.com (7.202.195.16) by dggemv706-chm.china.huawei.com (10.3.19.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Mon, 18 Aug 2025 14:57:16 +0800 Received: from localhost.huawei.com (10.90.31.46) by kwepemq200001.china.huawei.com (7.202.195.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Mon, 18 Aug 2025 14:57:16 +0800 From: Chenghai Huang To: , CC: , , , , , Subject: [PATCH v2 3/3] crypto: hisilicon/sec2 - support skcipher/aead fallback for hardware queue unavailable Date: Mon, 18 Aug 2025 14:57:14 +0800 Message-ID: <20250818065714.1916898-4-huangchenghai2@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250818065714.1916898-1-huangchenghai2@huawei.com> References: <20250818065714.1916898-1-huangchenghai2@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems500002.china.huawei.com (7.221.188.17) To kwepemq200001.china.huawei.com (7.202.195.16) Content-Type: text/plain; charset="utf-8" From: Qi Tao There is an upper limit on the number of hardware queues. When all hardware queues are busy, new processes fail to apply for queues. To avoid affecting tasks, support fallback mechanism when hardware queues are unavailable. Signed-off-by: Qi Tao Signed-off-by: Chenghai Huang --- drivers/crypto/hisilicon/sec2/sec_crypto.c | 62 ++++++++++++++++------ 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/drivers/crypto/hisilicon/sec2/sec_crypto.c b/drivers/crypto/hi= silicon/sec2/sec_crypto.c index d044ded0f290..8c983c561053 100644 --- a/drivers/crypto/hisilicon/sec2/sec_crypto.c +++ b/drivers/crypto/hisilicon/sec2/sec_crypto.c @@ -669,10 +669,8 @@ static int sec_ctx_base_init(struct sec_ctx *ctx) int i, ret; =20 ctx->qps =3D sec_create_qps(); - if (!ctx->qps) { - pr_err("Can not create sec qps!\n"); + if (!ctx->qps) return -ENODEV; - } =20 sec =3D container_of(ctx->qps[0]->qm, struct sec_dev, qm); ctx->sec =3D sec; @@ -708,6 +706,9 @@ static void sec_ctx_base_uninit(struct sec_ctx *ctx) { int i; =20 + if (!ctx->qps) + return; + for (i =3D 0; i < ctx->sec->ctx_q_num; i++) sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]); =20 @@ -719,6 +720,9 @@ static int sec_cipher_init(struct sec_ctx *ctx) { struct sec_cipher_ctx *c_ctx =3D &ctx->c_ctx; =20 + if (!ctx->qps) + return 0; + c_ctx->c_key =3D dma_alloc_coherent(ctx->dev, SEC_MAX_KEY_SIZE, &c_ctx->c_key_dma, GFP_KERNEL); if (!c_ctx->c_key) @@ -731,6 +735,9 @@ static void sec_cipher_uninit(struct sec_ctx *ctx) { struct sec_cipher_ctx *c_ctx =3D &ctx->c_ctx; =20 + if (!ctx->qps) + return; + memzero_explicit(c_ctx->c_key, SEC_MAX_KEY_SIZE); dma_free_coherent(ctx->dev, SEC_MAX_KEY_SIZE, c_ctx->c_key, c_ctx->c_key_dma); @@ -752,6 +759,9 @@ static void sec_auth_uninit(struct sec_ctx *ctx) { struct sec_auth_ctx *a_ctx =3D &ctx->a_ctx; =20 + if (!ctx->qps) + return; + memzero_explicit(a_ctx->a_key, SEC_MAX_AKEY_SIZE); dma_free_coherent(ctx->dev, SEC_MAX_AKEY_SIZE, a_ctx->a_key, a_ctx->a_key_dma); @@ -789,7 +799,7 @@ static int sec_skcipher_init(struct crypto_skcipher *tf= m) } =20 ret =3D sec_ctx_base_init(ctx); - if (ret) + if (ret && ret !=3D -ENODEV) return ret; =20 ret =3D sec_cipher_init(ctx); @@ -898,6 +908,9 @@ static int sec_skcipher_setkey(struct crypto_skcipher *= tfm, const u8 *key, struct device *dev =3D ctx->dev; int ret; =20 + if (!ctx->qps) + goto set_soft_key; + if (c_mode =3D=3D SEC_CMODE_XTS) { ret =3D xts_verify_key(tfm, key, keylen); if (ret) { @@ -928,13 +941,14 @@ static int sec_skcipher_setkey(struct crypto_skcipher= *tfm, const u8 *key, } =20 memcpy(c_ctx->c_key, key, keylen); - if (c_ctx->fbtfm) { - ret =3D crypto_sync_skcipher_setkey(c_ctx->fbtfm, key, keylen); - if (ret) { - dev_err(dev, "failed to set fallback skcipher key!\n"); - return ret; - } + +set_soft_key: + ret =3D crypto_sync_skcipher_setkey(c_ctx->fbtfm, key, keylen); + if (ret) { + dev_err(dev, "failed to set fallback skcipher key!\n"); + return ret; } + return 0; } =20 @@ -1398,6 +1412,9 @@ static int sec_aead_setkey(struct crypto_aead *tfm, c= onst u8 *key, struct crypto_authenc_keys keys; int ret; =20 + if (!ctx->qps) + return sec_aead_fallback_setkey(a_ctx, tfm, key, keylen); + ctx->a_ctx.a_alg =3D a_alg; ctx->c_ctx.c_alg =3D c_alg; c_ctx->c_mode =3D c_mode; @@ -2057,6 +2074,9 @@ static int sec_skcipher_ctx_init(struct crypto_skciph= er *tfm) if (ret) return ret; =20 + if (!ctx->qps) + return 0; + if (ctx->sec->qm.ver < QM_HW_V3) { ctx->type_supported =3D SEC_BD_TYPE2; ctx->req_op =3D &sec_skcipher_req_ops; @@ -2065,7 +2085,7 @@ static int sec_skcipher_ctx_init(struct crypto_skciph= er *tfm) ctx->req_op =3D &sec_skcipher_req_ops_v3; } =20 - return ret; + return 0; } =20 static void sec_skcipher_ctx_exit(struct crypto_skcipher *tfm) @@ -2133,7 +2153,7 @@ static int sec_aead_ctx_init(struct crypto_aead *tfm,= const char *hash_name) int ret; =20 ret =3D sec_aead_init(tfm); - if (ret) { + if (ret && ret !=3D -ENODEV) { pr_err("hisi_sec2: aead init error!\n"); return ret; } @@ -2175,7 +2195,7 @@ static int sec_aead_xcm_ctx_init(struct crypto_aead *= tfm) int ret; =20 ret =3D sec_aead_init(tfm); - if (ret) { + if (ret && ret !=3D -ENODEV) { dev_err(ctx->dev, "hisi_sec2: aead xcm init error!\n"); return ret; } @@ -2320,6 +2340,9 @@ static int sec_skcipher_crypto(struct skcipher_reques= t *sk_req, bool encrypt) bool need_fallback =3D false; int ret; =20 + if (!ctx->qps) + goto soft_crypto; + if (!sk_req->cryptlen) { if (ctx->c_ctx.c_mode =3D=3D SEC_CMODE_XTS) return -EINVAL; @@ -2337,9 +2360,12 @@ static int sec_skcipher_crypto(struct skcipher_reque= st *sk_req, bool encrypt) return -EINVAL; =20 if (unlikely(ctx->c_ctx.fallback || need_fallback)) - return sec_skcipher_soft_crypto(ctx, sk_req, encrypt); + goto soft_crypto; =20 return ctx->req_op->process(ctx, req); + +soft_crypto: + return sec_skcipher_soft_crypto(ctx, sk_req, encrypt); } =20 static int sec_skcipher_encrypt(struct skcipher_request *sk_req) @@ -2547,6 +2573,9 @@ static int sec_aead_crypto(struct aead_request *a_req= , bool encrypt) bool need_fallback =3D false; int ret; =20 + if (!ctx->qps) + goto soft_crypto; + req->flag =3D a_req->base.flags; req->aead_req.aead_req =3D a_req; req->c_req.encrypt =3D encrypt; @@ -2557,11 +2586,14 @@ static int sec_aead_crypto(struct aead_request *a_r= eq, bool encrypt) ret =3D sec_aead_param_check(ctx, req, &need_fallback); if (unlikely(ret)) { if (need_fallback) - return sec_aead_soft_crypto(ctx, a_req, encrypt); + goto soft_crypto; return -EINVAL; } =20 return ctx->req_op->process(ctx, req); + +soft_crypto: + return sec_aead_soft_crypto(ctx, a_req, encrypt); } =20 static int sec_aead_encrypt(struct aead_request *a_req) --=20 2.33.0