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: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
Link: https://lore.kernel.org/r/20250424133619.16495-16-freude@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
Harald Freudenberger
2025-04-24 15:36:09 +02:00
committed by Heiko Carstens
parent 8a88322541
commit 989ed61ea8

View File

@@ -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);