[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 10/10] XXX: balloon bitmap and sysrq key to dump bitmap
Maintain a bitmap of balloon pages to give intuitive overview of their locations. Write 'x' to /proc/sysrq-trigger to print out this bitmap. This patch is only for debugging purpose. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- drivers/xen/balloon.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 112190e..9af6206 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -54,6 +54,10 @@ #include <linux/memory.h> #include <linux/memory_hotplug.h> #include <linux/percpu-defs.h> +#include <linux/bitmap.h> +#include <linux/types.h> +#include <linux/bitops.h> +#include <linux/sysrq.h> #include <asm/page.h> #include <asm/pgalloc.h> @@ -102,6 +106,53 @@ static void scrub_page(struct page *page) #endif } +static unsigned long *balloon_bitmap; +static unsigned long balloon_bitmap_len; + +static inline void xen_balloon_bitmap_init(void) +{ + balloon_bitmap_len = BITS_TO_LONGS(max_pfn); + balloon_bitmap = kzalloc(balloon_bitmap_len * sizeof(unsigned long), + GFP_KERNEL); + /* XXX: this bitmap is only for debugging anyway... */ + BUG_ON(!balloon_bitmap); +} + +static inline void xen_balloon_bitmap_set(struct page *page) +{ + unsigned long pfn = page_to_pfn(page); + set_bit(pfn, balloon_bitmap); +} + +static inline void xen_balloon_bitmap_clear(struct page *page) +{ + unsigned long pfn = page_to_pfn(page); + clear_bit(pfn, balloon_bitmap); +} + +void xen_balloon_bitmap_dump(void) +{ + unsigned long i; + + for (i = 0; i < balloon_bitmap_len; i++) { + if ((i % 8) == 0) + printk("%8lu: ", i); + printk("%016lx ", balloon_bitmap[i]); + if (((i + 1) % 8) == 0) + printk("\n"); + } +} + +static void sysrq_handle_dump_xen_balloon_bitmap(int key) +{ + xen_balloon_bitmap_dump(); +} +static struct sysrq_key_op sysrq_xen_op = { + .handler = sysrq_handle_dump_xen_balloon_bitmap, + .help_msg = "dump-balloon-bitmap(x)", + .action_msg = "Dump balloon bitmap", +}; + static inline void update_balloon_stats(struct page *page, int count) { if (PageHighMem(page)) @@ -132,6 +183,7 @@ static void balloon_append(struct page *page, bool managed) { __balloon_append(page, managed); adjust_managed_page_count(page, -1); + xen_balloon_bitmap_set(page); } /* balloon_retrieve: rescue a page from Xen balloon driver, if it is @@ -449,6 +501,7 @@ static enum bp_state increase_reservation(unsigned long nr_pages) /* We only account for those pages that have been populated. */ update_balloon_stats(page, -1); adjust_managed_page_count(page, 1); + xen_balloon_bitmap_clear(page); } xen_balloon.balloon_stats.current_pages += rc; @@ -622,6 +675,7 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem) pages[pgno++] = page; update_balloon_stats(page, -1); adjust_managed_page_count(page, 1); + xen_balloon_bitmap_clear(page); } else { enum bp_state st; gfp_t gfp = highmem ? GFP_HIGHUSER : GFP_USER; @@ -818,6 +872,9 @@ static int xen_balloon_migratepage(struct address_space *mapping, rc = MIGRATEPAGE_BALLOON_SUCCESS; + xen_balloon_bitmap_clear(page); + xen_balloon_bitmap_set(newpage); + flush_tlb_all(); out: mutex_unlock(&xb->balloon_mutex); @@ -911,6 +968,9 @@ static int __init balloon_init(void) balloon_add_region(PFN_UP(xen_extra_mem[i].start), PFN_DOWN(xen_extra_mem[i].size)); + xen_balloon_bitmap_init(); + register_sysrq_key('x', &sysrq_xen_op); + return 0; out_free_xb_dev_info: -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |