mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
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: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
3309daaad7
commit
426e3e0af5
@ -923,10 +923,10 @@ static void handle_output(int fd, unsigned long addr)
|
|||||||
/* Check each virtqueue. */
|
/* Check each virtqueue. */
|
||||||
for (i = devices.dev; i; i = i->next) {
|
for (i = devices.dev; i; i = i->next) {
|
||||||
for (vq = i->vq; vq; vq = vq->next) {
|
for (vq = i->vq; vq; vq = vq->next) {
|
||||||
if (vq->config.pfn == addr/getpagesize()
|
if (vq->config.pfn == addr/getpagesize()) {
|
||||||
&& vq->handle_output) {
|
|
||||||
verbose("Output to %s\n", vq->dev->name);
|
verbose("Output to %s\n", vq->dev->name);
|
||||||
vq->handle_output(fd, vq);
|
if (vq->handle_output)
|
||||||
|
vq->handle_output(fd, vq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1068,7 +1068,8 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
|||||||
* virtqueue. */
|
* virtqueue. */
|
||||||
vq->handle_output = handle_output;
|
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)
|
if (!handle_output)
|
||||||
vq->vring.used->flags = VRING_USED_F_NO_NOTIFY;
|
vq->vring.used->flags = VRING_USED_F_NO_NOTIFY;
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,8 @@ static int vring_add_buf(struct virtqueue *_vq,
|
|||||||
if (vq->num_free < out + in) {
|
if (vq->num_free < out + in) {
|
||||||
pr_debug("Can't add buf len %i - avail = %i\n",
|
pr_debug("Can't add buf len %i - avail = %i\n",
|
||||||
out + in, vq->num_free);
|
out + in, vq->num_free);
|
||||||
|
/* We notify *even if* VRING_USED_F_NO_NOTIFY is set here. */
|
||||||
|
vq->notify(&vq->vq);
|
||||||
END_USE(vq);
|
END_USE(vq);
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,13 @@
|
|||||||
/* This marks a buffer as write-only (otherwise read-only). */
|
/* This marks a buffer as write-only (otherwise read-only). */
|
||||||
#define VRING_DESC_F_WRITE 2
|
#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
|
#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
|
#define VRING_AVAIL_F_NO_INTERRUPT 1
|
||||||
|
|
||||||
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
|
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
|
||||||
|
Loading…
Reference in New Issue
Block a user