All of lore.kernel.org
 help / color / mirror / Atom feed
From: Harald Freudenberger <freude@linux.ibm.com>
To: dengler@linux.ibm.com, ifranzki@linux.ibm.com,
	fcallies@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com,
	agordeev@linux.ibm.com
Cc: linux-s390@vger.kernel.org, herbert@gondor.apana.org.au
Subject: [PATCH v2 13/20] s390/zcrypt: Add small mempool for cca info list entries
Date: Tue,  4 Mar 2025 18:21:09 +0100	[thread overview]
Message-ID: <20250304172116.85374-14-freude@linux.ibm.com> (raw)
In-Reply-To: <20250304172116.85374-1-freude@linux.ibm.com>

Add a small memory pool for (pre-)allocating cca info list
entries. These entries are rather small and the pool is a simple
way to support the xflag ZCRYPT_XFLAG_NOMEMALLOC to avoid mallocs.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
---
 drivers/s390/crypto/zcrypt_ccamisc.c | 67 ++++++++++++++++++++--------
 drivers/s390/crypto/zcrypt_ccamisc.h |  3 +-
 drivers/s390/crypto/zcrypt_cex4.c    |  4 +-
 3 files changed, 53 insertions(+), 21 deletions(-)

diff --git a/drivers/s390/crypto/zcrypt_ccamisc.c b/drivers/s390/crypto/zcrypt_ccamisc.c
index ff7ba2622484..e4ec922aae0d 100644
--- a/drivers/s390/crypto/zcrypt_ccamisc.c
+++ b/drivers/s390/crypto/zcrypt_ccamisc.c
@@ -41,6 +41,10 @@ struct cca_info_list_entry {
 static LIST_HEAD(cca_info_list);
 static DEFINE_SPINLOCK(cca_info_list_lock);
 
+/* memory pool for cca_info_list entries */
+#define INFO_ENTRY_MEMPOOL_MIN_ITEMS 8
+static mempool_t *info_mempool;
+
 /*
  * Cprb memory pool held for urgent cases where no memory
  * can be allocated via kmalloc. This pool is only used
@@ -1662,7 +1666,7 @@ static int cca_info_cache_fetch(u16 cardnr, u16 domain, struct cca_info *ci)
 }
 
 static void cca_info_cache_update(u16 cardnr, u16 domain,
-				  const struct cca_info *ci)
+				  const struct cca_info *ci, u32 xflags)
 {
 	int found = 0;
 	struct cca_info_list_entry *ptr;
@@ -1677,7 +1681,9 @@ static void cca_info_cache_update(u16 cardnr, u16 domain,
 		}
 	}
 	if (!found) {
-		ptr = kmalloc(sizeof(*ptr), GFP_ATOMIC);
+		ptr = (xflags & ZCRYPT_XFLAG_NOMEMALLOC) ?
+			mempool_alloc_preallocated(info_mempool) :
+			mempool_alloc(info_mempool, GFP_ATOMIC);
 		if (!ptr) {
 			spin_unlock_bh(&cca_info_list_lock);
 			return;
@@ -1699,7 +1705,7 @@ static void cca_info_cache_scrub(u16 cardnr, u16 domain)
 		if (ptr->cardnr == cardnr &&
 		    ptr->domain == domain) {
 			list_del(&ptr->list);
-			kfree(ptr);
+			mempool_free(ptr, info_mempool);
 			break;
 		}
 	}
@@ -1713,7 +1719,7 @@ static void __exit mkvp_cache_free(void)
 	spin_lock_bh(&cca_info_list_lock);
 	list_for_each_entry_safe(ptr, pnext, &cca_info_list, list) {
 		list_del(&ptr->list);
-		kfree(ptr);
+		mempool_free(ptr, info_mempool);
 	}
 	spin_unlock_bh(&cca_info_list_lock);
 }
@@ -1721,14 +1727,14 @@ static void __exit mkvp_cache_free(void)
 /*
  * Fetch cca_info values via query_crypto_facility from adapter.
  */
-static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
+static int fetch_cca_info(u16 cardnr, u16 domain,
+			  struct cca_info *ci, u32 xflags)
 {
 	void *mem;
 	int rc, found = 0;
 	size_t rlen, vlen;
 	u8 *rarray, *varray;
 	struct zcrypt_device_status_ext devstat;
-	u32 xflags = 0;
 
 	memset(ci, 0, sizeof(*ci));
 
@@ -1802,15 +1808,15 @@ static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
 /*
  * Fetch cca information about a CCA queue.
  */
-int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify)
+int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify, u32 xflags)
 {
 	int rc;
 
 	rc = cca_info_cache_fetch(card, dom, ci);
 	if (rc || verify) {
-		rc = fetch_cca_info(card, dom, ci);
+		rc = fetch_cca_info(card, dom, ci, xflags);
 		if (rc == 0)
-			cca_info_cache_update(card, dom, ci);
+			cca_info_cache_update(card, dom, ci, xflags);
 	}
 
 	return rc;
@@ -1828,6 +1834,7 @@ static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
 	u16 card, dom;
 	struct cca_info ci;
 	int i, rc, oi = -1;
+	u32 xflg = 0; /* xflags */
 
 	/* mkvp must not be zero, minhwtype needs to be >= 0 */
 	if (mkvp == 0 || minhwtype < 0)
@@ -1859,8 +1866,8 @@ static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
 				if (!verify)
 					break;
 				/* verify: refresh card info */
-				if (fetch_cca_info(card, dom, &ci) == 0) {
-					cca_info_cache_update(card, dom, &ci);
+				if (fetch_cca_info(card, dom, &ci, xflg) == 0) {
+					cca_info_cache_update(card, dom, &ci, xflg);
 					if (ci.hwtype >= minhwtype &&
 					    ci.cur_aes_mk_state == '2' &&
 					    ci.cur_aes_mkvp == mkvp)
@@ -1882,8 +1889,8 @@ static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
 			card = AP_QID_CARD(device_status[i].qid);
 			dom = AP_QID_QUEUE(device_status[i].qid);
 			/* fresh fetch mkvp from adapter */
-			if (fetch_cca_info(card, dom, &ci) == 0) {
-				cca_info_cache_update(card, dom, &ci);
+			if (fetch_cca_info(card, dom, &ci, xflg) == 0) {
+				cca_info_cache_update(card, dom, &ci, xflg);
 				if (ci.hwtype >= minhwtype &&
 				    ci.cur_aes_mk_state == '2' &&
 				    ci.cur_aes_mkvp == mkvp)
@@ -1955,6 +1962,7 @@ int cca_findcard2(u32 *apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
 	int i, card, dom, curmatch, oldmatch, rc;
 	struct cca_info ci;
 	u32 _nr_apqns = 0;
+	u32 xflags = 0;
 
 	/* occupy the device status memory */
 	mutex_lock(&dev_status_mem_mutex);
@@ -1985,7 +1993,7 @@ int cca_findcard2(u32 *apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
 		if (domain != 0xFFFF && dom != domain)
 			continue;
 		/* get cca info on this apqn */
-		if (cca_get_info(card, dom, &ci, verify))
+		if (cca_get_info(card, dom, &ci, verify, xflags))
 			continue;
 		/* current master key needs to be valid */
 		if (mktype == AES_MK_SET && ci.cur_aes_mk_state != '2')
@@ -2037,6 +2045,8 @@ EXPORT_SYMBOL(cca_findcard2);
 
 int __init zcrypt_ccamisc_init(void)
 {
+	int rc = -ENOMEM;
+
 	/* Pre-allocate a small memory pool for cca cprbs. */
 	cprb_mempool = mempool_create_kmalloc_pool(zcrypt_cca_cprbpool_min_items,
 						   CPRB_MEMPOOL_ITEM_SIZE);
@@ -2044,19 +2054,39 @@ int __init zcrypt_ccamisc_init(void)
 		ZCRYPT_DBF_ERR("%s mempool_create(%d,%d) failed: %ld\n",
 			       __func__, zcrypt_cca_cprbpool_min_items,
 			       CPRB_MEMPOOL_ITEM_SIZE, PTR_ERR(cprb_mempool));
+		rc = PTR_ERR(cprb_mempool);
 		cprb_mempool = NULL;
-		return -ENOMEM;
+		goto out;
+	}
+
+	/* Pre-allocate a small memory pool for cca info list entries */
+	info_mempool = mempool_create_kmalloc_pool(INFO_ENTRY_MEMPOOL_MIN_ITEMS,
+						   sizeof(struct cca_info_list_entry));
+	if (IS_ERR(info_mempool)) {
+		ZCRYPT_DBF_ERR("%s info entry mempool_create(%d,%d) failed: %ld\n",
+			       __func__, INFO_ENTRY_MEMPOOL_MIN_ITEMS,
+			       (int)sizeof(struct cca_info_list_entry),
+			       PTR_ERR(info_mempool));
+		rc = PTR_ERR(info_mempool);
+		info_mempool = NULL;
+		goto out;
 	}
 
 	/* Pre-allocate one crypto status card struct used in findcard() */
 	dev_status_mem = kvmalloc(ZCRYPT_DEV_STATUS_EXT_SIZE, GFP_KERNEL);
 	if (!dev_status_mem) {
 		ZCRYPT_DBF_ERR("%s allocation of dev_status_mem failed\n", __func__);
-		mempool_destroy(cprb_mempool);
-		return -ENOMEM;
+		goto out;
 	}
 
-	return 0;
+	rc = 0;
+
+out:
+	if (rc) {
+		mempool_destroy(cprb_mempool);
+		mempool_destroy(info_mempool);
+	}
+	return rc;
 }
 
 void zcrypt_ccamisc_exit(void)
@@ -2064,4 +2094,5 @@ void zcrypt_ccamisc_exit(void)
 	mkvp_cache_free();
 	kvfree(dev_status_mem);
 	mempool_destroy(cprb_mempool);
+	mempool_destroy(info_mempool);
 }
diff --git a/drivers/s390/crypto/zcrypt_ccamisc.h b/drivers/s390/crypto/zcrypt_ccamisc.h
index bed647a42eb2..966f0eaf3c4c 100644
--- a/drivers/s390/crypto/zcrypt_ccamisc.h
+++ b/drivers/s390/crypto/zcrypt_ccamisc.h
@@ -268,7 +268,8 @@ struct cca_info {
 /*
  * Fetch cca information about an CCA queue.
  */
-int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify);
+int cca_get_info(u16 card, u16 dom, struct cca_info *ci,
+		 int verify, u32 xflags);
 
 int zcrypt_ccamisc_init(void);
 void zcrypt_ccamisc_exit(void);
diff --git a/drivers/s390/crypto/zcrypt_cex4.c b/drivers/s390/crypto/zcrypt_cex4.c
index 64df7d2f6266..49a638d373fa 100644
--- a/drivers/s390/crypto/zcrypt_cex4.c
+++ b/drivers/s390/crypto/zcrypt_cex4.c
@@ -86,7 +86,7 @@ static ssize_t cca_serialnr_show(struct device *dev,
 	memset(&ci, 0, sizeof(ci));
 
 	if (ap_domain_index >= 0)
-		cca_get_info(ac->id, ap_domain_index, &ci, zc->online);
+		cca_get_info(ac->id, ap_domain_index, &ci, zc->online, 0);
 
 	return sysfs_emit(buf, "%s\n", ci.serial);
 }
@@ -120,7 +120,7 @@ static ssize_t cca_mkvps_show(struct device *dev,
 
 	cca_get_info(AP_QID_CARD(zq->queue->qid),
 		     AP_QID_QUEUE(zq->queue->qid),
-		     &ci, zq->online);
+		     &ci, zq->online, 0);
 
 	if (ci.new_aes_mk_state >= '1' && ci.new_aes_mk_state <= '3')
 		n += sysfs_emit_at(buf, n, "AES NEW: %s 0x%016llx\n",
-- 
2.43.0


  parent reply	other threads:[~2025-03-04 17:21 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-04 17:20 [PATCH v2 00/20] AP bus/zcrypt/pkey/paes no-mem-alloc patches Harald Freudenberger
2025-03-04 17:20 ` [PATCH v2 01/20] s390/ap: Move response_type struct into ap_msg struct Harald Freudenberger
2025-03-17  9:38   ` Holger Dengler
2025-03-24 14:34     ` Harald Freudenberger
2025-03-04 17:20 ` [PATCH v2 02/20] s390/ap/zcrypt: Rework AP message buffer allocation Harald Freudenberger
2025-03-17 13:57   ` Holger Dengler
2025-03-04 17:20 ` [PATCH v2 03/20] s390/ap: Introduce ap message buffer pool Harald Freudenberger
2025-03-17 16:14   ` Holger Dengler
2025-03-24 14:41     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 04/20] s390/ap/zcrypt: New xflag parameter and extension of the ap msg flags Harald Freudenberger
2025-03-18 12:16   ` Holger Dengler
2025-03-24 15:52     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 05/20] s390/zcrypt: Introduce cprb mempool for cca misc functions Harald Freudenberger
2025-03-18 14:16   ` Holger Dengler
2025-03-25  8:26     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 06/20] s390/zcrypt: Introduce cprb mempool for ep11 " Harald Freudenberger
2025-03-18 15:16   ` Holger Dengler
2025-03-25  8:36     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 07/20] s390/zcrypt: Rework zcrypt function zcrypt_device_status_mask_ext Harald Freudenberger
2025-03-19 11:03   ` Holger Dengler
2025-03-25  9:24     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 08/20] s390/zcrypt: Introduce pre-allocated device status array for cca misc Harald Freudenberger
2025-03-19 14:31   ` Holger Dengler
2025-03-25 10:51     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 09/20] s390/zcrypt: Introduce pre-allocated device status array for ep11 misc Harald Freudenberger
2025-03-19 18:02   ` Holger Dengler
2025-03-25 11:09     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 10/20] s390/zcrypt/pkey: Rework cca findcard() implementation and callers Harald Freudenberger
2025-03-19 17:58   ` Holger Dengler
2025-03-25 13:02     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 11/20] s390/zcrypt/pkey: Rework ep11 " Harald Freudenberger
2025-03-20  8:30   ` Holger Dengler
2025-03-25 13:12     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 12/20] s390/zcrypt: Rework cca misc functions kmallocs to use the cprb mempool Harald Freudenberger
2025-03-20  9:31   ` Holger Dengler
2025-03-04 17:21 ` Harald Freudenberger [this message]
2025-03-20 14:34   ` [PATCH v2 13/20] s390/zcrypt: Add small mempool for cca info list entries Holger Dengler
2025-03-25 13:32     ` Harald Freudenberger
2025-03-20 16:05   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 14/20] s390/zcrypt: Locate ep11_domain_query_info onto the stack instead of kmalloc Harald Freudenberger
2025-03-20 14:41   ` Holger Dengler
2025-03-25 14:04     ` Harald Freudenberger
2025-03-04 17:21 ` [PATCH v2 15/20] s390/zcrypt: Rework ep11 misc functions to use cprb mempool Harald Freudenberger
2025-03-20 15:18   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 16/20] s390/zcrypt: Add small mempool for ep11 card info list entries Harald Freudenberger
2025-03-20 16:09   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 17/20] s390/pkey: Rework CCA pkey handler to use stack for small memory allocs Harald Freudenberger
2025-03-21  9:05   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 18/20] s390/pkey: Rework EP11 " Harald Freudenberger
2025-03-21  9:06   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 19/20] s390/zcrypt/pkey: Provide and pass xflags within pkey and zcrypt layers Harald Freudenberger
2025-03-20 16:30   ` Holger Dengler
2025-03-04 17:21 ` [PATCH v2 20/20] s390/pkey/crypto: Introduce xflags param for pkey in-kernel API Harald Freudenberger
2025-03-20 16:34   ` Holger Dengler
2025-03-20 16:40 ` [PATCH v2 00/20] AP bus/zcrypt/pkey/paes no-mem-alloc patches Holger Dengler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250304172116.85374-14-freude@linux.ibm.com \
    --to=freude@linux.ibm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=dengler@linux.ibm.com \
    --cc=fcallies@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=ifranzki@linux.ibm.com \
    --cc=linux-s390@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.