From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1990A31717B for ; Sun, 24 May 2026 19:46:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651966; cv=none; b=Qsj+upm6CAjMdTueGGrE7giixMShkd91wKn9HMjg+e5Me39qrh/evkze34qXC5BpsoUMxjnPfp5qozIS1XcWeFOhZFYeWLnPP6lSoF54+9ZNnb1/4T0Fr7hntSedIUXUeYK8xCx73K8d/yqJlFn4O2YQqosnVBtfrNAVQbgSHPw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651966; c=relaxed/simple; bh=WIKc2AWfDYUc69JvL1/9qtytzct+TF9XfENjVXjaDWY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TqkkyhbPM/P22uKGswf2r7VgeerbV5GPMZZBk11ZqicAc2AMFCwhl6fWrSPwWBs/PjRliJRUSSmbi4WoTq7LfyU9LWPJTba6s06W1BwEKyxES5hyCBzqS1Phil7uML6y1rtxP8J49H0Istd66KqR3BF0vqplyq6qD/w0p40Zcyo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=URr+eE6f; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="URr+eE6f" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2b9fcf7c91bso101609575ad.0 for ; Sun, 24 May 2026 12:46:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779651962; x=1780256762; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ao2qyIA2jJ7uaRRfz0Dt0ISPAp8Fb4RgnxFXCHmkExc=; b=URr+eE6f0j5ZmAn+SuHtUpKNKt38qDPQS4oblsOXJta8D+z1Wv2HgOrbHu7CscRNCY g+QSjdxOfSLT+A5sWaZrgtQ5BVqwRpUcmSQQT/77mPiNThMET2iw4e8430G4t1ZN0GKM I+fE2pENuTwXeHkuPav6sIa1us+UvwHQ8duf6xyYVROxprbirJhkjGpLdPRKrqNDDbzQ vqoV6yHKSPde/ItBMURNcSU+zcgGP5PiDHq+6/3ef2cFFmAJHS93n0z7n1BzQ+Us6wim /EOxH8EeZmwGf06Yc0iCBAs3faeFdvYzweMws6xuFkynxlyOccNVtLERLwFspqjVy+Sp hwcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779651962; x=1780256762; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ao2qyIA2jJ7uaRRfz0Dt0ISPAp8Fb4RgnxFXCHmkExc=; b=UInwsjoQ03IE5KK3mU7XFf03xwGqu7Y+VJZ2nMzid4okmMKm4Yf+iTwwZE3FnKS7uL LNSVkiGyMGPISn32RZ0vrLNnCMQ1ftDkqsbJurPdfbSj1fNTcbg0w76hQVFm11Ib+3GR BrFRYKJopB+QfBaczEdJdT9TdWsbB9Yor9aVIRl6cZTMKYZlHlUFHdlp+dolvqplaJS7 WeA47KeliIcEn6OPGi1hpMiNn5LhAfxTtPXZKHxCx6bFwl7gEX4Px5c/5AAdYkB1yS14 +AkAz6k9u+BuZJpJcaolrPKJvwwFzHw3Peh9RqoCQ8EZPLGJ2zROC0/xIr+MFpFGZw5b al8Q== X-Forwarded-Encrypted: i=1; AFNElJ+Tsrx0Qb4u5UO1l53QOKMYNngTVg/O15pVzk1Sw3lOcd7Rz6BCSvvF4LoTa2oiMAVuPSSPD0zU7pFk6Gw=@vger.kernel.org X-Gm-Message-State: AOJu0YyCGNgiHi45NXbDT1+/Re0duC1jdeuwa2K2H+SDTtb05U6Tldvp zGRRJXU4au6VUyPx5wrFmpd3UsWBe4DwnhSvrT3g1cCIhJg6CcE2OAVK X-Gm-Gg: Acq92OFzf5Q81zO4EVSnnyvJLkWSlfu4v+T29dpJY1KGA7XFaZvuz/cEQo0mMVSbWOZ UNrd3sz5sKwJq1Xw7udRAGHpnqAtNFkuvzSlY0PRVTFGikhhXA8EAwoYJAcvUN/RyYz1StDXsot 2Va4j8kCRb/o/iAz5x8NygdDibR8iL6plXkemSp7PxAA2DBDP235LHvbiqrWV4j6N2C52z5wInX jopLL8OyVioajK5ROnaA+vi5Uqh4i6CTTAjnIhq6h9hyKI8S7ogzSX37QxxdZ4ataFNmqEIdRY/ wCv/kO43sxyyNMjie0pElsEi97mMXPMKTq6Q4sYJ7jlB4p/L6Pm2Lb+36z1RdqqILMJFOTgcEsI SkArxBvJ1T89QEVJs/gKEV/kHuWL7fo3ZnVa9n2G6ckxEa3/aqVwWsDa40H+n8VzOBJTQS9WB5B 1jIRA+x2Mud78CXbpeNlhFjTVw X-Received: by 2002:a17:902:e885:b0:2bc:e62a:979b with SMTP id d9443c01a7336-2beb0699cdemr130695435ad.30.1779651962547; Sun, 24 May 2026 12:46:02 -0700 (PDT) Received: from mincom1 ([125.149.177.227]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2beb590aa7esm74414485ad.78.2026.05.24.12.45.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 May 2026 12:46:02 -0700 (PDT) From: Jihong Min To: Herbert Xu , linux-crypto@vger.kernel.org Cc: Christian Marangi , Antoine Tenart , "David S . Miller" , Richard van Schagen , linux-kernel@vger.kernel.org, Benjamin Larsson , Mieczyslaw Nalewaj , Aleksander Jan Bajkowski , Jihong Min Subject: [PATCH 6/6] crypto: eip93: handle request ID exhaustion Date: Mon, 25 May 2026 04:45:28 +0900 Message-ID: <20260524194528.3666383-7-hurryman2212@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260524194528.3666383-1-hurryman2212@gmail.com> References: <20260524194528.3666383-1-hurryman2212@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The driver stores the async request pointer in an IDR and places the ID in the hardware descriptor. The old allocation used the ring depth as the IDR limit. It also did not check allocation failure, so request pressure could encode a negative error value as a descriptor user ID. Allocate request IDs from the full user ID field range and wait while the IDR is full. Publish the descriptor only after DMA mappings and ID allocation have succeeded. Add unwind paths for mappings that are active when ID allocation fails, and tolerate stale or missing result IDs in the interrupt handler. Fixes: 9739f5f93b78 ("crypto: eip93 - Add Inside Secure SafeXcel EIP-93 crypto engine support") Reported-by: Benjamin Larsson Suggested-by: Benjamin Larsson Tested-by: Aleksander Jan Bajkowski Assisted-by: Codex:gpt-5.5 Signed-off-by: Jihong Min --- .../crypto/inside-secure/eip93/eip93-common.c | 48 +++++++++++++++---- .../crypto/inside-secure/eip93/eip93-common.h | 3 ++ .../crypto/inside-secure/eip93/eip93-hash.c | 26 +++++++--- .../crypto/inside-secure/eip93/eip93-main.c | 6 +++ .../crypto/inside-secure/eip93/eip93-main.h | 2 + 5 files changed, 69 insertions(+), 16 deletions(-) diff --git a/drivers/crypto/inside-secure/eip93/eip93-common.c b/drivers/crypto/inside-secure/eip93/eip93-common.c index f422c93748c9..88b89d05d510 100644 --- a/drivers/crypto/inside-secure/eip93/eip93-common.c +++ b/drivers/crypto/inside-secure/eip93/eip93-common.c @@ -65,6 +65,31 @@ int eip93_parse_ctrl_stat_err(struct eip93_device *eip93, int err) } } +int eip93_alloc_request_id(struct eip93_device *eip93, void *request) +{ + int id; + + scoped_guard(spinlock_bh, &eip93->ring->idr_lock) + id = idr_alloc(&eip93->ring->crypto_async_idr, request, 0, + EIP93_REQUEST_IDR_LIMIT, GFP_ATOMIC); + + return id; +} + +int eip93_alloc_request_id_wait(struct eip93_device *eip93, void *request) +{ + int id; + + for (;;) { + id = eip93_alloc_request_id(eip93, request); + if (id != -ENOSPC) + return id; + + usleep_range(EIP93_RING_BUSY_DELAY, + EIP93_RING_BUSY_DELAY * 2); + } +} + static void *eip93_ring_next_wptr(struct eip93_device *eip93, struct eip93_desc_ring *ring) { @@ -597,15 +622,6 @@ int eip93_send_req(struct crypto_async_request *async, cdesc.sa_addr = rctx->sa_record_base; cdesc.arc4_addr = 0; - scoped_guard(spinlock_bh, &eip93->ring->idr_lock) - crypto_async_idr = idr_alloc(&eip93->ring->crypto_async_idr, async, 0, - EIP93_RING_NUM - 1, GFP_ATOMIC); - - cdesc.user_id = FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, (u16)crypto_async_idr) | - FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, rctx->desc_flags); - - rctx->cdesc = &cdesc; - /* map DMA_BIDIRECTIONAL to invalidate cache on destination * implies __dma_cache_wback_inv */ @@ -620,8 +636,22 @@ int eip93_send_req(struct crypto_async_request *async, goto free_sg_dma; } + crypto_async_idr = eip93_alloc_request_id_wait(eip93, async); + if (crypto_async_idr < 0) { + err = crypto_async_idr; + goto free_src_sg_dma; + } + + cdesc.user_id = FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, crypto_async_idr) | + FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, rctx->desc_flags); + + rctx->cdesc = &cdesc; + return eip93_scatter_combine(eip93, rctx, datalen, split, offsetin); +free_src_sg_dma: + if (src != dst) + dma_unmap_sg(eip93->dev, src, rctx->src_nents, DMA_TO_DEVICE); free_sg_dma: dma_unmap_sg(eip93->dev, dst, rctx->dst_nents, DMA_BIDIRECTIONAL); free_sa_state_ctr_dma: diff --git a/drivers/crypto/inside-secure/eip93/eip93-common.h b/drivers/crypto/inside-secure/eip93/eip93-common.h index 41c43782eb5c..3898962d0abf 100644 --- a/drivers/crypto/inside-secure/eip93/eip93-common.h +++ b/drivers/crypto/inside-secure/eip93/eip93-common.h @@ -17,6 +17,9 @@ void eip93_set_sa_record(struct sa_record *sa_record, const unsigned int keylen, int eip93_parse_ctrl_stat_err(struct eip93_device *eip93, int err); +int eip93_alloc_request_id(struct eip93_device *eip93, void *request); +int eip93_alloc_request_id_wait(struct eip93_device *eip93, void *request); + int eip93_hmac_setkey(u32 ctx_flags, const u8 *key, unsigned int keylen, unsigned int hashlen, u8 *ipad, u8 *opad, bool skip_ipad); diff --git a/drivers/crypto/inside-secure/eip93/eip93-hash.c b/drivers/crypto/inside-secure/eip93/eip93-hash.c index 060e90c5eaa7..512e0e2ce25e 100644 --- a/drivers/crypto/inside-secure/eip93/eip93-hash.c +++ b/drivers/crypto/inside-secure/eip93/eip93-hash.c @@ -221,6 +221,7 @@ static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data, struct eip93_device *eip93 = ctx->eip93; struct eip93_descriptor cdesc = { }; dma_addr_t src_addr; + bool hmac_sa_mapped = false; int ret; /* Map block data to DMA */ @@ -258,22 +259,23 @@ static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data, ret = dma_mapping_error(eip93->dev, rctx->sa_record_hmac_base); if (ret) { rctx->sa_record_hmac_base = 0; - dma_unmap_single(eip93->dev, src_addr, len, - DMA_TO_DEVICE); - return ret; + goto unmap_src; } cdesc.sa_addr = rctx->sa_record_hmac_base; + hmac_sa_mapped = true; } cdesc.pe_ctrl_stat_word |= EIP93_PE_CTRL_PE_HASH_FINAL; } - scoped_guard(spinlock_bh, &eip93->ring->idr_lock) - crypto_async_idr = idr_alloc(&eip93->ring->crypto_async_idr, async, 0, - EIP93_RING_NUM - 1, GFP_ATOMIC); + crypto_async_idr = eip93_alloc_request_id_wait(eip93, async); + if (crypto_async_idr < 0) { + ret = crypto_async_idr; + goto unmap_hmac_sa; + } - cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, (u16)crypto_async_idr) | + cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, crypto_async_idr) | FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_LAST); } @@ -291,6 +293,16 @@ static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data, *data_dma = src_addr; return 0; + +unmap_hmac_sa: + if (hmac_sa_mapped) { + dma_unmap_single(eip93->dev, rctx->sa_record_hmac_base, + sizeof(rctx->sa_record_hmac), DMA_TO_DEVICE); + rctx->sa_record_hmac_base = 0; + } +unmap_src: + dma_unmap_single(eip93->dev, src_addr, len, DMA_TO_DEVICE); + return ret; } static int eip93_hash_init(struct ahash_request *req) diff --git a/drivers/crypto/inside-secure/eip93/eip93-main.c b/drivers/crypto/inside-secure/eip93/eip93-main.c index e3bd28cc0c67..0de18a0cbe33 100644 --- a/drivers/crypto/inside-secure/eip93/eip93-main.c +++ b/drivers/crypto/inside-secure/eip93/eip93-main.c @@ -257,6 +257,12 @@ static void eip93_handle_result_descriptor(struct eip93_device *eip93) idr_remove(&eip93->ring->crypto_async_idr, crypto_idr); } + if (!async) { + dev_warn_ratelimited(eip93->dev, "missing request id %u\n", + crypto_idr); + goto get_more; + } + /* Parse error in ctrl stat word */ err = eip93_parse_ctrl_stat_err(eip93, err); diff --git a/drivers/crypto/inside-secure/eip93/eip93-main.h b/drivers/crypto/inside-secure/eip93/eip93-main.h index 990c2401b7ce..5237b75bba62 100644 --- a/drivers/crypto/inside-secure/eip93/eip93-main.h +++ b/drivers/crypto/inside-secure/eip93/eip93-main.h @@ -13,11 +13,13 @@ #include #include #include +#include #define EIP93_RING_BUSY_DELAY 500 #define EIP93_RING_NUM 512 #define EIP93_RING_BUSY 32 +#define EIP93_REQUEST_IDR_LIMIT (U16_MAX + 1) #define EIP93_CRA_PRIORITY 1500 #define EIP93_RING_SA_STATE_ADDR(base, idx) ((base) + (idx)) -- 2.53.0