aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2017-04-24 05:17:06 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2017-04-24 05:17:06 -0400
commit5037c22c53603acd4e8c465d750fdd604c600bd3 (patch)
tree7889ed6cf57021c39b3db989fbd4bb978ec4e739
parente525f8a6e696210d15f8b8277d4da12fc4add299 (diff)
parent129cc19a94513081e9250323cd57e12ed48b3613 (diff)
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.
-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:
161static void fsm_irq(struct vfio_ccw_private *private, 161static void fsm_irq(struct vfio_ccw_private *private,
162 enum vfio_ccw_event event) 162 enum vfio_ccw_event event)
163{ 163{
164 struct irb *irb; 164 struct irb *irb = this_cpu_ptr(&cio_irb);
165 165
166 if (!private)
167 return;
168
169 irb = this_cpu_ptr(&cio_irb);
170 memcpy(&private->irb, irb, sizeof(*irb)); 166 memcpy(&private->irb, irb, sizeof(*irb));
171 167
172 queue_work(vfio_ccw_work_q, &private->io_work); 168 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)
19 int ret; 19 int ret;
20 20
21 private = dev_get_drvdata(mdev_parent_dev(mdev)); 21 private = dev_get_drvdata(mdev_parent_dev(mdev));
22 if (!private)
23 return -ENODEV;
24
25 sch = private->sch; 22 sch = private->sch;
26 /* 23 /*
27 * TODO: 24 * TODO:
@@ -49,9 +46,6 @@ static int vfio_ccw_mdev_notifier(struct notifier_block *nb,
49 struct vfio_ccw_private *private = 46 struct vfio_ccw_private *private =
50 container_of(nb, struct vfio_ccw_private, nb); 47 container_of(nb, struct vfio_ccw_private, nb);
51 48
52 if (!private)
53 return NOTIFY_STOP;
54
55 /* 49 /*
56 * Vendor drivers MUST unpin pages in response to an 50 * Vendor drivers MUST unpin pages in response to an
57 * invalidation. 51 * invalidation.
@@ -132,22 +126,14 @@ static int vfio_ccw_mdev_remove(struct mdev_device *mdev)
132{ 126{
133 struct vfio_ccw_private *private = 127 struct vfio_ccw_private *private =
134 dev_get_drvdata(mdev_parent_dev(mdev)); 128 dev_get_drvdata(mdev_parent_dev(mdev));
135 int ret;
136 129
137 if (!private) 130 if ((private->state != VFIO_CCW_STATE_NOT_OPER) &&
138 goto out; 131 (private->state != VFIO_CCW_STATE_STANDBY)) {
139 132 if (!vfio_ccw_mdev_reset(mdev))
140 if ((private->state == VFIO_CCW_STATE_NOT_OPER) || 133 private->state = VFIO_CCW_STATE_STANDBY;
141 (private->state == VFIO_CCW_STATE_STANDBY)) 134 /* The state will be NOT_OPER on error. */
142 goto out; 135 }
143
144 ret = vfio_ccw_mdev_reset(mdev);
145 if (ret)
146 return ret;
147
148 private->state = VFIO_CCW_STATE_STANDBY;
149 136
150out:
151 private->mdev = NULL; 137 private->mdev = NULL;
152 atomic_inc(&private->avail); 138 atomic_inc(&private->avail);
153 139
@@ -187,9 +173,6 @@ static ssize_t vfio_ccw_mdev_read(struct mdev_device *mdev,
187 return -EINVAL; 173 return -EINVAL;
188 174
189 private = dev_get_drvdata(mdev_parent_dev(mdev)); 175 private = dev_get_drvdata(mdev_parent_dev(mdev));
190 if (!private)
191 return -ENODEV;
192
193 region = &private->io_region; 176 region = &private->io_region;
194 if (copy_to_user(buf, (void *)region + *ppos, count)) 177 if (copy_to_user(buf, (void *)region + *ppos, count))
195 return -EFAULT; 178 return -EFAULT;
@@ -209,8 +192,6 @@ static ssize_t vfio_ccw_mdev_write(struct mdev_device *mdev,
209 return -EINVAL; 192 return -EINVAL;
210 193
211 private = dev_get_drvdata(mdev_parent_dev(mdev)); 194 private = dev_get_drvdata(mdev_parent_dev(mdev));
212 if (!private)
213 return -ENODEV;
214 if (private->state != VFIO_CCW_STATE_IDLE) 195 if (private->state != VFIO_CCW_STATE_IDLE)
215 return -EACCES; 196 return -EACCES;
216 197
@@ -274,9 +255,6 @@ static int vfio_ccw_mdev_set_irqs(struct mdev_device *mdev,
274 return -EINVAL; 255 return -EINVAL;
275 256
276 private = dev_get_drvdata(mdev_parent_dev(mdev)); 257 private = dev_get_drvdata(mdev_parent_dev(mdev));
277 if (!private)
278 return -ENODEV;
279
280 ctx = &private->io_trigger; 258 ctx = &private->io_trigger;
281 259
282 switch (flags & VFIO_IRQ_SET_DATA_TYPE_MASK) { 260 switch (flags & VFIO_IRQ_SET_DATA_TYPE_MASK) {