Commit f1c1174f authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/mm: use new mm defines instead of magic values

Reviewed-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent c67da7c7
...@@ -191,7 +191,7 @@ struct arch_elf_state { ...@@ -191,7 +191,7 @@ struct arch_elf_state {
} while (0) } while (0)
#define CORE_DUMP_USE_REGSET #define CORE_DUMP_USE_REGSET
#define ELF_EXEC_PAGESIZE 4096 #define ELF_EXEC_PAGESIZE PAGE_SIZE
/* /*
* This is the base location for PIE (ET_DYN with INTERP) loads. On * This is the base location for PIE (ET_DYN with INTERP) loads. On
......
...@@ -81,7 +81,7 @@ struct ipl_parameter_block { ...@@ -81,7 +81,7 @@ struct ipl_parameter_block {
struct ipl_block_fcp fcp; struct ipl_block_fcp fcp;
struct ipl_block_ccw ccw; struct ipl_block_ccw ccw;
} ipl_info; } ipl_info;
} __attribute__((packed,aligned(4096))); } __packed __aligned(PAGE_SIZE);
/* /*
* IPL validity flags * IPL validity flags
......
...@@ -33,7 +33,7 @@ static inline int init_new_context(struct task_struct *tsk, ...@@ -33,7 +33,7 @@ static inline int init_new_context(struct task_struct *tsk,
mm->context.use_cmma = 0; mm->context.use_cmma = 0;
#endif #endif
switch (mm->context.asce_limit) { switch (mm->context.asce_limit) {
case 1UL << 42: case _REGION2_SIZE:
/* /*
* forked 3-level task, fall through to set new asce with new * forked 3-level task, fall through to set new asce with new
* mm->pgd * mm->pgd
...@@ -44,12 +44,12 @@ static inline int init_new_context(struct task_struct *tsk, ...@@ -44,12 +44,12 @@ static inline int init_new_context(struct task_struct *tsk,
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
_ASCE_USER_BITS | _ASCE_TYPE_REGION3; _ASCE_USER_BITS | _ASCE_TYPE_REGION3;
break; break;
case 1UL << 53: case _REGION1_SIZE:
/* forked 4-level task, set new asce with new mm->pgd */ /* forked 4-level task, set new asce with new mm->pgd */
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
_ASCE_USER_BITS | _ASCE_TYPE_REGION2; _ASCE_USER_BITS | _ASCE_TYPE_REGION2;
break; break;
case 1UL << 31: case _REGION3_SIZE:
/* forked 2-level compat task, set new asce with new mm->pgd */ /* forked 2-level compat task, set new asce with new mm->pgd */
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
_ASCE_USER_BITS | _ASCE_TYPE_SEGMENT; _ASCE_USER_BITS | _ASCE_TYPE_SEGMENT;
......
...@@ -44,16 +44,16 @@ static inline void clear_table(unsigned long *s, unsigned long val, size_t n) ...@@ -44,16 +44,16 @@ static inline void clear_table(unsigned long *s, unsigned long val, size_t n)
static inline void crst_table_init(unsigned long *crst, unsigned long entry) static inline void crst_table_init(unsigned long *crst, unsigned long entry)
{ {
clear_table(crst, entry, sizeof(unsigned long)*2048); clear_table(crst, entry, _CRST_TABLE_SIZE);
} }
static inline unsigned long pgd_entry_type(struct mm_struct *mm) static inline unsigned long pgd_entry_type(struct mm_struct *mm)
{ {
if (mm->context.asce_limit <= (1UL << 31)) if (mm->context.asce_limit <= _REGION3_SIZE)
return _SEGMENT_ENTRY_EMPTY; return _SEGMENT_ENTRY_EMPTY;
if (mm->context.asce_limit <= (1UL << 42)) if (mm->context.asce_limit <= _REGION2_SIZE)
return _REGION3_ENTRY_EMPTY; return _REGION3_ENTRY_EMPTY;
if (mm->context.asce_limit <= (1UL << 53)) if (mm->context.asce_limit <= _REGION1_SIZE)
return _REGION2_ENTRY_EMPTY; return _REGION2_ENTRY_EMPTY;
return _REGION1_ENTRY_EMPTY; return _REGION1_ENTRY_EMPTY;
} }
...@@ -121,7 +121,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) ...@@ -121,7 +121,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
if (!table) if (!table)
return NULL; return NULL;
if (mm->context.asce_limit == (1UL << 31)) { if (mm->context.asce_limit == _REGION3_SIZE) {
/* Forking a compat process with 2 page table levels */ /* Forking a compat process with 2 page table levels */
if (!pgtable_pmd_page_ctor(virt_to_page(table))) { if (!pgtable_pmd_page_ctor(virt_to_page(table))) {
crst_table_free(mm, table); crst_table_free(mm, table);
...@@ -133,7 +133,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) ...@@ -133,7 +133,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{ {
if (mm->context.asce_limit == (1UL << 31)) if (mm->context.asce_limit == _REGION3_SIZE)
pgtable_pmd_page_dtor(virt_to_page(pgd)); pgtable_pmd_page_dtor(virt_to_page(pgd));
crst_table_free(mm, (unsigned long *) pgd); crst_table_free(mm, (unsigned long *) pgd);
} }
......
...@@ -80,7 +80,7 @@ struct qdr { ...@@ -80,7 +80,7 @@ struct qdr {
u32 qkey : 4; u32 qkey : 4;
u32 : 28; u32 : 28;
struct qdesfmt0 qdf0[126]; struct qdesfmt0 qdf0[126];
} __attribute__ ((packed, aligned(4096))); } __packed __aligned(PAGE_SIZE);
#define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40 #define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40
#define QIB_RFLAGS_ENABLE_QEBSM 0x80 #define QIB_RFLAGS_ENABLE_QEBSM 0x80
......
...@@ -130,7 +130,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, ...@@ -130,7 +130,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
unsigned long address) unsigned long address)
{ {
if (tlb->mm->context.asce_limit <= (1UL << 31)) if (tlb->mm->context.asce_limit <= _REGION3_SIZE)
return; return;
pgtable_pmd_page_dtor(virt_to_page(pmd)); pgtable_pmd_page_dtor(virt_to_page(pmd));
tlb_remove_table(tlb, pmd); tlb_remove_table(tlb, pmd);
...@@ -146,7 +146,7 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, ...@@ -146,7 +146,7 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d, static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
unsigned long address) unsigned long address)
{ {
if (tlb->mm->context.asce_limit <= (1UL << 53)) if (tlb->mm->context.asce_limit <= _REGION1_SIZE)
return; return;
tlb_remove_table(tlb, p4d); tlb_remove_table(tlb, p4d);
} }
...@@ -161,7 +161,7 @@ static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d, ...@@ -161,7 +161,7 @@ static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
unsigned long address) unsigned long address)
{ {
if (tlb->mm->context.asce_limit <= (1UL << 42)) if (tlb->mm->context.asce_limit <= _REGION2_SIZE)
return; return;
tlb_remove_table(tlb, pud); tlb_remove_table(tlb, pud);
} }
......
...@@ -76,7 +76,7 @@ void dump_trace(dump_trace_func_t func, void *data, struct task_struct *task, ...@@ -76,7 +76,7 @@ void dump_trace(dump_trace_func_t func, void *data, struct task_struct *task,
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
#ifdef CONFIG_CHECK_STACK #ifdef CONFIG_CHECK_STACK
sp = __dump_trace(func, data, sp, sp = __dump_trace(func, data, sp,
S390_lowcore.panic_stack + frame_size - 4096, S390_lowcore.panic_stack + frame_size - PAGE_SIZE,
S390_lowcore.panic_stack + frame_size); S390_lowcore.panic_stack + frame_size);
#endif #endif
sp = __dump_trace(func, data, sp, sp = __dump_trace(func, data, sp,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/page.h>
#include <asm/sigp.h> #include <asm/sigp.h>
/* /*
...@@ -55,8 +56,8 @@ ENTRY(relocate_kernel) ...@@ -55,8 +56,8 @@ ENTRY(relocate_kernel)
.back_pgm: .back_pgm:
lmg %r0,%r15,gprregs-.base(%r13) lmg %r0,%r15,gprregs-.base(%r13)
.top: .top:
lghi %r7,4096 # load PAGE_SIZE in r7 lghi %r7,PAGE_SIZE # load PAGE_SIZE in r7
lghi %r9,4096 # load PAGE_SIZE in r9 lghi %r9,PAGE_SIZE # load PAGE_SIZE in r9
lg %r5,0(%r2) # read another word for indirection page lg %r5,0(%r2) # read another word for indirection page
aghi %r2,8 # increment pointer aghi %r2,8 # increment pointer
tml %r5,0x1 # is it a destination page? tml %r5,0x1 # is it a destination page?
......
...@@ -305,7 +305,7 @@ static void __init setup_lowcore(void) ...@@ -305,7 +305,7 @@ static void __init setup_lowcore(void)
/* /*
* Setup lowcore for boot cpu * Setup lowcore for boot cpu
*/ */
BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * 4096); BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * PAGE_SIZE);
lc = memblock_virt_alloc_low(sizeof(*lc), sizeof(*lc)); lc = memblock_virt_alloc_low(sizeof(*lc), sizeof(*lc));
lc->restart_psw.mask = PSW_KERNEL_BITS; lc->restart_psw.mask = PSW_KERNEL_BITS;
lc->restart_psw.addr = (unsigned long) restart_int_handler; lc->restart_psw.addr = (unsigned long) restart_int_handler;
...@@ -469,10 +469,10 @@ static void __init setup_memory_end(void) ...@@ -469,10 +469,10 @@ static void __init setup_memory_end(void)
vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN; vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN;
tmp = (memory_end ?: max_physmem_end) / PAGE_SIZE; tmp = (memory_end ?: max_physmem_end) / PAGE_SIZE;
tmp = tmp * (sizeof(struct page) + PAGE_SIZE); tmp = tmp * (sizeof(struct page) + PAGE_SIZE);
if (tmp + vmalloc_size + MODULES_LEN <= (1UL << 42)) if (tmp + vmalloc_size + MODULES_LEN <= _REGION2_SIZE)
vmax = 1UL << 42; /* 3-level kernel page table */ vmax = _REGION2_SIZE; /* 3-level kernel page table */
else else
vmax = 1UL << 53; /* 4-level kernel page table */ vmax = _REGION1_SIZE; /* 4-level kernel page table */
/* module area is at the end of the kernel address space. */ /* module area is at the end of the kernel address space. */
MODULES_END = vmax; MODULES_END = vmax;
MODULES_VADDR = MODULES_END - MODULES_LEN; MODULES_VADDR = MODULES_END - MODULES_LEN;
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
* This is the infamous ld script for the 32 bits vdso * This is the infamous ld script for the 32 bits vdso
* library * library
*/ */
#include <asm/page.h>
#include <asm/vdso.h> #include <asm/vdso.h>
OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
...@@ -91,7 +93,7 @@ SECTIONS ...@@ -91,7 +93,7 @@ SECTIONS
.debug_ranges 0 : { *(.debug_ranges) } .debug_ranges 0 : { *(.debug_ranges) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
. = ALIGN(4096); . = ALIGN(PAGE_SIZE);
PROVIDE(_vdso_data = .); PROVIDE(_vdso_data = .);
/DISCARD/ : { /DISCARD/ : {
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
* This is the infamous ld script for the 64 bits vdso * This is the infamous ld script for the 64 bits vdso
* library * library
*/ */
#include <asm/page.h>
#include <asm/vdso.h> #include <asm/vdso.h>
OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
...@@ -91,7 +93,7 @@ SECTIONS ...@@ -91,7 +93,7 @@ SECTIONS
.debug_ranges 0 : { *(.debug_ranges) } .debug_ranges 0 : { *(.debug_ranges) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
. = ALIGN(4096); . = ALIGN(PAGE_SIZE);
PROVIDE(_vdso_data = .); PROVIDE(_vdso_data = .);
/DISCARD/ : { /DISCARD/ : {
......
...@@ -135,7 +135,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address) ...@@ -135,7 +135,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address)
pr_alert("AS:%016lx ", asce); pr_alert("AS:%016lx ", asce);
switch (asce & _ASCE_TYPE_MASK) { switch (asce & _ASCE_TYPE_MASK) {
case _ASCE_TYPE_REGION1: case _ASCE_TYPE_REGION1:
table = table + ((address >> 53) & 0x7ff); table += (address & _REGION1_INDEX) >> _REGION1_SHIFT;
if (bad_address(table)) if (bad_address(table))
goto bad; goto bad;
pr_cont("R1:%016lx ", *table); pr_cont("R1:%016lx ", *table);
...@@ -144,7 +144,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address) ...@@ -144,7 +144,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address)
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
/* fallthrough */ /* fallthrough */
case _ASCE_TYPE_REGION2: case _ASCE_TYPE_REGION2:
table = table + ((address >> 42) & 0x7ff); table += (address & _REGION2_INDEX) >> _REGION2_SHIFT;
if (bad_address(table)) if (bad_address(table))
goto bad; goto bad;
pr_cont("R2:%016lx ", *table); pr_cont("R2:%016lx ", *table);
...@@ -153,7 +153,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address) ...@@ -153,7 +153,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address)
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
/* fallthrough */ /* fallthrough */
case _ASCE_TYPE_REGION3: case _ASCE_TYPE_REGION3:
table = table + ((address >> 31) & 0x7ff); table += (address & _REGION3_INDEX) >> _REGION3_SHIFT;
if (bad_address(table)) if (bad_address(table))
goto bad; goto bad;
pr_cont("R3:%016lx ", *table); pr_cont("R3:%016lx ", *table);
...@@ -162,7 +162,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address) ...@@ -162,7 +162,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address)
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
/* fallthrough */ /* fallthrough */
case _ASCE_TYPE_SEGMENT: case _ASCE_TYPE_SEGMENT:
table = table + ((address >> 20) & 0x7ff); table += (address & _SEGMENT_INDEX) >> _SEGMENT_SHIFT;
if (bad_address(table)) if (bad_address(table))
goto bad; goto bad;
pr_cont("S:%016lx ", *table); pr_cont("S:%016lx ", *table);
...@@ -170,7 +170,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address) ...@@ -170,7 +170,7 @@ static void dump_pagetable(unsigned long asce, unsigned long address)
goto out; goto out;
table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN); table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
} }
table = table + ((address >> 12) & 0xff); table += (address & _PAGE_INDEX) >> _PAGE_SHIFT;
if (bad_address(table)) if (bad_address(table))
goto bad; goto bad;
pr_cont("P:%016lx ", *table); pr_cont("P:%016lx ", *table);
......
This diff is collapsed.
...@@ -84,7 +84,7 @@ void __init paging_init(void) ...@@ -84,7 +84,7 @@ void __init paging_init(void)
psw_t psw; psw_t psw;
init_mm.pgd = swapper_pg_dir; init_mm.pgd = swapper_pg_dir;
if (VMALLOC_END > (1UL << 42)) { if (VMALLOC_END > _REGION2_SIZE) {
asce_bits = _ASCE_TYPE_REGION2 | _ASCE_TABLE_LENGTH; asce_bits = _ASCE_TYPE_REGION2 | _ASCE_TABLE_LENGTH;
pgd_type = _REGION2_ENTRY_EMPTY; pgd_type = _REGION2_ENTRY_EMPTY;
} else { } else {
...@@ -93,8 +93,7 @@ void __init paging_init(void) ...@@ -93,8 +93,7 @@ void __init paging_init(void)
} }
init_mm.context.asce = (__pa(init_mm.pgd) & PAGE_MASK) | asce_bits; init_mm.context.asce = (__pa(init_mm.pgd) & PAGE_MASK) | asce_bits;
S390_lowcore.kernel_asce = init_mm.context.asce; S390_lowcore.kernel_asce = init_mm.context.asce;
clear_table((unsigned long *) init_mm.pgd, pgd_type, crst_table_init((unsigned long *) init_mm.pgd, pgd_type);
sizeof(unsigned long)*2048);
vmem_map_init(); vmem_map_init();
/* enable virtual mapping in kernel mode */ /* enable virtual mapping in kernel mode */
......
...@@ -83,7 +83,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end) ...@@ -83,7 +83,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
int rc, notify; int rc, notify;
/* upgrade should only happen from 3 to 4, 3 to 5, or 4 to 5 levels */ /* upgrade should only happen from 3 to 4, 3 to 5, or 4 to 5 levels */
BUG_ON(mm->context.asce_limit < (1UL << 42)); BUG_ON(mm->context.asce_limit < _REGION2_SIZE);
if (end >= TASK_SIZE_MAX) if (end >= TASK_SIZE_MAX)
return -ENOMEM; return -ENOMEM;
rc = 0; rc = 0;
...@@ -96,11 +96,11 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end) ...@@ -96,11 +96,11 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
} }
spin_lock_bh(&mm->page_table_lock); spin_lock_bh(&mm->page_table_lock);
pgd = (unsigned long *) mm->pgd; pgd = (unsigned long *) mm->pgd;
if (mm->context.asce_limit == (1UL << 42)) { if (mm->context.asce_limit == _REGION2_SIZE) {
crst_table_init(table, _REGION2_ENTRY_EMPTY); crst_table_init(table, _REGION2_ENTRY_EMPTY);
p4d_populate(mm, (p4d_t *) table, (pud_t *) pgd); p4d_populate(mm, (p4d_t *) table, (pud_t *) pgd);
mm->pgd = (pgd_t *) table; mm->pgd = (pgd_t *) table;
mm->context.asce_limit = 1UL << 53; mm->context.asce_limit = _REGION1_SIZE;
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
_ASCE_USER_BITS | _ASCE_TYPE_REGION2; _ASCE_USER_BITS | _ASCE_TYPE_REGION2;
} else { } else {
...@@ -124,7 +124,7 @@ void crst_table_downgrade(struct mm_struct *mm) ...@@ -124,7 +124,7 @@ void crst_table_downgrade(struct mm_struct *mm)
pgd_t *pgd; pgd_t *pgd;
/* downgrade should only happen from 3 to 2 levels (compat only) */ /* downgrade should only happen from 3 to 2 levels (compat only) */
BUG_ON(mm->context.asce_limit != (1UL << 42)); BUG_ON(mm->context.asce_limit != _REGION2_SIZE);
if (current->active_mm == mm) { if (current->active_mm == mm) {
clear_user_asce(); clear_user_asce();
...@@ -133,7 +133,7 @@ void crst_table_downgrade(struct mm_struct *mm) ...@@ -133,7 +133,7 @@ void crst_table_downgrade(struct mm_struct *mm)
pgd = mm->pgd; pgd = mm->pgd;
mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN); mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
mm->context.asce_limit = 1UL << 31; mm->context.asce_limit = _REGION3_SIZE;
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
_ASCE_USER_BITS | _ASCE_TYPE_SEGMENT; _ASCE_USER_BITS | _ASCE_TYPE_SEGMENT;
crst_table_free(mm, (unsigned long *) pgd); crst_table_free(mm, (unsigned long *) pgd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment