vhost: add device op when notification to guest is sent

This patch adds an operation callback which gets called every time
the library is waking up the guest trough an eventfd_write() call.

This can be used by 3rd party application, like OVS, to track the
number of times interrupts where generated. This might be of
interest to find out system-call were called in the fast path.

Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Eelco Chaudron 2019-08-28 10:49:39 -04:00 committed by Ferruh Yigit
parent 52b5a707e6
commit 039253166a
2 changed files with 21 additions and 4 deletions

View File

@ -172,7 +172,15 @@ struct vhost_device_ops {
int (*new_connection)(int vid);
void (*destroy_connection)(int vid);
void *reserved[2]; /**< Reserved for future extension */
/**
* This callback gets called each time a guest gets notified
* about waiting packets. This is the interrupt handling trough
* the eventfd_write(callfd), which can be used for counting these
* "slow" syscalls.
*/
void (*guest_notified)(int vid);
void *reserved[1]; /**< Reserved for future extension */
};
/**

View File

@ -543,13 +543,19 @@ vhost_vring_call_split(struct virtio_net *dev, struct vhost_virtqueue *vq)
if ((vhost_need_event(vhost_used_event(vq), new, old) &&
(vq->callfd >= 0)) ||
unlikely(!signalled_used_valid))
unlikely(!signalled_used_valid)) {
eventfd_write(vq->callfd, (eventfd_t) 1);
if (dev->notify_ops->guest_notified)
dev->notify_ops->guest_notified(dev->vid);
}
} else {
/* Kick the guest if necessary. */
if (!(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
&& (vq->callfd >= 0))
&& (vq->callfd >= 0)) {
eventfd_write(vq->callfd, (eventfd_t)1);
if (dev->notify_ops->guest_notified)
dev->notify_ops->guest_notified(dev->vid);
}
}
}
@ -600,8 +606,11 @@ vhost_vring_call_packed(struct virtio_net *dev, struct vhost_virtqueue *vq)
if (vhost_need_event(off, new, old))
kick = true;
kick:
if (kick)
if (kick) {
eventfd_write(vq->callfd, (eventfd_t)1);
if (dev->notify_ops->guest_notified)
dev->notify_ops->guest_notified(dev->vid);
}
}
static __rte_always_inline void