s390/ap: Move response_type struct into ap_msg struct
Move the very small response_type struct into struct ap_msg. So there is no need to kmalloc this tiny struct with each ap message preparation. 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-2-freude@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
committed by
Heiko Carstens
parent
7cf58880ea
commit
43435495a0
@@ -214,6 +214,11 @@ struct ap_queue {
|
||||
|
||||
typedef enum ap_sm_wait (ap_func_t)(struct ap_queue *queue);
|
||||
|
||||
struct ap_response_type {
|
||||
struct completion work;
|
||||
int type;
|
||||
};
|
||||
|
||||
struct ap_message {
|
||||
struct list_head list; /* Request queueing. */
|
||||
unsigned long psmid; /* Message id. */
|
||||
@@ -222,7 +227,7 @@ struct ap_message {
|
||||
size_t bufsize; /* allocated msg buffer size */
|
||||
u16 flags; /* Flags, see AP_MSG_FLAG_xxx */
|
||||
int rc; /* Return code for this message */
|
||||
void *private; /* ap driver private pointer. */
|
||||
struct ap_response_type response;
|
||||
/* receive is called from tasklet context */
|
||||
void (*receive)(struct ap_queue *, struct ap_message *,
|
||||
struct ap_message *);
|
||||
@@ -250,7 +255,6 @@ static inline void ap_init_message(struct ap_message *ap_msg)
|
||||
static inline void ap_release_message(struct ap_message *ap_msg)
|
||||
{
|
||||
kfree_sensitive(ap_msg->msg);
|
||||
kfree_sensitive(ap_msg->private);
|
||||
}
|
||||
|
||||
enum ap_sm_wait ap_sm_event(struct ap_queue *aq, enum ap_sm_event event);
|
||||
|
||||
@@ -438,7 +438,7 @@ static void zcrypt_msgtype50_receive(struct ap_queue *aq,
|
||||
msg->len = sizeof(error_reply);
|
||||
}
|
||||
out:
|
||||
complete((struct completion *)msg->private);
|
||||
complete(&msg->response.work);
|
||||
}
|
||||
|
||||
static atomic_t zcrypt_step = ATOMIC_INIT(0);
|
||||
@@ -454,7 +454,6 @@ static long zcrypt_msgtype50_modexpo(struct zcrypt_queue *zq,
|
||||
struct ica_rsa_modexpo *mex,
|
||||
struct ap_message *ap_msg)
|
||||
{
|
||||
struct completion work;
|
||||
int rc;
|
||||
|
||||
ap_msg->bufsize = MSGTYPE50_CRB3_MAX_MSG_SIZE;
|
||||
@@ -464,15 +463,14 @@ static long zcrypt_msgtype50_modexpo(struct zcrypt_queue *zq,
|
||||
ap_msg->receive = zcrypt_msgtype50_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = &work;
|
||||
rc = ICAMEX_msg_to_type50MEX_msg(zq, ap_msg, mex);
|
||||
if (rc)
|
||||
goto out;
|
||||
init_completion(&work);
|
||||
init_completion(&ap_msg->response.work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = wait_for_completion_interruptible(&work);
|
||||
rc = wait_for_completion_interruptible(&ap_msg->response.work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -485,7 +483,6 @@ static long zcrypt_msgtype50_modexpo(struct zcrypt_queue *zq,
|
||||
}
|
||||
|
||||
out:
|
||||
ap_msg->private = NULL;
|
||||
if (rc)
|
||||
pr_debug("send me cprb at dev=%02x.%04x rc=%d\n",
|
||||
AP_QID_CARD(zq->queue->qid),
|
||||
@@ -504,7 +501,6 @@ static long zcrypt_msgtype50_modexpo_crt(struct zcrypt_queue *zq,
|
||||
struct ica_rsa_modexpo_crt *crt,
|
||||
struct ap_message *ap_msg)
|
||||
{
|
||||
struct completion work;
|
||||
int rc;
|
||||
|
||||
ap_msg->bufsize = MSGTYPE50_CRB3_MAX_MSG_SIZE;
|
||||
@@ -514,15 +510,14 @@ static long zcrypt_msgtype50_modexpo_crt(struct zcrypt_queue *zq,
|
||||
ap_msg->receive = zcrypt_msgtype50_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = &work;
|
||||
rc = ICACRT_msg_to_type50CRT_msg(zq, ap_msg, crt);
|
||||
if (rc)
|
||||
goto out;
|
||||
init_completion(&work);
|
||||
init_completion(&ap_msg->response.work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = wait_for_completion_interruptible(&work);
|
||||
rc = wait_for_completion_interruptible(&ap_msg->response.work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -535,7 +530,6 @@ static long zcrypt_msgtype50_modexpo_crt(struct zcrypt_queue *zq,
|
||||
}
|
||||
|
||||
out:
|
||||
ap_msg->private = NULL;
|
||||
if (rc)
|
||||
pr_debug("send crt cprb at dev=%02x.%04x rc=%d\n",
|
||||
AP_QID_CARD(zq->queue->qid),
|
||||
|
||||
@@ -31,11 +31,6 @@
|
||||
|
||||
#define CEIL4(x) ((((x) + 3) / 4) * 4)
|
||||
|
||||
struct response_type {
|
||||
struct completion work;
|
||||
int type;
|
||||
};
|
||||
|
||||
#define CEXXC_RESPONSE_TYPE_ICA 0
|
||||
#define CEXXC_RESPONSE_TYPE_XCRB 1
|
||||
#define CEXXC_RESPONSE_TYPE_EP11 2
|
||||
@@ -856,7 +851,7 @@ static void zcrypt_msgtype6_receive(struct ap_queue *aq,
|
||||
.type = TYPE82_RSP_CODE,
|
||||
.reply_code = REP82_ERROR_MACHINE_FAILURE,
|
||||
};
|
||||
struct response_type *resp_type = msg->private;
|
||||
struct ap_response_type *resp_type = &msg->response;
|
||||
struct type86x_reply *t86r;
|
||||
int len;
|
||||
|
||||
@@ -920,7 +915,7 @@ static void zcrypt_msgtype6_receive_ep11(struct ap_queue *aq,
|
||||
.type = TYPE82_RSP_CODE,
|
||||
.reply_code = REP82_ERROR_MACHINE_FAILURE,
|
||||
};
|
||||
struct response_type *resp_type = msg->private;
|
||||
struct ap_response_type *resp_type = &msg->response;
|
||||
struct type86_ep11_reply *t86r;
|
||||
int len;
|
||||
|
||||
@@ -967,9 +962,7 @@ static long zcrypt_msgtype6_modexpo(struct zcrypt_queue *zq,
|
||||
struct ica_rsa_modexpo *mex,
|
||||
struct ap_message *ap_msg)
|
||||
{
|
||||
struct response_type resp_type = {
|
||||
.type = CEXXC_RESPONSE_TYPE_ICA,
|
||||
};
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
int rc;
|
||||
|
||||
ap_msg->msg = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
@@ -979,15 +972,15 @@ static long zcrypt_msgtype6_modexpo(struct zcrypt_queue *zq,
|
||||
ap_msg->receive = zcrypt_msgtype6_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = &resp_type;
|
||||
rc = icamex_msg_to_type6mex_msgx(zq, ap_msg, mex);
|
||||
if (rc)
|
||||
goto out_free;
|
||||
init_completion(&resp_type.work);
|
||||
resp_type->type = CEXXC_RESPONSE_TYPE_ICA;
|
||||
init_completion(&resp_type->work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out_free;
|
||||
rc = wait_for_completion_interruptible(&resp_type.work);
|
||||
rc = wait_for_completion_interruptible(&resp_type->work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -1001,7 +994,6 @@ static long zcrypt_msgtype6_modexpo(struct zcrypt_queue *zq,
|
||||
|
||||
out_free:
|
||||
free_page((unsigned long)ap_msg->msg);
|
||||
ap_msg->private = NULL;
|
||||
ap_msg->msg = NULL;
|
||||
return rc;
|
||||
}
|
||||
@@ -1017,9 +1009,7 @@ static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq,
|
||||
struct ica_rsa_modexpo_crt *crt,
|
||||
struct ap_message *ap_msg)
|
||||
{
|
||||
struct response_type resp_type = {
|
||||
.type = CEXXC_RESPONSE_TYPE_ICA,
|
||||
};
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
int rc;
|
||||
|
||||
ap_msg->msg = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
@@ -1029,15 +1019,15 @@ static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq,
|
||||
ap_msg->receive = zcrypt_msgtype6_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = &resp_type;
|
||||
rc = icacrt_msg_to_type6crt_msgx(zq, ap_msg, crt);
|
||||
if (rc)
|
||||
goto out_free;
|
||||
init_completion(&resp_type.work);
|
||||
resp_type->type = CEXXC_RESPONSE_TYPE_ICA;
|
||||
init_completion(&resp_type->work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out_free;
|
||||
rc = wait_for_completion_interruptible(&resp_type.work);
|
||||
rc = wait_for_completion_interruptible(&resp_type->work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -1051,7 +1041,6 @@ static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq,
|
||||
|
||||
out_free:
|
||||
free_page((unsigned long)ap_msg->msg);
|
||||
ap_msg->private = NULL;
|
||||
ap_msg->msg = NULL;
|
||||
return rc;
|
||||
}
|
||||
@@ -1069,9 +1058,7 @@ int prep_cca_ap_msg(bool userspace, struct ica_xcRB *xcrb,
|
||||
struct ap_message *ap_msg,
|
||||
unsigned int *func_code, unsigned short **dom)
|
||||
{
|
||||
struct response_type resp_type = {
|
||||
.type = CEXXC_RESPONSE_TYPE_XCRB,
|
||||
};
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
|
||||
ap_msg->bufsize = atomic_read(&ap_max_msg_size);
|
||||
ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
|
||||
@@ -1080,9 +1067,7 @@ int prep_cca_ap_msg(bool userspace, struct ica_xcRB *xcrb,
|
||||
ap_msg->receive = zcrypt_msgtype6_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
|
||||
if (!ap_msg->private)
|
||||
return -ENOMEM;
|
||||
resp_type->type = CEXXC_RESPONSE_TYPE_XCRB;
|
||||
return xcrb_msg_to_type6cprb_msgx(userspace, ap_msg, xcrb, func_code, dom);
|
||||
}
|
||||
|
||||
@@ -1097,7 +1082,7 @@ static long zcrypt_msgtype6_send_cprb(bool userspace, struct zcrypt_queue *zq,
|
||||
struct ica_xcRB *xcrb,
|
||||
struct ap_message *ap_msg)
|
||||
{
|
||||
struct response_type *rtype = ap_msg->private;
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
struct {
|
||||
struct type6_hdr hdr;
|
||||
struct CPRBX cprbx;
|
||||
@@ -1128,11 +1113,11 @@ static long zcrypt_msgtype6_send_cprb(bool userspace, struct zcrypt_queue *zq,
|
||||
msg->hdr.fromcardlen1 -= delta;
|
||||
}
|
||||
|
||||
init_completion(&rtype->work);
|
||||
init_completion(&resp_type->work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = wait_for_completion_interruptible(&rtype->work);
|
||||
rc = wait_for_completion_interruptible(&resp_type->work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -1166,9 +1151,7 @@ int prep_ep11_ap_msg(bool userspace, struct ep11_urb *xcrb,
|
||||
struct ap_message *ap_msg,
|
||||
unsigned int *func_code, unsigned int *domain)
|
||||
{
|
||||
struct response_type resp_type = {
|
||||
.type = CEXXC_RESPONSE_TYPE_EP11,
|
||||
};
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
|
||||
ap_msg->bufsize = atomic_read(&ap_max_msg_size);
|
||||
ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
|
||||
@@ -1177,9 +1160,7 @@ int prep_ep11_ap_msg(bool userspace, struct ep11_urb *xcrb,
|
||||
ap_msg->receive = zcrypt_msgtype6_receive_ep11;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
|
||||
if (!ap_msg->private)
|
||||
return -ENOMEM;
|
||||
resp_type->type = CEXXC_RESPONSE_TYPE_EP11;
|
||||
return xcrb_msg_to_type6_ep11cprb_msgx(userspace, ap_msg, xcrb,
|
||||
func_code, domain);
|
||||
}
|
||||
@@ -1197,7 +1178,7 @@ static long zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *
|
||||
{
|
||||
int rc;
|
||||
unsigned int lfmt;
|
||||
struct response_type *rtype = ap_msg->private;
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
struct {
|
||||
struct type6_hdr hdr;
|
||||
struct ep11_cprb cprbx;
|
||||
@@ -1251,11 +1232,11 @@ static long zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *
|
||||
msg->hdr.fromcardlen1 = zq->reply.bufsize -
|
||||
sizeof(struct type86_hdr) - sizeof(struct type86_fmt2_ext);
|
||||
|
||||
init_completion(&rtype->work);
|
||||
init_completion(&resp_type->work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = wait_for_completion_interruptible(&rtype->work);
|
||||
rc = wait_for_completion_interruptible(&resp_type->work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
@@ -1279,9 +1260,7 @@ out:
|
||||
int prep_rng_ap_msg(struct ap_message *ap_msg, int *func_code,
|
||||
unsigned int *domain)
|
||||
{
|
||||
struct response_type resp_type = {
|
||||
.type = CEXXC_RESPONSE_TYPE_XCRB,
|
||||
};
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
|
||||
ap_msg->bufsize = AP_DEFAULT_MAX_MSG_SIZE;
|
||||
ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
|
||||
@@ -1290,9 +1269,8 @@ int prep_rng_ap_msg(struct ap_message *ap_msg, int *func_code,
|
||||
ap_msg->receive = zcrypt_msgtype6_receive;
|
||||
ap_msg->psmid = (((unsigned long)current->pid) << 32) +
|
||||
atomic_inc_return(&zcrypt_step);
|
||||
ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
|
||||
if (!ap_msg->private)
|
||||
return -ENOMEM;
|
||||
|
||||
resp_type->type = CEXXC_RESPONSE_TYPE_XCRB;
|
||||
|
||||
rng_type6cprb_msgx(ap_msg, ZCRYPT_RNG_BUFFER_SIZE, domain);
|
||||
|
||||
@@ -1319,16 +1297,16 @@ static long zcrypt_msgtype6_rng(struct zcrypt_queue *zq,
|
||||
short int verb_length;
|
||||
short int key_length;
|
||||
} __packed * msg = ap_msg->msg;
|
||||
struct response_type *rtype = ap_msg->private;
|
||||
struct ap_response_type *resp_type = &ap_msg->response;
|
||||
int rc;
|
||||
|
||||
msg->cprbx.domain = AP_QID_QUEUE(zq->queue->qid);
|
||||
|
||||
init_completion(&rtype->work);
|
||||
init_completion(&resp_type->work);
|
||||
rc = ap_queue_message(zq->queue, ap_msg);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = wait_for_completion_interruptible(&rtype->work);
|
||||
rc = wait_for_completion_interruptible(&resp_type->work);
|
||||
if (rc == 0) {
|
||||
rc = ap_msg->rc;
|
||||
if (rc == 0)
|
||||
|
||||
Reference in New Issue
Block a user