From: Qiang Liu <[email protected]> Balloon inflate/deflate block in tell_host() for host buffer consumption. Host-side stalls are easily mistaken for guest allocation issues.
Add virtio_balloon_host_ack to record tell_host() wait time, virtqueue and PFN count, to split balloon latency between guest and host. Signed-off-by: Qiang Liu <[email protected]> --- drivers/virtio/virtio_balloon.c | 19 +++++++++++++++++-- include/trace/events/virtio_balloon.h | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 2d0b16383661..c4fdc6815b41 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -19,6 +19,7 @@ #include <linux/wait.h> #include <linux/mm.h> #include <linux/page_reporting.h> +#include <linux/ktime.h> #define CREATE_TRACE_POINTS #include <trace/events/virtio_balloon.h> @@ -197,8 +198,22 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq) return; virtqueue_kick(vq); - /* When host has read buffer, this completes via balloon_ack */ - wait_event(vb->acked, virtqueue_get_buf(vq, &len)); + /* + * When host has read buffer, this completes via balloon_ack. + * + * The latency is only measured when the tracepoint is enabled, so a + * disabled tracepoint adds no clock reads on this (hot) path. + */ + if (trace_virtio_balloon_host_ack_enabled()) { + ktime_t start = ktime_get(); + + wait_event(vb->acked, virtqueue_get_buf(vq, &len)); + trace_virtio_balloon_host_ack(vb->num_pfns, + vq->name, + ktime_to_ns(ktime_sub(ktime_get(), start))); + } else { + wait_event(vb->acked, virtqueue_get_buf(vq, &len)); + } } static int virtballoon_free_page_report(struct page_reporting_dev_info *pr_dev_info, diff --git a/include/trace/events/virtio_balloon.h b/include/trace/events/virtio_balloon.h index f733fc360d8b..559deb997e88 100644 --- a/include/trace/events/virtio_balloon.h +++ b/include/trace/events/virtio_balloon.h @@ -81,6 +81,28 @@ TRACE_EVENT(virtio_balloon_deflate, __entry->requested, __entry->deflated, __entry->num_pages) ); +TRACE_EVENT(virtio_balloon_host_ack, + + TP_PROTO(unsigned int num_pfns, const char *vq_name, s64 latency_ns), + + TP_ARGS(num_pfns, vq_name, latency_ns), + + TP_STRUCT__entry( + __field(unsigned int, num_pfns) + __string(vq_name, vq_name) + __field(s64, latency_ns) + ), + + TP_fast_assign( + __entry->num_pfns = num_pfns; + __assign_str(vq_name); + __entry->latency_ns = latency_ns; + ), + + TP_printk("vq=%s num_pfns=%u latency=%lldns", + __get_str(vq_name), __entry->num_pfns, __entry->latency_ns) +); + #endif /* _TRACE_VIRTIO_BALLOON_H */ /* This part must be outside protection */ -- 2.43.0 No virus found Checked by Hillstone Network AntiVirus
