|
@@ -23,21 +23,30 @@
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
/* For development, we want to crash whenever the ring is screwed. */
|
|
|
-#define BAD_RING(_vq, fmt...) \
|
|
|
- do { dev_err(&(_vq)->vq.vdev->dev, fmt); BUG(); } while(0)
|
|
|
+#define BAD_RING(_vq, fmt, args...) \
|
|
|
+ do { \
|
|
|
+ dev_err(&(_vq)->vq.vdev->dev, \
|
|
|
+ "%s:"fmt, (_vq)->vq.name, ##args); \
|
|
|
+ BUG(); \
|
|
|
+ } while (0)
|
|
|
/* Caller is supposed to guarantee no reentry. */
|
|
|
#define START_USE(_vq) \
|
|
|
do { \
|
|
|
if ((_vq)->in_use) \
|
|
|
- panic("in_use = %i\n", (_vq)->in_use); \
|
|
|
+ panic("%s:in_use = %i\n", \
|
|
|
+ (_vq)->vq.name, (_vq)->in_use); \
|
|
|
(_vq)->in_use = __LINE__; \
|
|
|
mb(); \
|
|
|
- } while(0)
|
|
|
+ } while (0)
|
|
|
#define END_USE(_vq) \
|
|
|
do { BUG_ON(!(_vq)->in_use); (_vq)->in_use = 0; mb(); } while(0)
|
|
|
#else
|
|
|
-#define BAD_RING(_vq, fmt...) \
|
|
|
- do { dev_err(&_vq->vq.vdev->dev, fmt); (_vq)->broken = true; } while(0)
|
|
|
+#define BAD_RING(_vq, fmt, args...) \
|
|
|
+ do { \
|
|
|
+ dev_err(&_vq->vq.vdev->dev, \
|
|
|
+ "%s:"fmt, (_vq)->vq.name, ##args); \
|
|
|
+ (_vq)->broken = true; \
|
|
|
+ } while (0)
|
|
|
#define START_USE(vq)
|
|
|
#define END_USE(vq)
|
|
|
#endif
|
|
@@ -284,7 +293,8 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
|
|
|
struct virtio_device *vdev,
|
|
|
void *pages,
|
|
|
void (*notify)(struct virtqueue *),
|
|
|
- void (*callback)(struct virtqueue *))
|
|
|
+ void (*callback)(struct virtqueue *),
|
|
|
+ const char *name)
|
|
|
{
|
|
|
struct vring_virtqueue *vq;
|
|
|
unsigned int i;
|
|
@@ -303,10 +313,12 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
|
|
|
vq->vq.callback = callback;
|
|
|
vq->vq.vdev = vdev;
|
|
|
vq->vq.vq_ops = &vring_vq_ops;
|
|
|
+ vq->vq.name = name;
|
|
|
vq->notify = notify;
|
|
|
vq->broken = false;
|
|
|
vq->last_used_idx = 0;
|
|
|
vq->num_added = 0;
|
|
|
+ list_add_tail(&vq->vq.list, &vdev->vqs);
|
|
|
#ifdef DEBUG
|
|
|
vq->in_use = false;
|
|
|
#endif
|
|
@@ -327,6 +339,7 @@ EXPORT_SYMBOL_GPL(vring_new_virtqueue);
|
|
|
|
|
|
void vring_del_virtqueue(struct virtqueue *vq)
|
|
|
{
|
|
|
+ list_del(&vq->list);
|
|
|
kfree(to_vvq(vq));
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(vring_del_virtqueue);
|