- Fix zcrypt ioctl hang due to AP queue msg counter dropping below 0 when
pending requests are purged. - Two fixes for the machine check handler in the entry code. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEE3QHqV+H2a8xAv27vjYWKoQLXFBgFAmDNvpgACgkQjYWKoQLX FBiuvQf/VrYPeFQotoit8ZQm5EUUMHeryxp3DVOeHFilPdANbVh1Q++NxZvf2XSw ejDUwTBuWaMmb2U8/7Yp+dbLYRu6XGKVKHLIArkXzsDzUNaJ+tMszAVKDK+SRHYe zaBYMG6Lfn/ByoME1rqQZ6e/dx+4f0rzorR5A8IlslsSFFyTzt8CSLnrDcu6aj4i bGSf8lS7dMoy49OYzuNYaPl2KcPEyrWMB//vuwj5jDru3eJcqW/m/q/7JRskTicm YsRw0x2waDs2x+SOQJ+haSrNRGY9YKSVUISVgDPX0Yz4PF9noNq1iOCRfu5JcrcR vlm3rJI8uFdZ8p4ZUMJHMS7T7Z5bRg== =GRT1 -----END PGP SIGNATURE----- Merge tag 's390-5.13-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux Pull s390 fixes from Vasily Gorbik: - Fix zcrypt ioctl hang due to AP queue msg counter dropping below 0 when pending requests are purged. - Two fixes for the machine check handler in the entry code. * tag 's390-5.13-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/ap: Fix hanging ioctl caused by wrong msg counter s390/mcck: fix invalid KVM guest condition check s390/mcck: fix calculation of SIE critical section size
This commit is contained in:
commit
e14c779ade
|
@ -651,9 +651,9 @@ ENDPROC(stack_overflow)
|
|||
.Lcleanup_sie_mcck:
|
||||
larl %r13,.Lsie_entry
|
||||
slgr %r9,%r13
|
||||
larl %r13,.Lsie_skip
|
||||
lghi %r13,.Lsie_skip - .Lsie_entry
|
||||
clgr %r9,%r13
|
||||
jh .Lcleanup_sie_int
|
||||
jhe .Lcleanup_sie_int
|
||||
oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
|
||||
.Lcleanup_sie_int:
|
||||
BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||
|
|
|
@ -135,12 +135,13 @@ static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
|
|||
{
|
||||
struct ap_queue_status status;
|
||||
struct ap_message *ap_msg;
|
||||
bool found = false;
|
||||
|
||||
status = ap_dqap(aq->qid, &aq->reply->psmid,
|
||||
aq->reply->msg, aq->reply->len);
|
||||
switch (status.response_code) {
|
||||
case AP_RESPONSE_NORMAL:
|
||||
aq->queue_count--;
|
||||
aq->queue_count = max_t(int, 0, aq->queue_count - 1);
|
||||
if (aq->queue_count > 0)
|
||||
mod_timer(&aq->timeout,
|
||||
jiffies + aq->request_timeout);
|
||||
|
@ -150,8 +151,14 @@ static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
|
|||
list_del_init(&ap_msg->list);
|
||||
aq->pendingq_count--;
|
||||
ap_msg->receive(aq, ap_msg, aq->reply);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if (!found) {
|
||||
AP_DBF_WARN("%s unassociated reply psmid=0x%016llx on 0x%02x.%04x\n",
|
||||
__func__, aq->reply->psmid,
|
||||
AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
|
||||
}
|
||||
fallthrough;
|
||||
case AP_RESPONSE_NO_PENDING_REPLY:
|
||||
if (!status.queue_empty || aq->queue_count <= 0)
|
||||
|
@ -232,7 +239,7 @@ static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
|
|||
ap_msg->flags & AP_MSG_FLAG_SPECIAL);
|
||||
switch (status.response_code) {
|
||||
case AP_RESPONSE_NORMAL:
|
||||
aq->queue_count++;
|
||||
aq->queue_count = max_t(int, 1, aq->queue_count + 1);
|
||||
if (aq->queue_count == 1)
|
||||
mod_timer(&aq->timeout, jiffies + aq->request_timeout);
|
||||
list_move_tail(&ap_msg->list, &aq->pendingq);
|
||||
|
|
Loading…
Reference in New Issue