Skip to content

Commit ac51667

Browse files
committed
Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 mm updates from Ingo Molnar: - Make cpumask_of_node() more robust against invalid node IDs - Simplify and speed up load_mm_cr4() - Unexport and remove various unused set_memory_*() APIs - Misc cleanups * 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/mm: Fix cpumask_of_node() error condition x86/mm: Remove the unused set_memory_wt() function x86/mm: Remove set_pages_x() and set_pages_nx() x86/mm: Remove the unused set_memory_array_*() functions x86/mm: Unexport set_memory_x() and set_memory_nx() x86/fixmap: Cleanup outdated comments x86/kconfig: Remove X86_DIRECT_GBPAGES dependency on !DEBUG_PAGEALLOC x86/mm: Avoid redundant interrupt disable in load_mm_cr4()
2 parents e0d60a1 + bc04a04 commit ac51667

File tree

11 files changed

+37
-140
lines changed

11 files changed

+37
-140
lines changed

arch/x86/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1503,7 +1503,7 @@ config X86_5LEVEL
15031503

15041504
config X86_DIRECT_GBPAGES
15051505
def_bool y
1506-
depends on X86_64 && !DEBUG_PAGEALLOC
1506+
depends on X86_64
15071507
---help---
15081508
Certain kernel features effectively disable kernel
15091509
linear 1 GB mappings (even if the CPU otherwise

arch/x86/events/core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2108,7 +2108,7 @@ static int x86_pmu_event_init(struct perf_event *event)
21082108

21092109
static void refresh_pce(void *ignored)
21102110
{
2111-
load_mm_cr4(this_cpu_read(cpu_tlbstate.loaded_mm));
2111+
load_mm_cr4_irqsoff(this_cpu_read(cpu_tlbstate.loaded_mm));
21122112
}
21132113

21142114
static void x86_pmu_event_mapped(struct perf_event *event, struct mm_struct *mm)

arch/x86/include/asm/fixmap.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@
4242
* Because of this, FIXADDR_TOP x86 integration was left as later work.
4343
*/
4444
#ifdef CONFIG_X86_32
45-
/* used by vmalloc.c, vsyscall.lds.S.
46-
*
45+
/*
4746
* Leave one empty page between vmalloc'ed areas and
4847
* the start of the fixmap.
4948
*/
@@ -120,7 +119,7 @@ enum fixed_addresses {
120119
* before ioremap() is functional.
121120
*
122121
* If necessary we round it up to the next 512 pages boundary so
123-
* that we can have a single pgd entry and a single pte table:
122+
* that we can have a single pmd entry and a single pte table:
124123
*/
125124
#define NR_FIX_BTMAPS 64
126125
#define FIX_BTMAPS_SLOTS 8

arch/x86/include/asm/mmu_context.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ static inline void paravirt_activate_mm(struct mm_struct *prev,
2828

2929
DECLARE_STATIC_KEY_FALSE(rdpmc_always_available_key);
3030

31-
static inline void load_mm_cr4(struct mm_struct *mm)
31+
static inline void load_mm_cr4_irqsoff(struct mm_struct *mm)
3232
{
3333
if (static_branch_unlikely(&rdpmc_always_available_key) ||
3434
atomic_read(&mm->context.perf_rdpmc_allowed))
35-
cr4_set_bits(X86_CR4_PCE);
35+
cr4_set_bits_irqsoff(X86_CR4_PCE);
3636
else
37-
cr4_clear_bits(X86_CR4_PCE);
37+
cr4_clear_bits_irqsoff(X86_CR4_PCE);
3838
}
3939
#else
40-
static inline void load_mm_cr4(struct mm_struct *mm) {}
40+
static inline void load_mm_cr4_irqsoff(struct mm_struct *mm) {}
4141
#endif
4242

4343
#ifdef CONFIG_MODIFY_LDT_SYSCALL

arch/x86/include/asm/set_memory.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,13 @@ int _set_memory_wt(unsigned long addr, int numpages);
4040
int _set_memory_wb(unsigned long addr, int numpages);
4141
int set_memory_uc(unsigned long addr, int numpages);
4242
int set_memory_wc(unsigned long addr, int numpages);
43-
int set_memory_wt(unsigned long addr, int numpages);
4443
int set_memory_wb(unsigned long addr, int numpages);
4544
int set_memory_np(unsigned long addr, int numpages);
4645
int set_memory_4k(unsigned long addr, int numpages);
4746
int set_memory_encrypted(unsigned long addr, int numpages);
4847
int set_memory_decrypted(unsigned long addr, int numpages);
4948
int set_memory_np_noalias(unsigned long addr, int numpages);
5049

51-
int set_memory_array_uc(unsigned long *addr, int addrinarray);
52-
int set_memory_array_wc(unsigned long *addr, int addrinarray);
53-
int set_memory_array_wt(unsigned long *addr, int addrinarray);
54-
int set_memory_array_wb(unsigned long *addr, int addrinarray);
55-
5650
int set_pages_array_uc(struct page **pages, int addrinarray);
5751
int set_pages_array_wc(struct page **pages, int addrinarray);
5852
int set_pages_array_wt(struct page **pages, int addrinarray);
@@ -80,8 +74,6 @@ int set_pages_array_wb(struct page **pages, int addrinarray);
8074

8175
int set_pages_uc(struct page *page, int numpages);
8276
int set_pages_wb(struct page *page, int numpages);
83-
int set_pages_x(struct page *page, int numpages);
84-
int set_pages_nx(struct page *page, int numpages);
8577
int set_pages_ro(struct page *page, int numpages);
8678
int set_pages_rw(struct page *page, int numpages);
8779

arch/x86/include/asm/tlbflush.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -290,26 +290,42 @@ static inline void __cr4_set(unsigned long cr4)
290290
}
291291

292292
/* Set in this cpu's CR4. */
293-
static inline void cr4_set_bits(unsigned long mask)
293+
static inline void cr4_set_bits_irqsoff(unsigned long mask)
294294
{
295-
unsigned long cr4, flags;
295+
unsigned long cr4;
296296

297-
local_irq_save(flags);
298297
cr4 = this_cpu_read(cpu_tlbstate.cr4);
299298
if ((cr4 | mask) != cr4)
300299
__cr4_set(cr4 | mask);
301-
local_irq_restore(flags);
302300
}
303301

304302
/* Clear in this cpu's CR4. */
305-
static inline void cr4_clear_bits(unsigned long mask)
303+
static inline void cr4_clear_bits_irqsoff(unsigned long mask)
306304
{
307-
unsigned long cr4, flags;
305+
unsigned long cr4;
308306

309-
local_irq_save(flags);
310307
cr4 = this_cpu_read(cpu_tlbstate.cr4);
311308
if ((cr4 & ~mask) != cr4)
312309
__cr4_set(cr4 & ~mask);
310+
}
311+
312+
/* Set in this cpu's CR4. */
313+
static inline void cr4_set_bits(unsigned long mask)
314+
{
315+
unsigned long flags;
316+
317+
local_irq_save(flags);
318+
cr4_set_bits_irqsoff(mask);
319+
local_irq_restore(flags);
320+
}
321+
322+
/* Clear in this cpu's CR4. */
323+
static inline void cr4_clear_bits(unsigned long mask)
324+
{
325+
unsigned long flags;
326+
327+
local_irq_save(flags);
328+
cr4_clear_bits_irqsoff(mask);
313329
local_irq_restore(flags);
314330
}
315331

arch/x86/kernel/machine_kexec_32.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ int machine_kexec_prepare(struct kimage *image)
148148
{
149149
int error;
150150

151-
set_pages_x(image->control_code_page, 1);
151+
set_memory_x((unsigned long)page_address(image->control_code_page), 1);
152152
error = machine_kexec_alloc_page_tables(image);
153153
if (error)
154154
return error;
@@ -162,7 +162,7 @@ int machine_kexec_prepare(struct kimage *image)
162162
*/
163163
void machine_kexec_cleanup(struct kimage *image)
164164
{
165-
set_pages_nx(image->control_code_page, 1);
165+
set_memory_nx((unsigned long)page_address(image->control_code_page), 1);
166166
machine_kexec_free_page_tables(image);
167167
}
168168

arch/x86/mm/init_32.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ static void mark_nxdata_nx(void)
916916

917917
if (__supported_pte_mask & _PAGE_NX)
918918
printk(KERN_INFO "NX-protecting the kernel data: %luk\n", size >> 10);
919-
set_pages_nx(virt_to_page(start), size >> PAGE_SHIFT);
919+
set_memory_nx(start, size >> PAGE_SHIFT);
920920
}
921921

922922
void mark_rodata_ro(void)

arch/x86/mm/numa.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -861,9 +861,9 @@ void numa_remove_cpu(int cpu)
861861
*/
862862
const struct cpumask *cpumask_of_node(int node)
863863
{
864-
if (node >= nr_node_ids) {
864+
if ((unsigned)node >= nr_node_ids) {
865865
printk(KERN_WARNING
866-
"cpumask_of_node(%d): node > nr_node_ids(%u)\n",
866+
"cpumask_of_node(%d): (unsigned)node >= nr_node_ids(%u)\n",
867867
node, nr_node_ids);
868868
dump_stack();
869869
return cpu_none_mask;

arch/x86/mm/pageattr.c

Lines changed: 0 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,63 +1819,6 @@ int set_memory_uc(unsigned long addr, int numpages)
18191819
}
18201820
EXPORT_SYMBOL(set_memory_uc);
18211821

1822-
static int _set_memory_array(unsigned long *addr, int numpages,
1823-
enum page_cache_mode new_type)
1824-
{
1825-
enum page_cache_mode set_type;
1826-
int i, j;
1827-
int ret;
1828-
1829-
for (i = 0; i < numpages; i++) {
1830-
ret = reserve_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE,
1831-
new_type, NULL);
1832-
if (ret)
1833-
goto out_free;
1834-
}
1835-
1836-
/* If WC, set to UC- first and then WC */
1837-
set_type = (new_type == _PAGE_CACHE_MODE_WC) ?
1838-
_PAGE_CACHE_MODE_UC_MINUS : new_type;
1839-
1840-
ret = change_page_attr_set(addr, numpages,
1841-
cachemode2pgprot(set_type), 1);
1842-
1843-
if (!ret && new_type == _PAGE_CACHE_MODE_WC)
1844-
ret = change_page_attr_set_clr(addr, numpages,
1845-
cachemode2pgprot(
1846-
_PAGE_CACHE_MODE_WC),
1847-
__pgprot(_PAGE_CACHE_MASK),
1848-
0, CPA_ARRAY, NULL);
1849-
if (ret)
1850-
goto out_free;
1851-
1852-
return 0;
1853-
1854-
out_free:
1855-
for (j = 0; j < i; j++)
1856-
free_memtype(__pa(addr[j]), __pa(addr[j]) + PAGE_SIZE);
1857-
1858-
return ret;
1859-
}
1860-
1861-
int set_memory_array_uc(unsigned long *addr, int numpages)
1862-
{
1863-
return _set_memory_array(addr, numpages, _PAGE_CACHE_MODE_UC_MINUS);
1864-
}
1865-
EXPORT_SYMBOL(set_memory_array_uc);
1866-
1867-
int set_memory_array_wc(unsigned long *addr, int numpages)
1868-
{
1869-
return _set_memory_array(addr, numpages, _PAGE_CACHE_MODE_WC);
1870-
}
1871-
EXPORT_SYMBOL(set_memory_array_wc);
1872-
1873-
int set_memory_array_wt(unsigned long *addr, int numpages)
1874-
{
1875-
return _set_memory_array(addr, numpages, _PAGE_CACHE_MODE_WT);
1876-
}
1877-
EXPORT_SYMBOL_GPL(set_memory_array_wt);
1878-
18791822
int _set_memory_wc(unsigned long addr, int numpages)
18801823
{
18811824
int ret;
@@ -1915,23 +1858,6 @@ int _set_memory_wt(unsigned long addr, int numpages)
19151858
cachemode2pgprot(_PAGE_CACHE_MODE_WT), 0);
19161859
}
19171860

1918-
int set_memory_wt(unsigned long addr, int numpages)
1919-
{
1920-
int ret;
1921-
1922-
ret = reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE,
1923-
_PAGE_CACHE_MODE_WT, NULL);
1924-
if (ret)
1925-
return ret;
1926-
1927-
ret = _set_memory_wt(addr, numpages);
1928-
if (ret)
1929-
free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
1930-
1931-
return ret;
1932-
}
1933-
EXPORT_SYMBOL_GPL(set_memory_wt);
1934-
19351861
int _set_memory_wb(unsigned long addr, int numpages)
19361862
{
19371863
/* WB cache mode is hard wired to all cache attribute bits being 0 */
@@ -1952,32 +1878,13 @@ int set_memory_wb(unsigned long addr, int numpages)
19521878
}
19531879
EXPORT_SYMBOL(set_memory_wb);
19541880

1955-
int set_memory_array_wb(unsigned long *addr, int numpages)
1956-
{
1957-
int i;
1958-
int ret;
1959-
1960-
/* WB cache mode is hard wired to all cache attribute bits being 0 */
1961-
ret = change_page_attr_clear(addr, numpages,
1962-
__pgprot(_PAGE_CACHE_MASK), 1);
1963-
if (ret)
1964-
return ret;
1965-
1966-
for (i = 0; i < numpages; i++)
1967-
free_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE);
1968-
1969-
return 0;
1970-
}
1971-
EXPORT_SYMBOL(set_memory_array_wb);
1972-
19731881
int set_memory_x(unsigned long addr, int numpages)
19741882
{
19751883
if (!(__supported_pte_mask & _PAGE_NX))
19761884
return 0;
19771885

19781886
return change_page_attr_clear(&addr, numpages, __pgprot(_PAGE_NX), 0);
19791887
}
1980-
EXPORT_SYMBOL(set_memory_x);
19811888

19821889
int set_memory_nx(unsigned long addr, int numpages)
19831890
{
@@ -1986,7 +1893,6 @@ int set_memory_nx(unsigned long addr, int numpages)
19861893

19871894
return change_page_attr_set(&addr, numpages, __pgprot(_PAGE_NX), 0);
19881895
}
1989-
EXPORT_SYMBOL(set_memory_nx);
19901896

19911897
int set_memory_ro(unsigned long addr, int numpages)
19921898
{
@@ -2190,22 +2096,6 @@ int set_pages_array_wb(struct page **pages, int numpages)
21902096
}
21912097
EXPORT_SYMBOL(set_pages_array_wb);
21922098

2193-
int set_pages_x(struct page *page, int numpages)
2194-
{
2195-
unsigned long addr = (unsigned long)page_address(page);
2196-
2197-
return set_memory_x(addr, numpages);
2198-
}
2199-
EXPORT_SYMBOL(set_pages_x);
2200-
2201-
int set_pages_nx(struct page *page, int numpages)
2202-
{
2203-
unsigned long addr = (unsigned long)page_address(page);
2204-
2205-
return set_memory_nx(addr, numpages);
2206-
}
2207-
EXPORT_SYMBOL(set_pages_nx);
2208-
22092099
int set_pages_ro(struct page *page, int numpages)
22102100
{
22112101
unsigned long addr = (unsigned long)page_address(page);

arch/x86/mm/tlb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
440440
this_cpu_write(cpu_tlbstate.loaded_mm_asid, new_asid);
441441

442442
if (next != real_prev) {
443-
load_mm_cr4(next);
443+
load_mm_cr4_irqsoff(next);
444444
switch_ldt(real_prev, next);
445445
}
446446
}

0 commit comments

Comments
 (0)