Commit 65280e61 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar
Browse files

x86: janitor CPA statistics patch



1) Remove __meminit from update_pages_count. It is used inside
split_pages()

2) Make the code depend on PROC_FS. Doing statistics for nothing is
useless and not adding useless code is nice to the Linux tiny folks.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent ce0c0e50
Loading
Loading
Loading
Loading
+26 −22
Original line number Diff line number Diff line
@@ -34,18 +34,40 @@ struct cpa_data {
	unsigned	force_split : 1;
};

#ifdef CONFIG_PROC_FS
static unsigned long direct_pages_count[PG_LEVEL_NUM];

void __meminit update_page_count(int level, unsigned long pages)
void update_page_count(int level, unsigned long pages)
{
#ifdef CONFIG_PROC_FS
	unsigned long flags;

	/* Protect against CPA */
	spin_lock_irqsave(&pgd_lock, flags);
	direct_pages_count[level] += pages;
	spin_unlock_irqrestore(&pgd_lock, flags);
}

static void split_page_count(int level)
{
	direct_pages_count[level]--;
	direct_pages_count[level - 1] += PTRS_PER_PTE;
}

int arch_report_meminfo(char *page)
{
	int n = sprintf(page, "DirectMap4k:  %8lu\n"
			"DirectMap2M:  %8lu\n",
			direct_pages_count[PG_LEVEL_4K],
			direct_pages_count[PG_LEVEL_2M]);
#ifdef CONFIG_X86_64
	n += sprintf(page + n, "DirectMap1G:  %8lu\n",
		     direct_pages_count[PG_LEVEL_1G]);
#endif
	return n;
}
#else
static inline void split_page_count(int level) { }
#endif

#ifdef CONFIG_X86_64

@@ -514,10 +536,8 @@ static int split_large_page(pte_t *kpte, unsigned long address)
		set_pte(&pbase[i], pfn_pte(pfn, ref_prot));

	if (address >= (unsigned long)__va(0) &&
		address < (unsigned long)__va(max_pfn_mapped << PAGE_SHIFT)) {
		direct_pages_count[level]--;
		direct_pages_count[level - 1] += PTRS_PER_PTE;
	}
		address < (unsigned long)__va(max_pfn_mapped << PAGE_SHIFT))
		split_page_count(level);

	/*
	 * Install the new, split up pagetable. Important details here:
@@ -1048,22 +1068,6 @@ bool kernel_page_present(struct page *page)

#endif /* CONFIG_DEBUG_PAGEALLOC */

#ifdef CONFIG_PROC_FS
int arch_report_meminfo(char *page)
{
	int n;
	n = sprintf(page, "DirectMap4k:  %8lu\n"
			  "DirectMap2M:  %8lu\n",
			direct_pages_count[PG_LEVEL_4K],
			direct_pages_count[PG_LEVEL_2M]);
#ifdef CONFIG_X86_64
	n += sprintf(page + n, "DirectMap1G:  %8lu\n",
			direct_pages_count[PG_LEVEL_1G]);
#endif
	return n;
}
#endif

/*
 * The testcases use internal knowledge of the implementation that shouldn't
 * be exposed to the rest of the kernel. Include these directly here.
+5 −1
Original line number Diff line number Diff line
@@ -372,7 +372,11 @@ enum {
	PG_LEVEL_NUM
};

void update_page_count(int level, unsigned long pages);
#ifdef CONFIG_PROC_FS
extern void update_page_count(int level, unsigned long pages);
#else
static inline void update_page_count(int level, unsigned long pages) { }
#endif

/*
 * Helper function that returns the kernel pagetable entry controlling