Skip to content

Commit a01e748

Browse files
hfreudehcahca
authored andcommitted
s390/zcrypt: Rework zcrypt function zcrypt_device_status_mask_ext
Rework the existing function zcrypt_device_status_mask_ext(): Add two new parameters to provide upper limits for cards and queues. The existing implementation needed an array of 256 * 256 * 4 = 256 KB which is really huge. The reworked function is more flexible in the sense that the caller can decide the upper limit for cards and domains to be stored into the status array. So for example a caller may decide to only query for cards 0...127 and queues 0...127 and thus only an array of size 128 * 128 * 4 = 64 KB is needed. 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-9-freude@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
1 parent 366367a commit a01e748

4 files changed

Lines changed: 33 additions & 13 deletions

File tree

drivers/s390/crypto/zcrypt_api.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,19 +1304,25 @@ static void zcrypt_device_status_mask(struct zcrypt_device_status *devstatus)
13041304
spin_unlock(&zcrypt_list_lock);
13051305
}
13061306

1307-
void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus)
1307+
void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus,
1308+
int maxcard, int maxqueue)
13081309
{
13091310
struct zcrypt_card *zc;
13101311
struct zcrypt_queue *zq;
13111312
struct zcrypt_device_status_ext *stat;
13121313
int card, queue;
13131314

1315+
maxcard = min_t(int, maxcard, MAX_ZDEV_CARDIDS_EXT);
1316+
maxqueue = min_t(int, maxqueue, MAX_ZDEV_DOMAINS_EXT);
1317+
13141318
spin_lock(&zcrypt_list_lock);
13151319
for_each_zcrypt_card(zc) {
13161320
for_each_zcrypt_queue(zq, zc) {
13171321
card = AP_QID_CARD(zq->queue->qid);
13181322
queue = AP_QID_QUEUE(zq->queue->qid);
1319-
stat = &devstatus[card * AP_DOMAINS + queue];
1323+
if (card >= maxcard || queue >= maxqueue)
1324+
continue;
1325+
stat = &devstatus[card * maxqueue + queue];
13201326
stat->hwtype = zc->card->ap_dev.device_type;
13211327
stat->functions = zc->card->hwinfo.fac >> 26;
13221328
stat->qid = zq->queue->qid;
@@ -1622,7 +1628,9 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
16221628
GFP_KERNEL);
16231629
if (!device_status)
16241630
return -ENOMEM;
1625-
zcrypt_device_status_mask_ext(device_status);
1631+
zcrypt_device_status_mask_ext(device_status,
1632+
MAX_ZDEV_CARDIDS_EXT,
1633+
MAX_ZDEV_DOMAINS_EXT);
16261634
if (copy_to_user((char __user *)arg, device_status,
16271635
total_size))
16281636
rc = -EFAULT;

drivers/s390/crypto/zcrypt_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ int zcrypt_api_init(void);
172172
void zcrypt_api_exit(void);
173173
long zcrypt_send_cprb(struct ica_xcRB *xcRB, u32 xflags);
174174
long zcrypt_send_ep11_cprb(struct ep11_urb *urb, u32 xflags);
175-
void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus);
175+
void zcrypt_device_status_mask_ext(struct zcrypt_device_status_ext *devstatus,
176+
int maxcard, int maxqueue);
176177
int zcrypt_device_status_ext(int card, int queue,
177178
struct zcrypt_device_status_ext *devstatus);
178179

drivers/s390/crypto/zcrypt_ccamisc.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,7 +1806,10 @@ static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
18061806
GFP_KERNEL);
18071807
if (!device_status)
18081808
return -ENOMEM;
1809-
zcrypt_device_status_mask_ext(device_status);
1809+
1810+
zcrypt_device_status_mask_ext(device_status,
1811+
MAX_ZDEV_CARDIDS_EXT,
1812+
MAX_ZDEV_DOMAINS_EXT);
18101813

18111814
/* walk through all crypto cards */
18121815
for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
@@ -1913,7 +1916,7 @@ int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
19131916
{
19141917
struct zcrypt_device_status_ext *device_status;
19151918
u32 *_apqns = NULL, _nr_apqns = 0;
1916-
int i, card, dom, curmatch, oldmatch, rc = 0;
1919+
int i, card, dom, curmatch, oldmatch, rc;
19171920
struct cca_info ci;
19181921

19191922
/* fetch status of all crypto cards */
@@ -1922,13 +1925,16 @@ int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
19221925
GFP_KERNEL);
19231926
if (!device_status)
19241927
return -ENOMEM;
1925-
zcrypt_device_status_mask_ext(device_status);
1928+
1929+
zcrypt_device_status_mask_ext(device_status,
1930+
MAX_ZDEV_CARDIDS_EXT,
1931+
MAX_ZDEV_DOMAINS_EXT);
19261932

19271933
/* allocate 1k space for up to 256 apqns */
19281934
_apqns = kmalloc_array(256, sizeof(u32), GFP_KERNEL);
19291935
if (!_apqns) {
1930-
kvfree(device_status);
1931-
return -ENOMEM;
1936+
rc = -ENOMEM;
1937+
goto out;
19321938
}
19331939

19341940
/* walk through all the crypto apqnss */
@@ -1993,6 +1999,7 @@ int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
19931999
rc = 0;
19942000
}
19952001

2002+
out:
19962003
kvfree(device_status);
19972004
return rc;
19982005
}

drivers/s390/crypto/zcrypt_ep11misc.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,7 +1598,7 @@ int ep11_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
15981598
{
15991599
struct zcrypt_device_status_ext *device_status;
16001600
u32 *_apqns = NULL, _nr_apqns = 0;
1601-
int i, card, dom, rc = -ENOMEM;
1601+
int i, card, dom, rc;
16021602
struct ep11_domain_info edi;
16031603
struct ep11_card_info eci;
16041604

@@ -1608,13 +1608,16 @@ int ep11_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
16081608
GFP_KERNEL);
16091609
if (!device_status)
16101610
return -ENOMEM;
1611-
zcrypt_device_status_mask_ext(device_status);
1611+
1612+
zcrypt_device_status_mask_ext(device_status,
1613+
MAX_ZDEV_CARDIDS_EXT,
1614+
MAX_ZDEV_DOMAINS_EXT);
16121615

16131616
/* allocate 1k space for up to 256 apqns */
16141617
_apqns = kmalloc_array(256, sizeof(u32), GFP_KERNEL);
16151618
if (!_apqns) {
1616-
kvfree(device_status);
1617-
return -ENOMEM;
1619+
rc = -ENOMEM;
1620+
goto out;
16181621
}
16191622

16201623
/* walk through all the crypto apqnss */
@@ -1668,6 +1671,7 @@ int ep11_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
16681671
rc = 0;
16691672
}
16701673

1674+
out:
16711675
kvfree(device_status);
16721676
return rc;
16731677
}

0 commit comments

Comments
 (0)