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 | |
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')
-rw-r--r-- | drivers/block/virtio_blk.c | 2 | ||||
-rw-r--r-- | drivers/char/hw_random/virtio-rng.c | 2 | ||||
-rw-r--r-- | drivers/char/virtio_console.c | 4 | ||||
-rw-r--r-- | drivers/lguest/lguest_device.c | 5 | ||||
-rw-r--r-- | drivers/net/virtio_net.c | 6 | ||||
-rw-r--r-- | drivers/s390/kvm/kvm_virtio.c | 7 | ||||
-rw-r--r-- | drivers/virtio/virtio.c | 2 | ||||
-rw-r--r-- | drivers/virtio/virtio_balloon.c | 4 | ||||
-rw-r--r-- | drivers/virtio/virtio_pci.c | 5 | ||||
-rw-r--r-- | drivers/virtio/virtio_ring.c | 27 |
10 files changed, 41 insertions, 23 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index c0facaa55cf4..db55a50d9f6a 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -288,7 +288,7 @@ static int virtblk_probe(struct virtio_device *vdev) | |||
288 | sg_init_table(vblk->sg, vblk->sg_elems); | 288 | sg_init_table(vblk->sg, vblk->sg_elems); |
289 | 289 | ||
290 | /* We expect one virtqueue, for output. */ | 290 | /* We expect one virtqueue, for output. */ |
291 | vblk->vq = vdev->config->find_vq(vdev, 0, blk_done); | 291 | vblk->vq = vdev->config->find_vq(vdev, 0, blk_done, "requests"); |
292 | if (IS_ERR(vblk->vq)) { | 292 | if (IS_ERR(vblk->vq)) { |
293 | err = PTR_ERR(vblk->vq); | 293 | err = PTR_ERR(vblk->vq); |
294 | goto out_free_vblk; | 294 | goto out_free_vblk; |
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 86e83f883139..2aeafcea95fe 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c | |||
@@ -94,7 +94,7 @@ static int virtrng_probe(struct virtio_device *vdev) | |||
94 | int err; | 94 | int err; |
95 | 95 | ||
96 | /* We expect a single virtqueue. */ | 96 | /* We expect a single virtqueue. */ |
97 | vq = vdev->config->find_vq(vdev, 0, random_recv_done); | 97 | vq = vdev->config->find_vq(vdev, 0, random_recv_done, "input"); |
98 | if (IS_ERR(vq)) | 98 | if (IS_ERR(vq)) |
99 | return PTR_ERR(vq); | 99 | return PTR_ERR(vq); |
100 | 100 | ||
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index ff6f5a4b58fb..58684e4a0814 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -202,13 +202,13 @@ static int __devinit virtcons_probe(struct virtio_device *dev) | |||
202 | /* Find the input queue. */ | 202 | /* Find the input queue. */ |
203 | /* FIXME: This is why we want to wean off hvc: we do nothing | 203 | /* FIXME: This is why we want to wean off hvc: we do nothing |
204 | * when input comes in. */ | 204 | * when input comes in. */ |
205 | in_vq = vdev->config->find_vq(vdev, 0, hvc_handle_input); | 205 | in_vq = vdev->config->find_vq(vdev, 0, hvc_handle_input, "input"); |
206 | if (IS_ERR(in_vq)) { | 206 | if (IS_ERR(in_vq)) { |
207 | err = PTR_ERR(in_vq); | 207 | err = PTR_ERR(in_vq); |
208 | goto free; | 208 | goto free; |
209 | } | 209 | } |
210 | 210 | ||
211 | out_vq = vdev->config->find_vq(vdev, 1, NULL); | 211 | out_vq = vdev->config->find_vq(vdev, 1, NULL, "output"); |
212 | if (IS_ERR(out_vq)) { | 212 | if (IS_ERR(out_vq)) { |
213 | err = PTR_ERR(out_vq); | 213 | err = PTR_ERR(out_vq); |
214 | goto free_in_vq; | 214 | goto free_in_vq; |
diff --git a/drivers/lguest/lguest_device.c b/drivers/lguest/lguest_device.c index df44d962626d..4babed899d59 100644 --- a/drivers/lguest/lguest_device.c +++ b/drivers/lguest/lguest_device.c | |||
@@ -228,7 +228,8 @@ extern void lguest_setup_irq(unsigned int irq); | |||
228 | * function. */ | 228 | * function. */ |
229 | static struct virtqueue *lg_find_vq(struct virtio_device *vdev, | 229 | static struct virtqueue *lg_find_vq(struct virtio_device *vdev, |
230 | unsigned index, | 230 | unsigned index, |
231 | void (*callback)(struct virtqueue *vq)) | 231 | void (*callback)(struct virtqueue *vq), |
232 | const char *name) | ||
232 | { | 233 | { |
233 | struct lguest_device *ldev = to_lgdev(vdev); | 234 | struct lguest_device *ldev = to_lgdev(vdev); |
234 | struct lguest_vq_info *lvq; | 235 | struct lguest_vq_info *lvq; |
@@ -263,7 +264,7 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev, | |||
263 | /* OK, tell virtio_ring.c to set up a virtqueue now we know its size | 264 | /* OK, tell virtio_ring.c to set up a virtqueue now we know its size |
264 | * and we've got a pointer to its pages. */ | 265 | * and we've got a pointer to its pages. */ |
265 | vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN, | 266 | vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN, |
266 | vdev, lvq->pages, lg_notify, callback); | 267 | vdev, lvq->pages, lg_notify, callback, name); |
267 | if (!vq) { | 268 | if (!vq) { |
268 | err = -ENOMEM; | 269 | err = -ENOMEM; |
269 | goto unmap; | 270 | goto unmap; |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 4d1d47953fc6..be3b734ff5a1 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -906,20 +906,20 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
906 | vi->mergeable_rx_bufs = true; | 906 | vi->mergeable_rx_bufs = true; |
907 | 907 | ||
908 | /* We expect two virtqueues, receive then send. */ | 908 | /* We expect two virtqueues, receive then send. */ |
909 | vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done); | 909 | vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done, "input"); |
910 | if (IS_ERR(vi->rvq)) { | 910 | if (IS_ERR(vi->rvq)) { |
911 | err = PTR_ERR(vi->rvq); | 911 | err = PTR_ERR(vi->rvq); |
912 | goto free; | 912 | goto free; |
913 | } | 913 | } |
914 | 914 | ||
915 | vi->svq = vdev->config->find_vq(vdev, 1, skb_xmit_done); | 915 | vi->svq = vdev->config->find_vq(vdev, 1, skb_xmit_done, "output"); |
916 | if (IS_ERR(vi->svq)) { | 916 | if (IS_ERR(vi->svq)) { |
917 | err = PTR_ERR(vi->svq); | 917 | err = PTR_ERR(vi->svq); |
918 | goto free_recv; | 918 | goto free_recv; |
919 | } | 919 | } |
920 | 920 | ||
921 | if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) { | 921 | if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) { |
922 | vi->cvq = vdev->config->find_vq(vdev, 2, NULL); | 922 | vi->cvq = vdev->config->find_vq(vdev, 2, NULL, "control"); |
923 | if (IS_ERR(vi->cvq)) { | 923 | if (IS_ERR(vi->cvq)) { |
924 | err = PTR_ERR(vi->svq); | 924 | err = PTR_ERR(vi->svq); |
925 | goto free_send; | 925 | goto free_send; |
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index cbc8566fab70..ba8995fbf041 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
@@ -173,8 +173,9 @@ static void kvm_notify(struct virtqueue *vq) | |||
173 | * this device and sets it up. | 173 | * this device and sets it up. |
174 | */ | 174 | */ |
175 | static struct virtqueue *kvm_find_vq(struct virtio_device *vdev, | 175 | static struct virtqueue *kvm_find_vq(struct virtio_device *vdev, |
176 | unsigned index, | 176 | unsigned index, |
177 | void (*callback)(struct virtqueue *vq)) | 177 | void (*callback)(struct virtqueue *vq), |
178 | const char *name) | ||
178 | { | 179 | { |
179 | struct kvm_device *kdev = to_kvmdev(vdev); | 180 | struct kvm_device *kdev = to_kvmdev(vdev); |
180 | struct kvm_vqconfig *config; | 181 | struct kvm_vqconfig *config; |
@@ -194,7 +195,7 @@ static struct virtqueue *kvm_find_vq(struct virtio_device *vdev, | |||
194 | 195 | ||
195 | vq = vring_new_virtqueue(config->num, KVM_S390_VIRTIO_RING_ALIGN, | 196 | vq = vring_new_virtqueue(config->num, KVM_S390_VIRTIO_RING_ALIGN, |
196 | vdev, (void *) config->address, | 197 | vdev, (void *) config->address, |
197 | kvm_notify, callback); | 198 | kvm_notify, callback, name); |
198 | if (!vq) { | 199 | if (!vq) { |
199 | err = -ENOMEM; | 200 | err = -ENOMEM; |
200 | goto unmap; | 201 | goto unmap; |
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index 6b6810364860..3f52c767dfe9 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c | |||
@@ -186,6 +186,8 @@ int register_virtio_device(struct virtio_device *dev) | |||
186 | /* Acknowledge that we've seen the device. */ | 186 | /* Acknowledge that we've seen the device. */ |
187 | add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE); | 187 | add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE); |
188 | 188 | ||
189 | INIT_LIST_HEAD(&dev->vqs); | ||
190 | |||
189 | /* device_register() causes the bus infrastructure to look for a | 191 | /* device_register() causes the bus infrastructure to look for a |
190 | * matching driver. */ | 192 | * matching driver. */ |
191 | err = device_register(&dev->dev); | 193 | err = device_register(&dev->dev); |
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 9c76a061a04d..0fa73b4d18b0 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c | |||
@@ -218,13 +218,13 @@ static int virtballoon_probe(struct virtio_device *vdev) | |||
218 | vb->vdev = vdev; | 218 | vb->vdev = vdev; |
219 | 219 | ||
220 | /* We expect two virtqueues. */ | 220 | /* We expect two virtqueues. */ |
221 | vb->inflate_vq = vdev->config->find_vq(vdev, 0, balloon_ack); | 221 | vb->inflate_vq = vdev->config->find_vq(vdev, 0, balloon_ack, "inflate"); |
222 | if (IS_ERR(vb->inflate_vq)) { | 222 | if (IS_ERR(vb->inflate_vq)) { |
223 | err = PTR_ERR(vb->inflate_vq); | 223 | err = PTR_ERR(vb->inflate_vq); |
224 | goto out_free_vb; | 224 | goto out_free_vb; |
225 | } | 225 | } |
226 | 226 | ||
227 | vb->deflate_vq = vdev->config->find_vq(vdev, 1, balloon_ack); | 227 | vb->deflate_vq = vdev->config->find_vq(vdev, 1, balloon_ack, "deflate"); |
228 | if (IS_ERR(vb->deflate_vq)) { | 228 | if (IS_ERR(vb->deflate_vq)) { |
229 | err = PTR_ERR(vb->deflate_vq); | 229 | err = PTR_ERR(vb->deflate_vq); |
230 | goto out_del_inflate_vq; | 230 | goto out_del_inflate_vq; |
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 330aacbdec1f..be4047abd5ba 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -208,7 +208,8 @@ static irqreturn_t vp_interrupt(int irq, void *opaque) | |||
208 | 208 | ||
209 | /* the config->find_vq() implementation */ | 209 | /* the config->find_vq() implementation */ |
210 | static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, | 210 | static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, |
211 | void (*callback)(struct virtqueue *vq)) | 211 | void (*callback)(struct virtqueue *vq), |
212 | const char *name) | ||
212 | { | 213 | { |
213 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); | 214 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); |
214 | struct virtio_pci_vq_info *info; | 215 | struct virtio_pci_vq_info *info; |
@@ -247,7 +248,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, | |||
247 | 248 | ||
248 | /* create the vring */ | 249 | /* create the vring */ |
249 | vq = vring_new_virtqueue(info->num, VIRTIO_PCI_VRING_ALIGN, | 250 | vq = vring_new_virtqueue(info->num, VIRTIO_PCI_VRING_ALIGN, |
250 | vdev, info->queue, vp_notify, callback); | 251 | vdev, info->queue, vp_notify, callback, name); |
251 | if (!vq) { | 252 | if (!vq) { |
252 | err = -ENOMEM; | 253 | err = -ENOMEM; |
253 | goto out_activate_queue; | 254 | goto out_activate_queue; |
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); |