aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2018-12-03 12:03:45 -0500
committerIngo Molnar <mingo@kernel.org>2018-12-17 12:54:22 -0500
commitecc729f1f47142ad31741549f400b611435c1af7 (patch)
tree13490d84db27996d9cdc59cdc654b07cde21a2ea
parent02117e42db7470e59910088b2b0ee42d581d2651 (diff)
x86/mm/cpa: Add ARRAY and PAGES_ARRAY selftests
The current pageattr-test code only uses the regular range interface, add code that also tests the array and pages interface. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@surriel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tom.StDenis@amd.com Cc: dave.hansen@intel.com Link: http://lkml.kernel.org/r/20181203171043.162771364@infradead.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/mm/pageattr-test.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c
index 08f8f76a4852..b6b6468530f1 100644
--- a/arch/x86/mm/pageattr-test.c
+++ b/arch/x86/mm/pageattr-test.c
@@ -23,7 +23,8 @@
23static __read_mostly int print = 1; 23static __read_mostly int print = 1;
24 24
25enum { 25enum {
26 NTEST = 400, 26 NTEST = 3 * 100,
27 NPAGES = 100,
27#ifdef CONFIG_X86_64 28#ifdef CONFIG_X86_64
28 LPS = (1 << PMD_SHIFT), 29 LPS = (1 << PMD_SHIFT),
29#elif defined(CONFIG_X86_PAE) 30#elif defined(CONFIG_X86_PAE)
@@ -110,6 +111,9 @@ static int print_split(struct split_state *s)
110static unsigned long addr[NTEST]; 111static unsigned long addr[NTEST];
111static unsigned int len[NTEST]; 112static unsigned int len[NTEST];
112 113
114static struct page *pages[NPAGES];
115static unsigned long addrs[NPAGES];
116
113/* Change the global bit on random pages in the direct mapping */ 117/* Change the global bit on random pages in the direct mapping */
114static int pageattr_test(void) 118static int pageattr_test(void)
115{ 119{
@@ -137,7 +141,7 @@ static int pageattr_test(void)
137 unsigned long pfn = prandom_u32() % max_pfn_mapped; 141 unsigned long pfn = prandom_u32() % max_pfn_mapped;
138 142
139 addr[i] = (unsigned long)__va(pfn << PAGE_SHIFT); 143 addr[i] = (unsigned long)__va(pfn << PAGE_SHIFT);
140 len[i] = prandom_u32() % 100; 144 len[i] = prandom_u32() % NPAGES;
141 len[i] = min_t(unsigned long, len[i], max_pfn_mapped - pfn - 1); 145 len[i] = min_t(unsigned long, len[i], max_pfn_mapped - pfn - 1);
142 146
143 if (len[i] == 0) 147 if (len[i] == 0)
@@ -167,14 +171,30 @@ static int pageattr_test(void)
167 break; 171 break;
168 } 172 }
169 __set_bit(pfn + k, bm); 173 __set_bit(pfn + k, bm);
174 addrs[k] = addr[i] + k*PAGE_SIZE;
175 pages[k] = pfn_to_page(pfn + k);
170 } 176 }
171 if (!addr[i] || !pte || !k) { 177 if (!addr[i] || !pte || !k) {
172 addr[i] = 0; 178 addr[i] = 0;
173 continue; 179 continue;
174 } 180 }
175 181
176 test_addr = addr[i]; 182 switch (i % 3) {
177 err = change_page_attr_set(&test_addr, len[i], PAGE_CPA_TEST, 0); 183 case 0:
184 test_addr = addr[i];
185 err = change_page_attr_set(&test_addr, len[i], PAGE_CPA_TEST, 0);
186 break;
187
188 case 1:
189 err = change_page_attr_set(addrs, len[1], PAGE_CPA_TEST, 1);
190 break;
191
192 case 2:
193 err = cpa_set_pages_array(pages, len[i], PAGE_CPA_TEST);
194 break;
195 }
196
197
178 if (err < 0) { 198 if (err < 0) {
179 printk(KERN_ERR "CPA %d failed %d\n", i, err); 199 printk(KERN_ERR "CPA %d failed %d\n", i, err);
180 failed++; 200 failed++;