lkml.org 
[lkml]   [2019]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC][Patch v9 6/6] KVM: Adding tracepoints for guest free page hinting
Date
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@redhat.com>
---
include/trace/events/kmem.h | 62 +++++++++++++++++++++++++++++++++++++
virt/kvm/page_hinting.c | 12 +++++++
2 files changed, 74 insertions(+)

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

+TRACE_EVENT(guest_free_page,
+ TP_PROTO(unsigned long pfn, unsigned int order),
+
+ TP_ARGS(pfn, order),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ __field(unsigned int, order)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = pfn;
+ __entry->order = order;
+ ),
+
+ TP_printk("pfn=%lu order=%d",
+ __entry->pfn,
+ __entry->order)
+);
+
+TRACE_EVENT(guest_isolated_page,
+ TP_PROTO(unsigned long pfn, unsigned int order),
+
+ TP_ARGS(pfn, order),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ __field(unsigned int, order)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = pfn;
+ __entry->order = order;
+ ),
+
+ TP_printk("pfn=%lu order=%u",
+ __entry->pfn,
+ __entry->order)
+);
+
+TRACE_EVENT(guest_captured_page,
+ TP_PROTO(unsigned long pfn, unsigned int order, int idx),
+
+ TP_ARGS(pfn, order, idx),
+
+ TP_STRUCT__entry(
+ __field(unsigned long, pfn)
+ __field(unsigned int, order)
+ __field(int, idx)
+ ),
+
+ TP_fast_assign(
+ __entry->pfn = pfn;
+ __entry->order = order;
+ __entry->idx = idx;
+ ),
+
+ TP_printk("pfn=%lu order=%u array_index=%d",
+ __entry->pfn,
+ __entry->order,
+ __entry->idx)
+);
#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 5980682e0b86..dc72f1947751 100644
--- a/virt/kvm/page_hinting.c
+++ b/virt/kvm/page_hinting.c
@@ -4,6 +4,7 @@
#include <linux/kvm_host.h>
#include <linux/kernel.h>
#include <linux/sort.h>
+#include <trace/events/kmem.h>

/*
* struct guest_free_pages- holds array of guest freed PFN's along with an
@@ -178,6 +179,8 @@ static void guest_free_page_hinting(void)

ret = __isolate_free_page(page, buddy_order);
if (ret) {
+ trace_guest_isolated_page(pfn,
+ buddy_order);
isolated_pages_obj[hyp_idx].pfn = pfn;
isolated_pages_obj[hyp_idx].order =
buddy_order;
@@ -198,6 +201,8 @@ static void guest_free_page_hinting(void)
unsigned long buddy_pfn =
page_to_pfn(buddy_page);

+ trace_guest_isolated_page(buddy_pfn,
+ buddy_order);
isolated_pages_obj[hyp_idx].pfn =
buddy_pfn;
isolated_pages_obj[hyp_idx].order =
@@ -255,9 +260,12 @@ void guest_free_page_enqueue(struct page *page, int order)
local_irq_save(flags);
hinting_obj = this_cpu_ptr(&free_pages_obj);
l_idx = hinting_obj->free_pages_idx;
+ trace_guest_free_page(page_to_pfn(page), order);
if (l_idx != MAX_FGPT_ENTRIES) {
if (PageBuddy(page) && page_private(page) >=
FREE_PAGE_HINTING_MIN_ORDER) {
+ trace_guest_captured_page(page_to_pfn(page), order,
+ l_idx);
hinting_obj->free_page_arr[l_idx] = page_to_pfn(page);
hinting_obj->free_pages_idx += 1;
} else {
@@ -268,7 +276,11 @@ void guest_free_page_enqueue(struct page *page, int order)
!if_exist(buddy_page)) {
unsigned long buddy_pfn =
page_to_pfn(buddy_page);
+ unsigned int buddy_order =
+ page_private(buddy_page);

+ trace_guest_captured_page(buddy_pfn,
+ buddy_order, l_idx);
hinting_obj->free_page_arr[l_idx] =
buddy_pfn;
hinting_obj->free_pages_idx += 1;
--
2.17.2
\
 
 \ /
  Last update: 2019-03-06 16:51    [W:0.229 / U:1.168 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site