diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2017-04-24 05:17:06 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2017-04-24 05:17:06 -0400 |
commit | 5037c22c53603acd4e8c465d750fdd604c600bd3 (patch) | |
tree | 7889ed6cf57021c39b3db989fbd4bb978ec4e739 | |
parent | e525f8a6e696210d15f8b8277d4da12fc4add299 (diff) | |
parent | 129cc19a94513081e9250323cd57e12ed48b3613 (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.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: | |||
161 | static void fsm_irq(struct vfio_ccw_private *private, | 161 | static 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 | ||
150 | out: | ||
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) { |