Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 426e3e0a authored by Rusty Russell's avatar Rusty Russell
Browse files

virtio: clarify NO_NOTIFY flag usage



The other side (host) can set the NO_NOTIFY flag as an optimization,
to say "no need to kick me when you add things".  Make it clear that
this is advisory only; especially that we should always notify when
the ring is full.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 3309daaa
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -923,9 +923,9 @@ static void handle_output(int fd, unsigned long addr)
	/* Check each virtqueue. */
	for (i = devices.dev; i; i = i->next) {
		for (vq = i->vq; vq; vq = vq->next) {
			if (vq->config.pfn == addr/getpagesize()
			    && vq->handle_output) {
			if (vq->config.pfn == addr/getpagesize()) {
				verbose("Output to %s\n", vq->dev->name);
				if (vq->handle_output)
					vq->handle_output(fd, vq);
				return;
			}
@@ -1068,7 +1068,8 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
	 * virtqueue. */
	vq->handle_output = handle_output;

	/* Set the "Don't Notify Me" flag if we don't have a handler */
	/* As an optimization, set the advisory "Don't Notify Me" flag if we
	 * don't have a handler */
	if (!handle_output)
		vq->vring.used->flags = VRING_USED_F_NO_NOTIFY;
}
+2 −0
Original line number Diff line number Diff line
@@ -87,6 +87,8 @@ static int vring_add_buf(struct virtqueue *_vq,
	if (vq->num_free < out + in) {
		pr_debug("Can't add buf len %i - avail = %i\n",
			 out + in, vq->num_free);
		/* We notify *even if* VRING_USED_F_NO_NOTIFY is set here. */
		vq->notify(&vq->vq);
		END_USE(vq);
		return -ENOSPC;
	}
+6 −2
Original line number Diff line number Diff line
@@ -15,9 +15,13 @@
/* This marks a buffer as write-only (otherwise read-only). */
#define VRING_DESC_F_WRITE	2

/* This means don't notify other side when buffer added. */
/* The Host uses this in used->flags to advise the Guest: don't kick me when
 * you add a buffer.  It's unreliable, so it's simply an optimization.  Guest
 * will still kick if it's out of buffers. */
#define VRING_USED_F_NO_NOTIFY	1
/* This means don't interrupt guest when buffer consumed. */
/* The Guest uses this in avail->flags to advise the Host: don't interrupt me
 * when you consume a buffer.  It's unreliable, so it's simply an
 * optimization.  */
#define VRING_AVAIL_F_NO_INTERRUPT	1

/* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */