diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2018-12-03 12:03:45 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2018-12-17 12:54:22 -0500 |
| commit | ecc729f1f47142ad31741549f400b611435c1af7 (patch) | |
| tree | 13490d84db27996d9cdc59cdc654b07cde21a2ea | |
| parent | 02117e42db7470e59910088b2b0ee42d581d2651 (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.c | 28 |
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 @@ | |||
| 23 | static __read_mostly int print = 1; | 23 | static __read_mostly int print = 1; |
| 24 | 24 | ||
| 25 | enum { | 25 | enum { |
| 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) | |||
| 110 | static unsigned long addr[NTEST]; | 111 | static unsigned long addr[NTEST]; |
| 111 | static unsigned int len[NTEST]; | 112 | static unsigned int len[NTEST]; |
| 112 | 113 | ||
| 114 | static struct page *pages[NPAGES]; | ||
| 115 | static 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 */ |
| 114 | static int pageattr_test(void) | 118 | static 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++; |
