@@ -648,7 +648,7 @@ static long zcrypt_rsa_modexpo(struct ap_perms *perms,
648648
649649 trace_s390_zcrypt_req (mex , TP_ICARSAMODEXPO );
650650
651- rc = ap_init_apmsg (& ap_msg , false );
651+ rc = ap_init_apmsg (& ap_msg , 0 );
652652 if (rc )
653653 goto out ;
654654
@@ -753,7 +753,7 @@ static long zcrypt_rsa_crt(struct ap_perms *perms,
753753
754754 trace_s390_zcrypt_req (crt , TP_ICARSACRT );
755755
756- rc = ap_init_apmsg (& ap_msg , false );
756+ rc = ap_init_apmsg (& ap_msg , 0 );
757757 if (rc )
758758 goto out ;
759759
@@ -844,10 +844,11 @@ static long zcrypt_rsa_crt(struct ap_perms *perms,
844844 return rc ;
845845}
846846
847- static long _zcrypt_send_cprb (bool userspace , struct ap_perms * perms ,
847+ static long _zcrypt_send_cprb (u32 xflags , struct ap_perms * perms ,
848848 struct zcrypt_track * tr ,
849849 struct ica_xcRB * xcrb )
850850{
851+ bool userspace = xflags & ZCRYPT_XFLAG_USERSPACE ;
851852 struct zcrypt_card * zc , * pref_zc ;
852853 struct zcrypt_queue * zq , * pref_zq ;
853854 struct ap_message ap_msg ;
@@ -861,7 +862,8 @@ static long _zcrypt_send_cprb(bool userspace, struct ap_perms *perms,
861862
862863 xcrb -> status = 0 ;
863864
864- rc = ap_init_apmsg (& ap_msg , false);
865+ rc = ap_init_apmsg (& ap_msg , xflags & ZCRYPT_XFLAG_NOMEMALLOC ?
866+ AP_MSG_FLAG_MEMPOOL : 0 );
865867 if (rc )
866868 goto out ;
867869
@@ -977,21 +979,21 @@ static long _zcrypt_send_cprb(bool userspace, struct ap_perms *perms,
977979 return rc ;
978980}
979981
980- long zcrypt_send_cprb (struct ica_xcRB * xcrb )
982+ long zcrypt_send_cprb (struct ica_xcRB * xcrb , u32 xflags )
981983{
982984 struct zcrypt_track tr ;
983985 int rc ;
984986
985987 memset (& tr , 0 , sizeof (tr ));
986988
987989 do {
988- rc = _zcrypt_send_cprb (false , & ap_perms , & tr , xcrb );
990+ rc = _zcrypt_send_cprb (xflags , & ap_perms , & tr , xcrb );
989991 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
990992
991993 /* on ENODEV failure: retry once again after a requested rescan */
992994 if (rc == - ENODEV && zcrypt_process_rescan ())
993995 do {
994- rc = _zcrypt_send_cprb (false , & ap_perms , & tr , xcrb );
996+ rc = _zcrypt_send_cprb (xflags , & ap_perms , & tr , xcrb );
995997 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
996998 if (rc == - EAGAIN && tr .again_counter >= TRACK_AGAIN_MAX )
997999 rc = - EIO ;
@@ -1029,10 +1031,11 @@ static bool is_desired_ep11_queue(unsigned int dev_qid,
10291031 return false;
10301032}
10311033
1032- static long _zcrypt_send_ep11_cprb (bool userspace , struct ap_perms * perms ,
1034+ static long _zcrypt_send_ep11_cprb (u32 xflags , struct ap_perms * perms ,
10331035 struct zcrypt_track * tr ,
10341036 struct ep11_urb * xcrb )
10351037{
1038+ bool userspace = xflags & ZCRYPT_XFLAG_USERSPACE ;
10361039 struct zcrypt_card * zc , * pref_zc ;
10371040 struct zcrypt_queue * zq , * pref_zq ;
10381041 struct ep11_target_dev * targets = NULL ;
@@ -1045,7 +1048,8 @@ static long _zcrypt_send_ep11_cprb(bool userspace, struct ap_perms *perms,
10451048
10461049 trace_s390_zcrypt_req (xcrb , TP_ZSENDEP11CPRB );
10471050
1048- rc = ap_init_apmsg (& ap_msg , false);
1051+ rc = ap_init_apmsg (& ap_msg , xflags & ZCRYPT_XFLAG_NOMEMALLOC ?
1052+ AP_MSG_FLAG_MEMPOOL : 0 );
10491053 if (rc )
10501054 goto out ;
10511055
@@ -1177,21 +1181,21 @@ static long _zcrypt_send_ep11_cprb(bool userspace, struct ap_perms *perms,
11771181 return rc ;
11781182}
11791183
1180- long zcrypt_send_ep11_cprb (struct ep11_urb * xcrb )
1184+ long zcrypt_send_ep11_cprb (struct ep11_urb * xcrb , u32 xflags )
11811185{
11821186 struct zcrypt_track tr ;
11831187 int rc ;
11841188
11851189 memset (& tr , 0 , sizeof (tr ));
11861190
11871191 do {
1188- rc = _zcrypt_send_ep11_cprb (false , & ap_perms , & tr , xcrb );
1192+ rc = _zcrypt_send_ep11_cprb (xflags , & ap_perms , & tr , xcrb );
11891193 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
11901194
11911195 /* on ENODEV failure: retry once again after a requested rescan */
11921196 if (rc == - ENODEV && zcrypt_process_rescan ())
11931197 do {
1194- rc = _zcrypt_send_ep11_cprb (false , & ap_perms , & tr , xcrb );
1198+ rc = _zcrypt_send_ep11_cprb (xflags , & ap_perms , & tr , xcrb );
11951199 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
11961200 if (rc == - EAGAIN && tr .again_counter >= TRACK_AGAIN_MAX )
11971201 rc = - EIO ;
@@ -1215,7 +1219,7 @@ static long zcrypt_rng(char *buffer)
12151219
12161220 trace_s390_zcrypt_req (buffer , TP_HWRNGCPRB );
12171221
1218- rc = ap_init_apmsg (& ap_msg , false );
1222+ rc = ap_init_apmsg (& ap_msg , 0 );
12191223 if (rc )
12201224 goto out ;
12211225 rc = prep_rng_ap_msg (& ap_msg , & func_code , & domain );
@@ -1528,20 +1532,21 @@ static int zsecsendcprb_ioctl(struct ap_perms *perms, unsigned long arg)
15281532 int rc ;
15291533 struct ica_xcRB xcrb ;
15301534 struct zcrypt_track tr ;
1535+ u32 xflags = ZCRYPT_XFLAG_USERSPACE ;
15311536 struct ica_xcRB __user * uxcrb = (void __user * )arg ;
15321537
15331538 memset (& tr , 0 , sizeof (tr ));
15341539 if (copy_from_user (& xcrb , uxcrb , sizeof (xcrb )))
15351540 return - EFAULT ;
15361541
15371542 do {
1538- rc = _zcrypt_send_cprb (true , perms , & tr , & xcrb );
1543+ rc = _zcrypt_send_cprb (xflags , perms , & tr , & xcrb );
15391544 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
15401545
15411546 /* on ENODEV failure: retry once again after a requested rescan */
15421547 if (rc == - ENODEV && zcrypt_process_rescan ())
15431548 do {
1544- rc = _zcrypt_send_cprb (true , perms , & tr , & xcrb );
1549+ rc = _zcrypt_send_cprb (xflags , perms , & tr , & xcrb );
15451550 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
15461551 if (rc == - EAGAIN && tr .again_counter >= TRACK_AGAIN_MAX )
15471552 rc = - EIO ;
@@ -1558,20 +1563,21 @@ static int zsendep11cprb_ioctl(struct ap_perms *perms, unsigned long arg)
15581563 int rc ;
15591564 struct ep11_urb xcrb ;
15601565 struct zcrypt_track tr ;
1566+ u32 xflags = ZCRYPT_XFLAG_USERSPACE ;
15611567 struct ep11_urb __user * uxcrb = (void __user * )arg ;
15621568
15631569 memset (& tr , 0 , sizeof (tr ));
15641570 if (copy_from_user (& xcrb , uxcrb , sizeof (xcrb )))
15651571 return - EFAULT ;
15661572
15671573 do {
1568- rc = _zcrypt_send_ep11_cprb (true , perms , & tr , & xcrb );
1574+ rc = _zcrypt_send_ep11_cprb (xflags , perms , & tr , & xcrb );
15691575 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
15701576
15711577 /* on ENODEV failure: retry once again after a requested rescan */
15721578 if (rc == - ENODEV && zcrypt_process_rescan ())
15731579 do {
1574- rc = _zcrypt_send_ep11_cprb (true , perms , & tr , & xcrb );
1580+ rc = _zcrypt_send_ep11_cprb (xflags , perms , & tr , & xcrb );
15751581 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
15761582 if (rc == - EAGAIN && tr .again_counter >= TRACK_AGAIN_MAX )
15771583 rc = - EIO ;
@@ -1832,6 +1838,7 @@ static long trans_xcrb32(struct ap_perms *perms, struct file *filp,
18321838 unsigned int cmd , unsigned long arg )
18331839{
18341840 struct compat_ica_xcrb __user * uxcrb32 = compat_ptr (arg );
1841+ u32 xflags = ZCRYPT_XFLAG_USERSPACE ;
18351842 struct compat_ica_xcrb xcrb32 ;
18361843 struct zcrypt_track tr ;
18371844 struct ica_xcRB xcrb64 ;
@@ -1861,13 +1868,13 @@ static long trans_xcrb32(struct ap_perms *perms, struct file *filp,
18611868 xcrb64 .priority_window = xcrb32 .priority_window ;
18621869 xcrb64 .status = xcrb32 .status ;
18631870 do {
1864- rc = _zcrypt_send_cprb (true , perms , & tr , & xcrb64 );
1871+ rc = _zcrypt_send_cprb (xflags , perms , & tr , & xcrb64 );
18651872 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
18661873
18671874 /* on ENODEV failure: retry once again after a requested rescan */
18681875 if (rc == - ENODEV && zcrypt_process_rescan ())
18691876 do {
1870- rc = _zcrypt_send_cprb (true , perms , & tr , & xcrb64 );
1877+ rc = _zcrypt_send_cprb (xflags , perms , & tr , & xcrb64 );
18711878 } while (rc == - EAGAIN && ++ tr .again_counter < TRACK_AGAIN_MAX );
18721879 if (rc == - EAGAIN && tr .again_counter >= TRACK_AGAIN_MAX )
18731880 rc = - EIO ;
0 commit comments