summaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2017-04-24 11:17:06 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2017-04-24 11:17:06 +0200
commit5037c22c53603acd4e8c465d750fdd604c600bd3 (patch)
tree7889ed6cf57021c39b3db989fbd4bb978ec4e739 /drivers/s390
parents390/gs: add regset for the guarded storage broadcast control block (diff)
parentvfio: ccw: improve error handling for vfio_ccw_mdev_remove (diff)
downloadlinux-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.c6
-rw-r--r--drivers/s390/cio/vfio_ccw_ops.c34
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) {