mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
s390/ap/zcrypt: Rework AP message buffer allocation
Slight rework on the way how AP message buffers are allocated. Instead of having multiple places with kmalloc() calls all the AP message buffers are now allocated and freed on exactly one place: ap_init_apmsg() allocates the current AP bus max limit of ap_max_msg_size (defaults to 12KB). The AP message buffer is then freed in ap_release_apmsg(). 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-3-freude@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
committed by
Heiko Carstens
parent
43435495a0
commit
57db62a130
@@ -642,16 +642,17 @@ static long zcrypt_rsa_modexpo(struct ap_perms *perms,
|
||||
struct zcrypt_queue *zq, *pref_zq;
|
||||
struct ap_message ap_msg;
|
||||
unsigned int wgt = 0, pref_wgt = 0;
|
||||
unsigned int func_code;
|
||||
int cpen, qpen, qid = 0, rc = -ENODEV;
|
||||
unsigned int func_code = 0;
|
||||
int cpen, qpen, qid = 0, rc;
|
||||
struct module *mod;
|
||||
|
||||
trace_s390_zcrypt_req(mex, TP_ICARSAMODEXPO);
|
||||
|
||||
ap_init_message(&ap_msg);
|
||||
rc = ap_init_apmsg(&ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (mex->outputdatalength < mex->inputdatalength) {
|
||||
func_code = 0;
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -728,7 +729,7 @@ static long zcrypt_rsa_modexpo(struct ap_perms *perms,
|
||||
spin_unlock(&zcrypt_list_lock);
|
||||
|
||||
out:
|
||||
ap_release_message(&ap_msg);
|
||||
ap_release_apmsg(&ap_msg);
|
||||
if (tr) {
|
||||
tr->last_rc = rc;
|
||||
tr->last_qid = qid;
|
||||
@@ -746,16 +747,17 @@ static long zcrypt_rsa_crt(struct ap_perms *perms,
|
||||
struct zcrypt_queue *zq, *pref_zq;
|
||||
struct ap_message ap_msg;
|
||||
unsigned int wgt = 0, pref_wgt = 0;
|
||||
unsigned int func_code;
|
||||
int cpen, qpen, qid = 0, rc = -ENODEV;
|
||||
unsigned int func_code = 0;
|
||||
int cpen, qpen, qid = 0, rc;
|
||||
struct module *mod;
|
||||
|
||||
trace_s390_zcrypt_req(crt, TP_ICARSACRT);
|
||||
|
||||
ap_init_message(&ap_msg);
|
||||
rc = ap_init_apmsg(&ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (crt->outputdatalength < crt->inputdatalength) {
|
||||
func_code = 0;
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -832,7 +834,7 @@ static long zcrypt_rsa_crt(struct ap_perms *perms,
|
||||
spin_unlock(&zcrypt_list_lock);
|
||||
|
||||
out:
|
||||
ap_release_message(&ap_msg);
|
||||
ap_release_apmsg(&ap_msg);
|
||||
if (tr) {
|
||||
tr->last_rc = rc;
|
||||
tr->last_qid = qid;
|
||||
@@ -850,15 +852,18 @@ static long _zcrypt_send_cprb(bool userspace, struct ap_perms *perms,
|
||||
struct zcrypt_queue *zq, *pref_zq;
|
||||
struct ap_message ap_msg;
|
||||
unsigned int wgt = 0, pref_wgt = 0;
|
||||
unsigned int func_code;
|
||||
unsigned int func_code = 0;
|
||||
unsigned short *domain, tdom;
|
||||
int cpen, qpen, qid = 0, rc = -ENODEV;
|
||||
int cpen, qpen, qid = 0, rc;
|
||||
struct module *mod;
|
||||
|
||||
trace_s390_zcrypt_req(xcrb, TB_ZSECSENDCPRB);
|
||||
|
||||
xcrb->status = 0;
|
||||
ap_init_message(&ap_msg);
|
||||
|
||||
rc = ap_init_apmsg(&ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
rc = prep_cca_ap_msg(userspace, xcrb, &ap_msg, &func_code, &domain);
|
||||
if (rc)
|
||||
@@ -962,7 +967,7 @@ static long _zcrypt_send_cprb(bool userspace, struct ap_perms *perms,
|
||||
spin_unlock(&zcrypt_list_lock);
|
||||
|
||||
out:
|
||||
ap_release_message(&ap_msg);
|
||||
ap_release_apmsg(&ap_msg);
|
||||
if (tr) {
|
||||
tr->last_rc = rc;
|
||||
tr->last_qid = qid;
|
||||
@@ -1033,14 +1038,16 @@ static long _zcrypt_send_ep11_cprb(bool userspace, struct ap_perms *perms,
|
||||
struct ep11_target_dev *targets;
|
||||
unsigned short target_num;
|
||||
unsigned int wgt = 0, pref_wgt = 0;
|
||||
unsigned int func_code, domain;
|
||||
unsigned int func_code = 0, domain;
|
||||
struct ap_message ap_msg;
|
||||
int cpen, qpen, qid = 0, rc = -ENODEV;
|
||||
int cpen, qpen, qid = 0, rc;
|
||||
struct module *mod;
|
||||
|
||||
trace_s390_zcrypt_req(xcrb, TP_ZSENDEP11CPRB);
|
||||
|
||||
ap_init_message(&ap_msg);
|
||||
rc = ap_init_apmsg(&ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
target_num = (unsigned short)xcrb->targets_num;
|
||||
|
||||
@@ -1164,7 +1171,7 @@ static long _zcrypt_send_ep11_cprb(bool userspace, struct ap_perms *perms,
|
||||
out_free:
|
||||
kfree(targets);
|
||||
out:
|
||||
ap_release_message(&ap_msg);
|
||||
ap_release_apmsg(&ap_msg);
|
||||
if (tr) {
|
||||
tr->last_rc = rc;
|
||||
tr->last_qid = qid;
|
||||
@@ -1204,7 +1211,7 @@ static long zcrypt_rng(char *buffer)
|
||||
struct zcrypt_card *zc, *pref_zc;
|
||||
struct zcrypt_queue *zq, *pref_zq;
|
||||
unsigned int wgt = 0, pref_wgt = 0;
|
||||
unsigned int func_code;
|
||||
unsigned int func_code = 0;
|
||||
struct ap_message ap_msg;
|
||||
unsigned int domain;
|
||||
int qid = 0, rc = -ENODEV;
|
||||
@@ -1212,7 +1219,9 @@ static long zcrypt_rng(char *buffer)
|
||||
|
||||
trace_s390_zcrypt_req(buffer, TP_HWRNGCPRB);
|
||||
|
||||
ap_init_message(&ap_msg);
|
||||
rc = ap_init_apmsg(&ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = prep_rng_ap_msg(&ap_msg, &func_code, &domain);
|
||||
if (rc)
|
||||
goto out;
|
||||
@@ -1258,7 +1267,7 @@ static long zcrypt_rng(char *buffer)
|
||||
spin_unlock(&zcrypt_list_lock);
|
||||
|
||||
out:
|
||||
ap_release_message(&ap_msg);
|
||||
ap_release_apmsg(&ap_msg);
|
||||
trace_s390_zcrypt_rep(buffer, func_code, rc,
|
||||
AP_QID_CARD(qid), AP_QID_QUEUE(qid));
|
||||
return rc;
|
||||
|
||||
Reference in New Issue
Block a user