Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 284242
b: refs/heads/master
c: e93300b
h: refs/heads/master
v: v3
  • Loading branch information
Rusty Russell committed Jan 12, 2012
1 parent a04fe85 commit c1934ed
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ee7cd8981e15bcb365fc762afe3fc47b8242f630
refs/heads/master: e93300b1afc7cd4fe1e741ceaf06714d060e88b8
31 changes: 31 additions & 0 deletions trunk/drivers/virtio/virtio_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/hrtimer.h>

/* virtio guest is communicating with a virtual "device" that actually runs on
* a host processor. Memory barriers are used to control SMP effects. */
Expand Down Expand Up @@ -108,6 +109,10 @@ struct vring_virtqueue
#ifdef DEBUG
/* They're supposed to lock for us. */
unsigned int in_use;

/* Figure out if their kicks are too delayed. */
bool last_add_time_valid;
ktime_t last_add_time;
#endif

/* Tokens for callbacks. */
Expand Down Expand Up @@ -198,6 +203,19 @@ int virtqueue_add_buf(struct virtqueue *_vq,

BUG_ON(data == NULL);

#ifdef DEBUG
{
ktime_t now = ktime_get();

/* No kick or get, with .1 second between? Warn. */
if (vq->last_add_time_valid)
WARN_ON(ktime_to_ms(ktime_sub(now, vq->last_add_time))
> 100);
vq->last_add_time = now;
vq->last_add_time_valid = true;
}
#endif

/* If the host supports indirect descriptor tables, and we have multiple
* buffers, then go indirect. FIXME: tune this threshold */
if (vq->indirect && (out + in) > 1 && vq->num_free) {
Expand Down Expand Up @@ -298,6 +316,14 @@ bool virtqueue_kick_prepare(struct virtqueue *_vq)
new = vq->vring.avail->idx;
vq->num_added = 0;

#ifdef DEBUG
if (vq->last_add_time_valid) {
WARN_ON(ktime_to_ms(ktime_sub(ktime_get(),
vq->last_add_time)) > 100);
}
vq->last_add_time_valid = false;
#endif

if (vq->event) {
needs_kick = vring_need_event(vring_avail_event(&vq->vring),
new, old);
Expand Down Expand Up @@ -435,6 +461,10 @@ void *virtqueue_get_buf(struct virtqueue *_vq, unsigned int *len)
virtio_mb(vq);
}

#ifdef DEBUG
vq->last_add_time_valid = false;
#endif

END_USE(vq);
return ret;
}
Expand Down Expand Up @@ -620,6 +650,7 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
list_add_tail(&vq->vq.list, &vdev->vqs);
#ifdef DEBUG
vq->in_use = false;
vq->last_add_time_valid = false;
#endif

vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC);
Expand Down

0 comments on commit c1934ed

Please sign in to comment.