diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2019-03-11 10:10:39 -0700 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2019-03-11 10:10:39 -0700 |
commit | 0ba8141fa06db7496502606f6391898d0d3f81f4 (patch) | |
tree | 0bbda81652f89070452ddd3edd59c65c07e1abf7 | |
parent | 152e9b8676c6e788c6bff095c1eaae7b86df5003 (diff) | |
parent | 50b7f1b7236bab08ebbbecf90521e84b068d7a17 (diff) | |
download | linux-0ba8141fa06db7496502606f6391898d0d3f81f4.tar.gz |
Merge tag 'vfio-ccw-20190311' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/vfio-ccw into fixes
Pull vfio-ccw from Cornelia Huck with the following changes:
- Fix a host crash triggerable by the guest via a channel program.
-rw-r--r-- | drivers/s390/cio/vfio_ccw_drv.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index a10cec0e86eb..0b3b9de45c60 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -72,20 +72,24 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work) { struct vfio_ccw_private *private; struct irb *irb; + bool is_final; private = container_of(work, struct vfio_ccw_private, io_work); irb = &private->irb; + is_final = !(scsw_actl(&irb->scsw) & + (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)); if (scsw_is_solicited(&irb->scsw)) { cp_update_scsw(&private->cp, &irb->scsw); - cp_free(&private->cp); + if (is_final) + cp_free(&private->cp); } memcpy(private->io_region->irb_area, irb, sizeof(*irb)); if (private->io_trigger) eventfd_signal(private->io_trigger, 1); - if (private->mdev) + if (private->mdev && is_final) private->state = VFIO_CCW_STATE_IDLE; } |