]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/zcrypt: Rework cca misc functions kmallocs to use the cprb mempool
authorHarald Freudenberger <freude@linux.ibm.com>
Thu, 24 Apr 2025 13:36:09 +0000 (15:36 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Wed, 30 Apr 2025 09:34:02 +0000 (11:34 +0200)
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>
drivers/s390/crypto/zcrypt_ccamisc.c

index b2ad377e1877d79c8606a436a6d5697cb6d88f5d..e44e115ca77b17619603fa0efad72d8e460565e3 100644 (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);