diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2009-06-13 00:16:36 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2009-06-12 08:46:36 -0400 |
commit | d2a7ddda9ffb1c8961abff6714b0f1eb925c120f (patch) | |
tree | 1090884fd260d042255255467367e4e6b6193e5d /drivers/virtio | |
parent | 9499f5e7ed5224c40706f0cec6542a9916bc7606 (diff) |
virtio: find_vqs/del_vqs virtio operations
This replaces find_vq/del_vq with find_vqs/del_vqs virtio operations,
and updates all drivers. This is needed for MSI support, because MSI
needs to know the total number of vectors upfront.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (+ lguest/9p compile fixes)
Diffstat (limited to 'drivers/virtio')
-rw-r--r-- | drivers/virtio/virtio_balloon.c | 27 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci.c | 37 |
2 files changed, 41 insertions, 23 deletions
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 0fa73b4d18b0..26b278264796 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c | |||
@@ -204,6 +204,9 @@ static int balloon(void *_vballoon) | |||
204 | static int virtballoon_probe(struct virtio_device *vdev) | 204 | static int virtballoon_probe(struct virtio_device *vdev) |
205 | { | 205 | { |
206 | struct virtio_balloon *vb; | 206 | struct virtio_balloon *vb; |
207 | struct virtqueue *vqs[2]; | ||
208 | vq_callback_t *callbacks[] = { balloon_ack, balloon_ack }; | ||
209 | const char *names[] = { "inflate", "deflate" }; | ||
207 | int err; | 210 | int err; |
208 | 211 | ||
209 | vdev->priv = vb = kmalloc(sizeof(*vb), GFP_KERNEL); | 212 | vdev->priv = vb = kmalloc(sizeof(*vb), GFP_KERNEL); |
@@ -218,22 +221,17 @@ static int virtballoon_probe(struct virtio_device *vdev) | |||
218 | vb->vdev = vdev; | 221 | vb->vdev = vdev; |
219 | 222 | ||
220 | /* We expect two virtqueues. */ | 223 | /* We expect two virtqueues. */ |
221 | vb->inflate_vq = vdev->config->find_vq(vdev, 0, balloon_ack, "inflate"); | 224 | err = vdev->config->find_vqs(vdev, 2, vqs, callbacks, names); |
222 | if (IS_ERR(vb->inflate_vq)) { | 225 | if (err) |
223 | err = PTR_ERR(vb->inflate_vq); | ||
224 | goto out_free_vb; | 226 | goto out_free_vb; |
225 | } | ||
226 | 227 | ||
227 | vb->deflate_vq = vdev->config->find_vq(vdev, 1, balloon_ack, "deflate"); | 228 | vb->inflate_vq = vqs[0]; |
228 | if (IS_ERR(vb->deflate_vq)) { | 229 | vb->deflate_vq = vqs[1]; |
229 | err = PTR_ERR(vb->deflate_vq); | ||
230 | goto out_del_inflate_vq; | ||
231 | } | ||
232 | 230 | ||
233 | vb->thread = kthread_run(balloon, vb, "vballoon"); | 231 | vb->thread = kthread_run(balloon, vb, "vballoon"); |
234 | if (IS_ERR(vb->thread)) { | 232 | if (IS_ERR(vb->thread)) { |
235 | err = PTR_ERR(vb->thread); | 233 | err = PTR_ERR(vb->thread); |
236 | goto out_del_deflate_vq; | 234 | goto out_del_vqs; |
237 | } | 235 | } |
238 | 236 | ||
239 | vb->tell_host_first | 237 | vb->tell_host_first |
@@ -241,10 +239,8 @@ static int virtballoon_probe(struct virtio_device *vdev) | |||
241 | 239 | ||
242 | return 0; | 240 | return 0; |
243 | 241 | ||
244 | out_del_deflate_vq: | 242 | out_del_vqs: |
245 | vdev->config->del_vq(vb->deflate_vq); | 243 | vdev->config->del_vqs(vdev); |
246 | out_del_inflate_vq: | ||
247 | vdev->config->del_vq(vb->inflate_vq); | ||
248 | out_free_vb: | 244 | out_free_vb: |
249 | kfree(vb); | 245 | kfree(vb); |
250 | out: | 246 | out: |
@@ -264,8 +260,7 @@ static void virtballoon_remove(struct virtio_device *vdev) | |||
264 | /* Now we reset the device so we can clean up the queues. */ | 260 | /* Now we reset the device so we can clean up the queues. */ |
265 | vdev->config->reset(vdev); | 261 | vdev->config->reset(vdev); |
266 | 262 | ||
267 | vdev->config->del_vq(vb->deflate_vq); | 263 | vdev->config->del_vqs(vdev); |
268 | vdev->config->del_vq(vb->inflate_vq); | ||
269 | kfree(vb); | 264 | kfree(vb); |
270 | } | 265 | } |
271 | 266 | ||
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index be4047abd5ba..027f13fbe493 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -276,11 +276,7 @@ static void vp_del_vq(struct virtqueue *vq) | |||
276 | { | 276 | { |
277 | struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); | 277 | struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); |
278 | struct virtio_pci_vq_info *info = vq->priv; | 278 | struct virtio_pci_vq_info *info = vq->priv; |
279 | unsigned long flags, size; | 279 | unsigned long size; |
280 | |||
281 | spin_lock_irqsave(&vp_dev->lock, flags); | ||
282 | list_del(&info->node); | ||
283 | spin_unlock_irqrestore(&vp_dev->lock, flags); | ||
284 | 280 | ||
285 | vring_del_virtqueue(vq); | 281 | vring_del_virtqueue(vq); |
286 | 282 | ||
@@ -293,14 +289,41 @@ static void vp_del_vq(struct virtqueue *vq) | |||
293 | kfree(info); | 289 | kfree(info); |
294 | } | 290 | } |
295 | 291 | ||
292 | static void vp_del_vqs(struct virtio_device *vdev) | ||
293 | { | ||
294 | struct virtqueue *vq, *n; | ||
295 | |||
296 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) | ||
297 | vp_del_vq(vq); | ||
298 | } | ||
299 | |||
300 | static int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs, | ||
301 | struct virtqueue *vqs[], | ||
302 | vq_callback_t *callbacks[], | ||
303 | const char *names[]) | ||
304 | { | ||
305 | int i; | ||
306 | |||
307 | for (i = 0; i < nvqs; ++i) { | ||
308 | vqs[i] = vp_find_vq(vdev, i, callbacks[i], names[i]); | ||
309 | if (IS_ERR(vqs[i])) | ||
310 | goto error; | ||
311 | } | ||
312 | return 0; | ||
313 | |||
314 | error: | ||
315 | vp_del_vqs(vdev); | ||
316 | return PTR_ERR(vqs[i]); | ||
317 | } | ||
318 | |||
296 | static struct virtio_config_ops virtio_pci_config_ops = { | 319 | static struct virtio_config_ops virtio_pci_config_ops = { |
297 | .get = vp_get, | 320 | .get = vp_get, |
298 | .set = vp_set, | 321 | .set = vp_set, |
299 | .get_status = vp_get_status, | 322 | .get_status = vp_get_status, |
300 | .set_status = vp_set_status, | 323 | .set_status = vp_set_status, |
301 | .reset = vp_reset, | 324 | .reset = vp_reset, |
302 | .find_vq = vp_find_vq, | 325 | .find_vqs = vp_find_vqs, |
303 | .del_vq = vp_del_vq, | 326 | .del_vqs = vp_del_vqs, |
304 | .get_features = vp_get_features, | 327 | .get_features = vp_get_features, |
305 | .finalize_features = vp_finalize_features, | 328 | .finalize_features = vp_finalize_features, |
306 | }; | 329 | }; |