[RFC][Patch v8 7/7] KVM: Adding tracepoints for guest page hinting

From: Nitesh Narayan Lal
Date: Mon Feb 04 2019 - 15:20:09 EST


This patch enables to track the pages freed by the guest and
the pages isolated by the page hinting code through kernel
tracepoints.

Signed-off-by: Nitesh Narayan Lal <nitesh@xxxxxxxxxx>
---
include/trace/events/kmem.h | 40 +++++++++++++++++++++++++++++++++++++
virt/kvm/page_hinting.c | 10 ++++++++++
2 files changed, 50 insertions(+)

diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index eb57e3037deb..69f6da9ff939 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -315,6 +315,46 @@ TRACE_EVENT(mm_page_alloc_extfrag,
__entry->change_ownership)
);

+TRACE_EVENT(guest_free_page,
+ TP_PROTO(struct page *page, unsigned int order),
+
+ TP_ARGS(page, order),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ __field(unsigned int, order)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = page_to_pfn(page);
+ __entry->order = order;
+ ),
+
+ TP_printk("page=%p pfn=%lu number of pages=%d",
+ pfn_to_page(__entry->pfn),
+ __entry->pfn,
+ (1 << __entry->order))
+);
+
+TRACE_EVENT(guest_isolated_pfn,
+ TP_PROTO(unsigned long pfn, unsigned int pages),
+
+ TP_ARGS(pfn, pages),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ __field(unsigned int, pages)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = pfn;
+ __entry->pages = pages;
+ ),
+
+ TP_printk("pfn=%lu number of pages=%u",
+ __entry->pfn,
+ __entry->pages)
+);
#endif /* _TRACE_KMEM_H */

/* This part must be outside protection */
diff --git a/virt/kvm/page_hinting.c b/virt/kvm/page_hinting.c
index 315099fcda43..395d94e52c74 100644
--- a/virt/kvm/page_hinting.c
+++ b/virt/kvm/page_hinting.c
@@ -4,6 +4,7 @@
#include <linux/kvm_host.h>
#include <linux/sort.h>
#include <linux/kernel.h>
+#include <trace/events/kmem.h>

/*
* struct kvm_free_pages - Tracks the pages which are freed by the guest.
@@ -140,7 +141,11 @@ static void hinting_fn(unsigned int cpu)
int l_idx = page_hinting_obj->hyp_idx;
struct hypervisor_pages *l_obj =
page_hinting_obj->hypervisor_pagelist;
+ unsigned int buddy_pages =
+ 1 << buddy_order;

+ trace_guest_isolated_pfn(pfn,
+ buddy_pages);
l_obj[l_idx].pfn = pfn;
l_obj[l_idx].order = buddy_order;
page_hinting_obj->hyp_idx += 1;
@@ -163,7 +168,11 @@ static void hinting_fn(unsigned int cpu)
page_hinting_obj->hypervisor_pagelist;
unsigned long buddy_pfn =
page_to_pfn(buddy_page);
+ unsigned int buddy_pages =
+ 1 << buddy_order;

+ trace_guest_isolated_pfn(pfn,
+ buddy_pages);
l_obj[l_idx].pfn = buddy_pfn;
l_obj[l_idx].order = buddy_order;
page_hinting_obj->hyp_idx += 1;
@@ -294,6 +303,7 @@ void guest_free_page(struct page *page, int order)
local_irq_save(flags);
if (page_hinting_obj->kvm_pt_idx != MAX_FGPT_ENTRIES) {
disable_page_poisoning();
+ trace_guest_free_page(page, order);
page_hinting_obj->kvm_pt[page_hinting_obj->kvm_pt_idx].pfn =
page_to_pfn(page);
page_hinting_obj->kvm_pt[page_hinting_obj->kvm_pt_idx].zonenum =
--
2.17.2