Commit 7aa7b2a8 authored by Tony Krowiak's avatar Tony Krowiak Committed by Heiko Carstens
Browse files

s390/vfio-ap: clean up irq resources if possible



The architecture does not specify whether interrupts are disabled as part
of the asynchronous reset or upon return from the PQAP/ZAPQ instruction.
If, however, PQAP/ZAPQ completes with APQSW response code 0 and the
interrupt bit in the status word is also 0, we know the interrupts are
disabled and we can go ahead and clean up the corresponding resources;
otherwise, we must wait until the asynchronous reset has completed.

Signed-off-by: default avatarTony Krowiak <akrowiak@linux.ibm.com>
Suggested-by: default avatarHalil Pasic <pasic@linux.ibm.com>
Reviewed-by: default avatarJason J. Herne <jjherne@linux.ibm.com>
Acked-by: default avatarHalil Pasic <pasic@linux.ibm.com>
Acked-by: default avatarJanosch Frank <frankja@linux.ibm.com>
Tested-by: default avatarViktor Mihajlovski <mihajlov@linux.ibm.com>
Link: https://lore.kernel.org/r/20230815184333.6554-3-akrowiak@linux.ibm.com


Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 680b7ddd
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -1654,9 +1654,13 @@ static int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
	switch (status.response_code) {
	case AP_RESPONSE_NORMAL:
		ret = 0;
		/* if the reset has not completed, wait for it to take effect */
		if (!status.queue_empty || status.irq_enabled)
		if (!status.irq_enabled)
			vfio_ap_free_aqic_resources(q);
		if (!status.queue_empty || status.irq_enabled) {
			ret = apq_reset_check(q);
			if (status.irq_enabled && ret == 0)
				vfio_ap_free_aqic_resources(q);
		}
		break;
	case AP_RESPONSE_RESET_IN_PROGRESS:
		/*
@@ -1675,6 +1679,7 @@ static int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
		 * completed successfully.
		 */
		ret = 0;
		vfio_ap_free_aqic_resources(q);
		break;
	default:
		WARN(true,
@@ -1684,8 +1689,6 @@ static int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q)
		return -EIO;
	}

	vfio_ap_free_aqic_resources(q);

	return ret;
}