ACK: [SRU][Bionic][Patch 1/1] s390/qdio: clear intparm during shutdown
Kleber Souza
kleber.souza at canonical.com
Mon May 13 13:53:52 UTC 2019
On 5/9/19 5:36 PM, frank.heimes at canonical.com wrote:
> From: Julian Wiedmann <jwi at linux.vnet.ibm.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1828394
>
> During shutdown, qdio returns its ccw device back to control by the
> upper-layer driver. But there is a remote chance that by the time where the
> IRQ handler gets switched back, the interrupt for the preceding
> ccw_device_{clear,halt} hasn't been presented yet.
> Upper-layer drivers would then need to handle this IRQ - and since the IO
> is issued with an intparm, it could very well be confused with whatever
> intparm mechanism the driver uses itself (eg intparm == request address).
>
> So when switching over the IRQ handler, also clear the intparm and have
> upper-layer drivers deal with any such delayed interrupt as if it was
> unsolicited.
>
> Suggested-by: Sebastian Ott <sebott at linux.vnet.ibm.com>
> Signed-off-by: Julian Wiedmann <jwi at linux.vnet.ibm.com>
> Signed-off-by: Martin Schwidefsky <schwidefsky at de.ibm.com>
> (cherry picked from commit 89286320a236d245834075fa13adb0bdd827ecaa)
> Signed-off-by: Frank Heimes <frank.heimes at canonical.com>
Clean cherry-pick, limited to platform specific driver.
Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>
> ---
> drivers/s390/cio/qdio_main.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
> index d76df58..8842be6 100644
> --- a/drivers/s390/cio/qdio_main.c
> +++ b/drivers/s390/cio/qdio_main.c
> @@ -1218,8 +1218,10 @@ int qdio_shutdown(struct ccw_device *cdev, int how)
> qdio_shutdown_thinint(irq_ptr);
>
> /* restore interrupt handler */
> - if ((void *)cdev->handler == (void *)qdio_int_handler)
> + if ((void *)cdev->handler == (void *)qdio_int_handler) {
> cdev->handler = irq_ptr->orig_handler;
> + cdev->private->intparm = 0;
> + }
> spin_unlock_irq(get_ccwdev_lock(cdev));
>
> qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
>
More information about the kernel-team
mailing list