diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2017-04-24 11:17:06 +0200 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2017-04-24 11:17:06 +0200 |
commit | 5037c22c53603acd4e8c465d750fdd604c600bd3 (patch) | |
tree | 7889ed6cf57021c39b3db989fbd4bb978ec4e739 /drivers/s390 | |
parent | s390/gs: add regset for the guarded storage broadcast control block (diff) | |
parent | vfio: ccw: improve error handling for vfio_ccw_mdev_remove (diff) | |
download | linux-5037c22c53603acd4e8c465d750fdd604c600bd3.tar.xz linux-5037c22c53603acd4e8c465d750fdd604c600bd3.zip |
Merge tag 'vfio-ccw-20170413' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/vfio-ccw into features
Pull vfio-ccw fixes from Cornelia Huck:
Two fixes for the new vfio-ccw support.
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/cio/vfio_ccw_fsm.c | 6 | ||||
-rw-r--r-- | drivers/s390/cio/vfio_ccw_ops.c | 34 |
2 files changed, 7 insertions, 33 deletions
diff --git a/drivers/s390/cio/vfio_ccw_fsm.c b/drivers/s390/cio/vfio_ccw_fsm.c index 55b6cc55758e..80a0559cd7ce 100644 --- a/drivers/s390/cio/vfio_ccw_fsm.c +++ b/drivers/s390/cio/vfio_ccw_fsm.c @@ -161,12 +161,8 @@ err_out: static void fsm_irq(struct vfio_ccw_private *private, enum vfio_ccw_event event) { - struct irb *irb; + struct irb *irb = this_cpu_ptr(&cio_irb); - if (!private) - return; - - irb = this_cpu_ptr(&cio_irb); memcpy(&private->irb, irb, sizeof(*irb)); queue_work(vfio_ccw_work_q, &private->io_work); diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c index b2e615404034..e72abbc18ee3 100644 --- a/drivers/s390/cio/vfio_ccw_ops.c +++ b/drivers/s390/cio/vfio_ccw_ops.c @@ -19,9 +19,6 @@ static int vfio_ccw_mdev_reset(struct mdev_device *mdev) int ret; private = dev_get_drvdata(mdev_parent_dev(mdev)); - if (!private) - return -ENODEV; - sch = private->sch; /* * TODO: @@ -49,9 +46,6 @@ static int vfio_ccw_mdev_notifier(struct notifier_block *nb, struct vfio_ccw_private *private = container_of(nb, struct vfio_ccw_private, nb); - if (!private) - return NOTIFY_STOP; - /* * Vendor drivers MUST unpin pages in response to an * invalidation. @@ -132,22 +126,14 @@ static int vfio_ccw_mdev_remove(struct mdev_device *mdev) { struct vfio_ccw_private *private = dev_get_drvdata(mdev_parent_dev(mdev)); - int ret; - if (!private) - goto out; - - if ((private->state == VFIO_CCW_STATE_NOT_OPER) || - (private->state == VFIO_CCW_STATE_STANDBY)) - goto out; - - ret = vfio_ccw_mdev_reset(mdev); - if (ret) - return ret; - - private->state = VFIO_CCW_STATE_STANDBY; + if ((private->state != VFIO_CCW_STATE_NOT_OPER) && + (private->state != VFIO_CCW_STATE_STANDBY)) { + if (!vfio_ccw_mdev_reset(mdev)) + private->state = VFIO_CCW_STATE_STANDBY; + /* The state will be NOT_OPER on error. */ + } -out: private->mdev = NULL; atomic_inc(&private->avail); @@ -187,9 +173,6 @@ static ssize_t vfio_ccw_mdev_read(struct mdev_device *mdev, return -EINVAL; private = dev_get_drvdata(mdev_parent_dev(mdev)); - if (!private) - return -ENODEV; - region = &private->io_region; if (copy_to_user(buf, (void *)region + *ppos, count)) return -EFAULT; @@ -209,8 +192,6 @@ static ssize_t vfio_ccw_mdev_write(struct mdev_device *mdev, return -EINVAL; private = dev_get_drvdata(mdev_parent_dev(mdev)); - if (!private) - return -ENODEV; if (private->state != VFIO_CCW_STATE_IDLE) return -EACCES; @@ -274,9 +255,6 @@ static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev, return -EINVAL; private = dev_get_drvdata(mdev_parent_dev(mdev)); - if (!private) - return -ENODEV; - ctx = &private->io_trigger; switch (flags & VFIO_IRQ_SET_DATA_TYPE_MASK) { |