Commit 989ed61e authored by Harald Freudenberger's avatar Harald Freudenberger Committed by Heiko Carstens
Browse files

s390/zcrypt: Rework cca misc functions kmallocs to use the cprb mempool



Rework two places in the zcrypt cca misc code using kmalloc() for
ephemeral memory allocation. As there is anyway now a cprb mempool
let's use this pool instead to satisfy these short term memory
allocations.

Signed-off-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
Reviewed-by: default avatarHolger Dengler <dengler@linux.ibm.com>
Link: https://lore.kernel.org/r/20250424133619.16495-16-freude@linux.ibm.com


Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 8a883225
Loading
Loading
Loading
Loading
+29 −13
Original line number Diff line number Diff line
@@ -1126,20 +1126,29 @@ int cca_clr2cipherkey(u16 card, u16 dom, u32 keybitsize, u32 keygenflags,
		      const u8 *clrkey, u8 *keybuf, u32 *keybufsize)
{
	int rc;
	u8 *token;
	void *mem;
	int tokensize;
	u8 exorbuf[32];
	u8 *token, exorbuf[32];
	struct cipherkeytoken *t;
	u32 xflags = 0;

	/* fill exorbuf with random data */
	get_random_bytes(exorbuf, sizeof(exorbuf));

	/* allocate space for the key token to build */
	token = kmalloc(MAXCCAVLSCTOKENSIZE, GFP_KERNEL);
	if (!token)
	/*
	 * Allocate space for the key token to build.
	 * Also we only need up to MAXCCAVLSCTOKENSIZE bytes for this
	 * we use the already existing cprb mempool to solve this
	 * short term memory requirement.
	 */
	mem = (xflags & ZCRYPT_XFLAG_NOMEMALLOC) ?
		mempool_alloc_preallocated(cprb_mempool) :
		mempool_alloc(cprb_mempool, GFP_KERNEL);
	if (!mem)
		return -ENOMEM;

	/* prepare the token with the key skeleton */
	token = (u8 *)mem;
	tokensize = SIZEOF_SKELETON;
	memcpy(token, aes_cipher_key_skeleton, tokensize);

@@ -1196,7 +1205,7 @@ int cca_clr2cipherkey(u16 card, u16 dom, u32 keybitsize, u32 keygenflags,
	*keybufsize = tokensize;

out:
	kfree(token);
	mempool_free(mem, cprb_mempool);
	return rc;
}
EXPORT_SYMBOL(cca_clr2cipherkey);
@@ -1628,10 +1637,12 @@ EXPORT_SYMBOL(cca_query_crypto_facility);
 */
int cca_get_info(u16 cardnr, u16 domain, struct cca_info *ci)
{
	void *mem;
	int rc, found = 0;
	size_t rlen, vlen;
	u8 *rarray, *varray, *pg;
	u8 *rarray, *varray;
	struct zcrypt_device_status_ext devstat;
	u32 xflags = 0;

	memset(ci, 0, sizeof(*ci));

@@ -1641,12 +1652,17 @@ int cca_get_info(u16 cardnr, u16 domain, struct cca_info *ci)
		return rc;
	ci->hwtype = devstat.hwtype;

	/* prep page for rule array and var array use */
	pg = (u8 *)__get_free_page(GFP_KERNEL);
	if (!pg)
	/*
	 * Prep memory for rule array and var array use.
	 * Use the cprb mempool for this.
	 */
	mem = (xflags & ZCRYPT_XFLAG_NOMEMALLOC) ?
		mempool_alloc_preallocated(cprb_mempool) :
		mempool_alloc(cprb_mempool, GFP_KERNEL);
	if (!mem)
		return -ENOMEM;
	rarray = pg;
	varray = pg + PAGE_SIZE / 2;
	rarray = (u8 *)mem;
	varray = (u8 *)mem + PAGE_SIZE / 2;
	rlen = vlen = PAGE_SIZE / 2;

	/* QF for this card/domain */
@@ -1693,7 +1709,7 @@ int cca_get_info(u16 cardnr, u16 domain, struct cca_info *ci)
	}

out:
	free_page((unsigned long)pg);
	mempool_free(mem, cprb_mempool);
	return found == 2 ? 0 : -ENOENT;
}
EXPORT_SYMBOL(cca_get_info);