diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2009-06-13 00:16:35 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2009-06-12 08:46:36 -0400 |
commit | 9499f5e7ed5224c40706f0cec6542a9916bc7606 (patch) | |
tree | 3e4e1b36d3d549ea356e88e6e44359a887c6ee01 /drivers/virtio/virtio_ring.c | |
parent | ef688e151c00e5d529703be9a04fd506df8bc54e (diff) |
virtio: add names to virtqueue struct, mapping from devices to queues.
Add a linked list of all virtqueues for a virtio device: this helps for
debugging and is also needed for upcoming interface change.
Also, add a "name" field for clearer debug messages.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/virtio/virtio_ring.c')
-rw-r--r-- | drivers/virtio/virtio_ring.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 5c52369ab9bb..579fa693d5d0 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -23,21 +23,30 @@ | |||
23 | 23 | ||
24 | #ifdef DEBUG | 24 | #ifdef DEBUG |
25 | /* For development, we want to crash whenever the ring is screwed. */ | 25 | /* For development, we want to crash whenever the ring is screwed. */ |
26 | #define BAD_RING(_vq, fmt...) \ | 26 | #define BAD_RING(_vq, fmt, args...) \ |
27 | do { dev_err(&(_vq)->vq.vdev->dev, fmt); BUG(); } while(0) | 27 | do { \ |
28 | dev_err(&(_vq)->vq.vdev->dev, \ | ||
29 | "%s:"fmt, (_vq)->vq.name, ##args); \ | ||
30 | BUG(); \ | ||
31 | } while (0) | ||
28 | /* Caller is supposed to guarantee no reentry. */ | 32 | /* Caller is supposed to guarantee no reentry. */ |
29 | #define START_USE(_vq) \ | 33 | #define START_USE(_vq) \ |
30 | do { \ | 34 | do { \ |
31 | if ((_vq)->in_use) \ | 35 | if ((_vq)->in_use) \ |
32 | panic("in_use = %i\n", (_vq)->in_use); \ | 36 | panic("%s:in_use = %i\n", \ |
37 | (_vq)->vq.name, (_vq)->in_use); \ | ||
33 | (_vq)->in_use = __LINE__; \ | 38 | (_vq)->in_use = __LINE__; \ |
34 | mb(); \ | 39 | mb(); \ |
35 | } while(0) | 40 | } while (0) |
36 | #define END_USE(_vq) \ | 41 | #define END_USE(_vq) \ |
37 | do { BUG_ON(!(_vq)->in_use); (_vq)->in_use = 0; mb(); } while(0) | 42 | do { BUG_ON(!(_vq)->in_use); (_vq)->in_use = 0; mb(); } while(0) |
38 | #else | 43 | #else |
39 | #define BAD_RING(_vq, fmt...) \ | 44 | #define BAD_RING(_vq, fmt, args...) \ |
40 | do { dev_err(&_vq->vq.vdev->dev, fmt); (_vq)->broken = true; } while(0) | 45 | do { \ |
46 | dev_err(&_vq->vq.vdev->dev, \ | ||
47 | "%s:"fmt, (_vq)->vq.name, ##args); \ | ||
48 | (_vq)->broken = true; \ | ||
49 | } while (0) | ||
41 | #define START_USE(vq) | 50 | #define START_USE(vq) |
42 | #define END_USE(vq) | 51 | #define END_USE(vq) |
43 | #endif | 52 | #endif |
@@ -284,7 +293,8 @@ struct virtqueue *vring_new_virtqueue(unsigned int num, | |||
284 | struct virtio_device *vdev, | 293 | struct virtio_device *vdev, |
285 | void *pages, | 294 | void *pages, |
286 | void (*notify)(struct virtqueue *), | 295 | void (*notify)(struct virtqueue *), |
287 | void (*callback)(struct virtqueue *)) | 296 | void (*callback)(struct virtqueue *), |
297 | const char *name) | ||
288 | { | 298 | { |
289 | struct vring_virtqueue *vq; | 299 | struct vring_virtqueue *vq; |
290 | unsigned int i; | 300 | unsigned int i; |
@@ -303,10 +313,12 @@ struct virtqueue *vring_new_virtqueue(unsigned int num, | |||
303 | vq->vq.callback = callback; | 313 | vq->vq.callback = callback; |
304 | vq->vq.vdev = vdev; | 314 | vq->vq.vdev = vdev; |
305 | vq->vq.vq_ops = &vring_vq_ops; | 315 | vq->vq.vq_ops = &vring_vq_ops; |
316 | vq->vq.name = name; | ||
306 | vq->notify = notify; | 317 | vq->notify = notify; |
307 | vq->broken = false; | 318 | vq->broken = false; |
308 | vq->last_used_idx = 0; | 319 | vq->last_used_idx = 0; |
309 | vq->num_added = 0; | 320 | vq->num_added = 0; |
321 | list_add_tail(&vq->vq.list, &vdev->vqs); | ||
310 | #ifdef DEBUG | 322 | #ifdef DEBUG |
311 | vq->in_use = false; | 323 | vq->in_use = false; |
312 | #endif | 324 | #endif |
@@ -327,6 +339,7 @@ EXPORT_SYMBOL_GPL(vring_new_virtqueue); | |||
327 | 339 | ||
328 | void vring_del_virtqueue(struct virtqueue *vq) | 340 | void vring_del_virtqueue(struct virtqueue *vq) |
329 | { | 341 | { |
342 | list_del(&vq->list); | ||
330 | kfree(to_vvq(vq)); | 343 | kfree(to_vvq(vq)); |
331 | } | 344 | } |
332 | EXPORT_SYMBOL_GPL(vring_del_virtqueue); | 345 | EXPORT_SYMBOL_GPL(vring_del_virtqueue); |