MIPS: Move pgd_alloc() out of header
pgd_alloc() references init_mm which is not exported to modules. In order for KVM to be able to use pgd_alloc() to allocate GVA page tables, move pgd_alloc() into a new pgtable.c file and export it to modules. Signed-off-by: James Hogan <james.hogan@imgtec.com> Acked-by: Ralf Baechle <ralf@linux-mips.org> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Radim Krčmář" <rkrcmar@redhat.com> Cc: linux-mips@linux-mips.org Cc: kvm@vger.kernel.orghifive-unleashed-5.1
parent
0c744ea4f7
commit
814f91bf3e
|
@ -43,21 +43,7 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
||||||
* Initialize a new pgd / pmd table with invalid pointers.
|
* Initialize a new pgd / pmd table with invalid pointers.
|
||||||
*/
|
*/
|
||||||
extern void pgd_init(unsigned long page);
|
extern void pgd_init(unsigned long page);
|
||||||
|
extern pgd_t *pgd_alloc(struct mm_struct *mm);
|
||||||
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
|
|
||||||
{
|
|
||||||
pgd_t *ret, *init;
|
|
||||||
|
|
||||||
ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER);
|
|
||||||
if (ret) {
|
|
||||||
init = pgd_offset(&init_mm, 0UL);
|
|
||||||
pgd_init((unsigned long)ret);
|
|
||||||
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
|
|
||||||
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
obj-y += cache.o dma-default.o extable.o fault.o \
|
obj-y += cache.o dma-default.o extable.o fault.o \
|
||||||
gup.o init.o mmap.o page.o page-funcs.o \
|
gup.o init.o mmap.o page.o page-funcs.o \
|
||||||
tlbex.o tlbex-fault.o tlb-funcs.o
|
pgtable.o tlbex.o tlbex-fault.o tlb-funcs.o
|
||||||
|
|
||||||
ifdef CONFIG_CPU_MICROMIPS
|
ifdef CONFIG_CPU_MICROMIPS
|
||||||
obj-y += uasm-micromips.o
|
obj-y += uasm-micromips.o
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
#include <linux/export.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
#include <asm/pgalloc.h>
|
||||||
|
|
||||||
|
pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
pgd_t *ret, *init;
|
||||||
|
|
||||||
|
ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER);
|
||||||
|
if (ret) {
|
||||||
|
init = pgd_offset(&init_mm, 0UL);
|
||||||
|
pgd_init((unsigned long)ret);
|
||||||
|
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
|
||||||
|
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pgd_alloc);
|
Loading…
Reference in New Issue