Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c34a51ce authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Benjamin Herrenschmidt
Browse files

powerpc/mm: Enable _PAGE_NUMA for book3s



We steal the _PAGE_COHERENCE bit and use that for indicating NUMA ptes.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Acked-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 8937ba48
Loading
Loading
Loading
Loading
+65 −1
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#ifdef __KERNEL__

#ifndef __ASSEMBLY__
#include <linux/mmdebug.h>
#include <asm/processor.h>		/* For TASK_SIZE */
#include <asm/mmu.h>
#include <asm/page.h>
@@ -33,10 +34,73 @@ static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
static inline int pte_young(pte_t pte)		{ return pte_val(pte) & _PAGE_ACCESSED; }
static inline int pte_file(pte_t pte)		{ return pte_val(pte) & _PAGE_FILE; }
static inline int pte_special(pte_t pte)	{ return pte_val(pte) & _PAGE_SPECIAL; }
static inline int pte_present(pte_t pte)	{ return pte_val(pte) & _PAGE_PRESENT; }
static inline int pte_none(pte_t pte)		{ return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
static inline pgprot_t pte_pgprot(pte_t pte)	{ return __pgprot(pte_val(pte) & PAGE_PROT_BITS); }

#ifdef CONFIG_NUMA_BALANCING

static inline int pte_present(pte_t pte)
{
	return pte_val(pte) & (_PAGE_PRESENT | _PAGE_NUMA);
}

#define pte_numa pte_numa
static inline int pte_numa(pte_t pte)
{
	return (pte_val(pte) &
		(_PAGE_NUMA|_PAGE_PRESENT)) == _PAGE_NUMA;
}

#define pte_mknonnuma pte_mknonnuma
static inline pte_t pte_mknonnuma(pte_t pte)
{
	pte_val(pte) &= ~_PAGE_NUMA;
	pte_val(pte) |=  _PAGE_PRESENT | _PAGE_ACCESSED;
	return pte;
}

#define pte_mknuma pte_mknuma
static inline pte_t pte_mknuma(pte_t pte)
{
	/*
	 * We should not set _PAGE_NUMA on non present ptes. Also clear the
	 * present bit so that hash_page will return 1 and we collect this
	 * as numa fault.
	 */
	if (pte_present(pte)) {
		pte_val(pte) |= _PAGE_NUMA;
		pte_val(pte) &= ~_PAGE_PRESENT;
	} else
		VM_BUG_ON(1);
	return pte;
}

#define pmd_numa pmd_numa
static inline int pmd_numa(pmd_t pmd)
{
	return pte_numa(pmd_pte(pmd));
}

#define pmd_mknonnuma pmd_mknonnuma
static inline pmd_t pmd_mknonnuma(pmd_t pmd)
{
	return pte_pmd(pte_mknonnuma(pmd_pte(pmd)));
}

#define pmd_mknuma pmd_mknuma
static inline pmd_t pmd_mknuma(pmd_t pmd)
{
	return pte_pmd(pte_mknuma(pmd_pte(pmd)));
}

# else

static inline int pte_present(pte_t pte)
{
	return pte_val(pte) & _PAGE_PRESENT;
}
#endif /* CONFIG_NUMA_BALANCING */

/* Conversion functions: convert a page and protection to a page entry,
 * and a page entry and page directory to the page they refer to.
 *
+6 −0
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@
#define _PAGE_RW		0x0200 /* software: user write access allowed */
#define _PAGE_BUSY		0x0800 /* software: PTE & hash are busy */

/*
 * Used for tracking numa faults
 */
#define _PAGE_NUMA	0x00000010 /* Gather numa placement stats */


/* No separate kernel read-only */
#define _PAGE_KERNEL_RW		(_PAGE_RW | _PAGE_DIRTY) /* user access blocked by key */
#define _PAGE_KERNEL_RO		 _PAGE_KERNEL_RW
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ config PPC_BOOK3S_64
	select PPC_HAVE_PMU_SUPPORT
	select SYS_SUPPORTS_HUGETLBFS
	select HAVE_ARCH_TRANSPARENT_HUGEPAGE if PPC_64K_PAGES
	select ARCH_SUPPORTS_NUMA_BALANCING

config PPC_BOOK3E_64
	bool "Embedded processors"