mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Kamal Mostafa <kamal@canonical.com>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	kernel-team@lists.ubuntu.com
Cc: "David S. Miller" <davem@davemloft.net>,
	Kamal Mostafa <kamal@canonical.com>
Subject: [PATCH 3.13 048/162] sparc64: Fix physical memory management regressions with large max_phys_bits.
Date: Thu,  6 Nov 2014 14:35:12 -0800	[thread overview]
Message-ID: <1415313426-9622-49-git-send-email-kamal@canonical.com> (raw)
In-Reply-To: <1415313426-9622-1-git-send-email-kamal@canonical.com>

3.13.11.11 -stable review patch.  If anyone has any objections, please let me know.

------------------

From: "David S. Miller" <davem@davemloft.net>

[ Upstream commit 0dd5b7b09e13dae32869371e08e1048349fd040c ]

If max_phys_bits needs to be > 43 (f.e. for T4 chips), things like
DEBUG_PAGEALLOC stop working because the 3-level page tables only
can cover up to 43 bits.

Another problem is that when we increased MAX_PHYS_ADDRESS_BITS up to
47, several statically allocated tables became enormous.

Compounding this is that we will need to support up to 49 bits of
physical addressing for M7 chips.

The two tables in question are sparc64_valid_addr_bitmap and
kpte_linear_bitmap.

The first holds a bitmap, with 1 bit for each 4MB chunk of physical
memory, indicating whether that chunk actually exists in the machine
and is valid.

The second table is a set of 2-bit values which tell how large of a
mapping (4MB, 256MB, 2GB, 16GB, respectively) we can use at each 256MB
chunk of ram in the system.

These tables are huge and take up an enormous amount of the BSS
section of the sparc64 kernel image.  Specifically, the
sparc64_valid_addr_bitmap is 4MB, and the kpte_linear_bitmap is 128K.

So let's solve the space wastage and the DEBUG_PAGEALLOC problem
at the same time, by using the kernel page tables (as designed) to
manage this information.

We have to keep using large mappings when DEBUG_PAGEALLOC is disabled,
and we do this by encoding huge PMDs and PUDs.

On a T4-2 with 256GB of ram the kernel page table takes up 16K with
DEBUG_PAGEALLOC disabled and 256MB with it enabled.  Furthermore, this
memory is dynamically allocated at run time rather than coded
statically into the kernel image.

Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Bob Picco <bob.picco@oracle.com>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 arch/sparc/include/asm/page_64.h    |   3 -
 arch/sparc/include/asm/pgtable_64.h |  55 +++--
 arch/sparc/include/asm/tsb.h        |  47 ++++-
 arch/sparc/kernel/ktlb.S            | 108 +---------
 arch/sparc/kernel/vmlinux.lds.S     |   5 -
 arch/sparc/mm/init_64.c             | 393 +++++++++++++++---------------------
 arch/sparc/mm/init_64.h             |   7 -
 7 files changed, 244 insertions(+), 374 deletions(-)

diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h
index 6dc1948..b70210d 100644
--- a/arch/sparc/include/asm/page_64.h
+++ b/arch/sparc/include/asm/page_64.h
@@ -128,9 +128,6 @@ extern unsigned long PAGE_OFFSET;
  */
 #define MAX_PHYS_ADDRESS_BITS	47
 
-/* These two shift counts are used when indexing sparc64_valid_addr_bitmap
- * and kpte_linear_bitmap.
- */
 #define ILOG2_4MB		22
 #define ILOG2_256MB		28
 
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
index 5c91201..be03c00 100644
--- a/arch/sparc/include/asm/pgtable_64.h
+++ b/arch/sparc/include/asm/pgtable_64.h
@@ -79,22 +79,7 @@
 
 #include <linux/sched.h>
 
-extern unsigned long sparc64_valid_addr_bitmap[];
-
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-static inline bool __kern_addr_valid(unsigned long paddr)
-{
-	if ((paddr >> MAX_PHYS_ADDRESS_BITS) != 0UL)
-		return false;
-	return test_bit(paddr >> ILOG2_4MB, sparc64_valid_addr_bitmap);
-}
-
-static inline bool kern_addr_valid(unsigned long addr)
-{
-	unsigned long paddr = __pa(addr);
-
-	return __kern_addr_valid(paddr);
-}
+bool kern_addr_valid(unsigned long addr);
 
 /* Entries per page directory level. */
 #define PTRS_PER_PTE	(1UL << (PAGE_SHIFT-3))
@@ -122,6 +107,7 @@ static inline bool kern_addr_valid(unsigned long addr)
 #define _PAGE_R	  	  _AC(0x8000000000000000,UL) /* Keep ref bit uptodate*/
 #define _PAGE_SPECIAL     _AC(0x0200000000000000,UL) /* Special page         */
 #define _PAGE_PMD_HUGE    _AC(0x0100000000000000,UL) /* Huge page            */
+#define _PAGE_PUD_HUGE    _PAGE_PMD_HUGE
 
 /* Advertise support for _PAGE_SPECIAL */
 #define __HAVE_ARCH_PTE_SPECIAL
@@ -668,26 +654,26 @@ static inline unsigned long pmd_large(pmd_t pmd)
 	return pte_val(pte) & _PAGE_PMD_HUGE;
 }
 
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-static inline unsigned long pmd_young(pmd_t pmd)
+static inline unsigned long pmd_pfn(pmd_t pmd)
 {
 	pte_t pte = __pte(pmd_val(pmd));
 
-	return pte_young(pte);
+	return pte_pfn(pte);
 }
 
-static inline unsigned long pmd_write(pmd_t pmd)
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+static inline unsigned long pmd_young(pmd_t pmd)
 {
 	pte_t pte = __pte(pmd_val(pmd));
 
-	return pte_write(pte);
+	return pte_young(pte);
 }
 
-static inline unsigned long pmd_pfn(pmd_t pmd)
+static inline unsigned long pmd_write(pmd_t pmd)
 {
 	pte_t pte = __pte(pmd_val(pmd));
 
-	return pte_pfn(pte);
+	return pte_write(pte);
 }
 
 static inline unsigned long pmd_trans_huge(pmd_t pmd)
@@ -781,18 +767,15 @@ static inline int pmd_present(pmd_t pmd)
  * the top bits outside of the range of any physical address size we
  * support are clear as well.  We also validate the physical itself.
  */
-#define pmd_bad(pmd)			((pmd_val(pmd) & ~PAGE_MASK) || \
-					 !__kern_addr_valid(pmd_val(pmd)))
+#define pmd_bad(pmd)			(pmd_val(pmd) & ~PAGE_MASK)
 
 #define pud_none(pud)			(!pud_val(pud))
 
-#define pud_bad(pud)			((pud_val(pud) & ~PAGE_MASK) || \
-					 !__kern_addr_valid(pud_val(pud)))
+#define pud_bad(pud)			(pud_val(pud) & ~PAGE_MASK)
 
 #define pgd_none(pgd)			(!pgd_val(pgd))
 
-#define pgd_bad(pgd)			((pgd_val(pgd) & ~PAGE_MASK) || \
-					 !__kern_addr_valid(pgd_val(pgd)))
+#define pgd_bad(pgd)			(pgd_val(pgd) & ~PAGE_MASK)
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 extern void set_pmd_at(struct mm_struct *mm, unsigned long addr,
@@ -835,6 +818,20 @@ static inline unsigned long __pmd_page(pmd_t pmd)
 #define pgd_present(pgd)		(pgd_val(pgd) != 0U)
 #define pgd_clear(pgdp)			(pgd_val(*(pgd)) = 0UL)
 
+static inline unsigned long pud_large(pud_t pud)
+{
+	pte_t pte = __pte(pud_val(pud));
+
+	return pte_val(pte) & _PAGE_PMD_HUGE;
+}
+
+static inline unsigned long pud_pfn(pud_t pud)
+{
+	pte_t pte = __pte(pud_val(pud));
+
+	return pte_pfn(pte);
+}
+
 /* Same in both SUN4V and SUN4U.  */
 #define pte_none(pte) 			(!pte_val(pte))
 
diff --git a/arch/sparc/include/asm/tsb.h b/arch/sparc/include/asm/tsb.h
index a2f5419..ecb49cf 100644
--- a/arch/sparc/include/asm/tsb.h
+++ b/arch/sparc/include/asm/tsb.h
@@ -133,9 +133,24 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
 	sub	TSB, 0x8, TSB;   \
 	TSB_STORE(TSB, TAG);
 
-	/* Do a kernel page table walk.  Leaves physical PTE pointer in
-	 * REG1.  Jumps to FAIL_LABEL on early page table walk termination.
-	 * VADDR will not be clobbered, but REG2 will.
+	/* Do a kernel page table walk.  Leaves valid PTE value in
+	 * REG1.  Jumps to FAIL_LABEL on early page table walk
+	 * termination.  VADDR will not be clobbered, but REG2 will.
+	 *
+	 * There are two masks we must apply to propagate bits from
+	 * the virtual address into the PTE physical address field
+	 * when dealing with huge pages.  This is because the page
+	 * table boundaries do not match the huge page size(s) the
+	 * hardware supports.
+	 *
+	 * In these cases we propagate the bits that are below the
+	 * page table level where we saw the huge page mapping, but
+	 * are still within the relevant physical bits for the huge
+	 * page size in question.  So for PMD mappings (which fall on
+	 * bit 23, for 8MB per PMD) we must propagate bit 22 for a
+	 * 4MB huge page.  For huge PUDs (which fall on bit 33, for
+	 * 8GB per PUD), we have to accomodate 256MB and 2GB huge
+	 * pages.  So for those we propagate bits 32 to 28.
 	 */
 #define KERN_PGTABLE_WALK(VADDR, REG1, REG2, FAIL_LABEL)	\
 	sethi		%hi(swapper_pg_dir), REG1; \
@@ -150,15 +165,35 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
 	andn		REG2, 0x7, REG2; \
 	ldxa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \
 	brz,pn		REG1, FAIL_LABEL; \
-	 sllx		VADDR, 64 - (PMD_SHIFT + PMD_BITS), REG2; \
+	sethi		%uhi(_PAGE_PUD_HUGE), REG2; \
+	brz,pn		REG1, FAIL_LABEL; \
+	 sllx		REG2, 32, REG2; \
+	andcc		REG1, REG2, %g0; \
+	sethi		%hi(0xf8000000), REG2; \
+	bne,pt		%xcc, 697f; \
+	 sllx		REG2, 1, REG2; \
+	sllx		VADDR, 64 - (PMD_SHIFT + PMD_BITS), REG2; \
 	srlx		REG2, 64 - PAGE_SHIFT, REG2; \
 	andn		REG2, 0x7, REG2; \
 	ldxa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \
+	sethi		%uhi(_PAGE_PMD_HUGE), REG2; \
 	brz,pn		REG1, FAIL_LABEL; \
-	 sllx		VADDR, 64 - PMD_SHIFT, REG2; \
+	 sllx		REG2, 32, REG2; \
+	andcc		REG1, REG2, %g0; \
+	be,pn		%xcc, 698f; \
+	 sethi		%hi(0x400000), REG2; \
+697:	brgez,pn	REG1, FAIL_LABEL; \
+	 andn		REG1, REG2, REG1; \
+	and		VADDR, REG2, REG2; \
+	ba,pt		%xcc, 699f; \
+	 or		REG1, REG2, REG1; \
+698:	sllx		VADDR, 64 - PMD_SHIFT, REG2; \
 	srlx		REG2, 64 - PAGE_SHIFT, REG2; \
 	andn		REG2, 0x7, REG2; \
-	add		REG1, REG2, REG1;
+	ldxa		[REG1 + REG2] ASI_PHYS_USE_EC, REG1; \
+	brgez,pn	REG1, FAIL_LABEL; \
+	 nop; \
+699:
 
 	/* PMD has been loaded into REG1, interpret the value, seeing
 	 * if it is a HUGE PMD or a normal one.  If it is not valid
diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S
index 605d492..94a1e66 100644
--- a/arch/sparc/kernel/ktlb.S
+++ b/arch/sparc/kernel/ktlb.S
@@ -47,14 +47,6 @@ kvmap_itlb_vmalloc_addr:
 	KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_itlb_longpath)
 
 	TSB_LOCK_TAG(%g1, %g2, %g7)
-
-	/* Load and check PTE.  */
-	ldxa		[%g5] ASI_PHYS_USE_EC, %g5
-	mov		1, %g7
-	sllx		%g7, TSB_TAG_INVALID_BIT, %g7
-	brgez,a,pn	%g5, kvmap_itlb_longpath
-	 TSB_STORE(%g1, %g7)
-
 	TSB_WRITE(%g1, %g5, %g6)
 
 	/* fallthrough to TLB load */
@@ -118,6 +110,12 @@ kvmap_dtlb_obp:
 	ba,pt		%xcc, kvmap_dtlb_load
 	 nop
 
+kvmap_linear_early:
+	sethi		%hi(kern_linear_pte_xor), %g7
+	ldx		[%g7 + %lo(kern_linear_pte_xor)], %g2
+	ba,pt		%xcc, kvmap_dtlb_tsb4m_load
+	 xor		%g2, %g4, %g5
+
 	.align		32
 kvmap_dtlb_tsb4m_load:
 	TSB_LOCK_TAG(%g1, %g2, %g7)
@@ -146,105 +144,17 @@ kvmap_dtlb_4v:
 	/* Correct TAG_TARGET is already in %g6, check 4mb TSB.  */
 	KERN_TSB4M_LOOKUP_TL1(%g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
 #endif
-	/* TSB entry address left in %g1, lookup linear PTE.
-	 * Must preserve %g1 and %g6 (TAG).
-	 */
-kvmap_dtlb_tsb4m_miss:
-	/* Clear the PAGE_OFFSET top virtual bits, shift
-	 * down to get PFN, and make sure PFN is in range.
-	 */
-661:	sllx		%g4, 0, %g5
-	.section	.page_offset_shift_patch, "ax"
-	.word		661b
-	.previous
-
-	/* Check to see if we know about valid memory at the 4MB
-	 * chunk this physical address will reside within.
+	/* Linear mapping TSB lookup failed.  Fallthrough to kernel
+	 * page table based lookup.
 	 */
-661:	srlx		%g5, MAX_PHYS_ADDRESS_BITS, %g2
-	.section	.page_offset_shift_patch, "ax"
-	.word		661b
-	.previous
-
-	brnz,pn		%g2, kvmap_dtlb_longpath
-	 nop
-
-	/* This unconditional branch and delay-slot nop gets patched
-	 * by the sethi sequence once the bitmap is properly setup.
-	 */
-	.globl		valid_addr_bitmap_insn
-valid_addr_bitmap_insn:
-	ba,pt		%xcc, 2f
-	 nop
-	.subsection	2
-	.globl		valid_addr_bitmap_patch
-valid_addr_bitmap_patch:
-	sethi		%hi(sparc64_valid_addr_bitmap), %g7
-	or		%g7, %lo(sparc64_valid_addr_bitmap), %g7
-	.previous
-
-661:	srlx		%g5, ILOG2_4MB, %g2
-	.section	.page_offset_shift_patch, "ax"
-	.word		661b
-	.previous
-
-	srlx		%g2, 6, %g5
-	and		%g2, 63, %g2
-	sllx		%g5, 3, %g5
-	ldx		[%g7 + %g5], %g5
-	mov		1, %g7
-	sllx		%g7, %g2, %g7
-	andcc		%g5, %g7, %g0
-	be,pn		%xcc, kvmap_dtlb_longpath
-
-2:	 sethi		%hi(kpte_linear_bitmap), %g2
-
-	/* Get the 256MB physical address index. */
-661:	sllx		%g4, 0, %g5
-	.section	.page_offset_shift_patch, "ax"
-	.word		661b
-	.previous
-
-	or		%g2, %lo(kpte_linear_bitmap), %g2
-
-661:	srlx		%g5, ILOG2_256MB, %g5
-	.section	.page_offset_shift_patch, "ax"
-	.word		661b
-	.previous
-
-	and		%g5, (32 - 1), %g7
-
-	/* Divide by 32 to get the offset into the bitmask.  */
-	srlx		%g5, 5, %g5
-	add		%g7, %g7, %g7
-	sllx		%g5, 3, %g5
-
-	/* kern_linear_pte_xor[(mask >> shift) & 3)] */
-	ldx		[%g2 + %g5], %g2
-	srlx		%g2, %g7, %g7
-	sethi		%hi(kern_linear_pte_xor), %g5
-	and		%g7, 3, %g7
-	or		%g5, %lo(kern_linear_pte_xor), %g5
-	sllx		%g7, 3, %g7
-	ldx		[%g5 + %g7], %g2
-
 	.globl		kvmap_linear_patch
 kvmap_linear_patch:
-	ba,pt		%xcc, kvmap_dtlb_tsb4m_load
-	 xor		%g2, %g4, %g5
+	ba,a,pt		%xcc, kvmap_linear_early
 
 kvmap_dtlb_vmalloc_addr:
 	KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_dtlb_longpath)
 
 	TSB_LOCK_TAG(%g1, %g2, %g7)
-
-	/* Load and check PTE.  */
-	ldxa		[%g5] ASI_PHYS_USE_EC, %g5
-	mov		1, %g7
-	sllx		%g7, TSB_TAG_INVALID_BIT, %g7
-	brgez,a,pn	%g5, kvmap_dtlb_longpath
-	 TSB_STORE(%g1, %g7)
-
 	TSB_WRITE(%g1, %g5, %g6)
 
 	/* fallthrough to TLB load */
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S
index 932ff90..0bacceb 100644
--- a/arch/sparc/kernel/vmlinux.lds.S
+++ b/arch/sparc/kernel/vmlinux.lds.S
@@ -122,11 +122,6 @@ SECTIONS
 		*(.swapper_4m_tsb_phys_patch)
 		__swapper_4m_tsb_phys_patch_end = .;
 	}
-	.page_offset_shift_patch : {
-		__page_offset_shift_patch = .;
-		*(.page_offset_shift_patch)
-		__page_offset_shift_patch_end = .;
-	}
 	.popc_3insn_patch : {
 		__popc_3insn_patch = .;
 		*(.popc_3insn_patch)
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index f743f05..661a6383 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -73,7 +73,6 @@ unsigned long kern_linear_pte_xor[4] __read_mostly;
  * 'cpu' properties, but we need to have this table setup before the
  * MDESC is initialized.
  */
-unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
 
 #ifndef CONFIG_DEBUG_PAGEALLOC
 /* A special kernel TSB for 4MB, 256MB, 2GB and 16GB linear mappings.
@@ -82,6 +81,7 @@ unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
  */
 extern struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES];
 #endif
+extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];
 
 static unsigned long cpu_pgsz_mask;
 
@@ -163,10 +163,6 @@ static void __init read_obp_memory(const char *property,
 	     cmp_p64, NULL);
 }
 
-unsigned long sparc64_valid_addr_bitmap[VALID_ADDR_BITMAP_BYTES /
-					sizeof(unsigned long)];
-EXPORT_SYMBOL(sparc64_valid_addr_bitmap);
-
 /* Kernel physical address base and size in bytes.  */
 unsigned long kern_base __read_mostly;
 unsigned long kern_size __read_mostly;
@@ -1362,9 +1358,145 @@ static unsigned long __init bootmem_init(unsigned long phys_base)
 static struct linux_prom64_registers pall[MAX_BANKS] __initdata;
 static int pall_ents __initdata;
 
-#ifdef CONFIG_DEBUG_PAGEALLOC
+static unsigned long max_phys_bits = 40;
+
+bool kern_addr_valid(unsigned long addr)
+{
+	unsigned long above = ((long)addr) >> max_phys_bits;
+	pgd_t *pgd;
+	pud_t *pud;
+	pmd_t *pmd;
+	pte_t *pte;
+
+	if (above != 0 && above != -1UL)
+		return false;
+
+	if (addr >= (unsigned long) KERNBASE &&
+	    addr < (unsigned long)&_end)
+		return true;
+
+	if (addr >= PAGE_OFFSET) {
+		unsigned long pa = __pa(addr);
+
+		return pfn_valid(pa >> PAGE_SHIFT);
+	}
+
+	pgd = pgd_offset_k(addr);
+	if (pgd_none(*pgd))
+		return 0;
+
+	pud = pud_offset(pgd, addr);
+	if (pud_none(*pud))
+		return 0;
+
+	if (pud_large(*pud))
+		return pfn_valid(pud_pfn(*pud));
+
+	pmd = pmd_offset(pud, addr);
+	if (pmd_none(*pmd))
+		return 0;
+
+	if (pmd_large(*pmd))
+		return pfn_valid(pmd_pfn(*pmd));
+
+	pte = pte_offset_kernel(pmd, addr);
+	if (pte_none(*pte))
+		return 0;
+
+	return pfn_valid(pte_pfn(*pte));
+}
+EXPORT_SYMBOL(kern_addr_valid);
+
+static unsigned long __ref kernel_map_hugepud(unsigned long vstart,
+					      unsigned long vend,
+					      pud_t *pud)
+{
+	const unsigned long mask16gb = (1UL << 34) - 1UL;
+	u64 pte_val = vstart;
+
+	/* Each PUD is 8GB */
+	if ((vstart & mask16gb) ||
+	    (vend - vstart <= mask16gb)) {
+		pte_val ^= kern_linear_pte_xor[2];
+		pud_val(*pud) = pte_val | _PAGE_PUD_HUGE;
+
+		return vstart + PUD_SIZE;
+	}
+
+	pte_val ^= kern_linear_pte_xor[3];
+	pte_val |= _PAGE_PUD_HUGE;
+
+	vend = vstart + mask16gb + 1UL;
+	while (vstart < vend) {
+		pud_val(*pud) = pte_val;
+
+		pte_val += PUD_SIZE;
+		vstart += PUD_SIZE;
+		pud++;
+	}
+	return vstart;
+}
+
+static bool kernel_can_map_hugepud(unsigned long vstart, unsigned long vend,
+				   bool guard)
+{
+	if (guard && !(vstart & ~PUD_MASK) && (vend - vstart) >= PUD_SIZE)
+		return true;
+
+	return false;
+}
+
+static unsigned long __ref kernel_map_hugepmd(unsigned long vstart,
+					      unsigned long vend,
+					      pmd_t *pmd)
+{
+	const unsigned long mask256mb = (1UL << 28) - 1UL;
+	const unsigned long mask2gb = (1UL << 31) - 1UL;
+	u64 pte_val = vstart;
+
+	/* Each PMD is 8MB */
+	if ((vstart & mask256mb) ||
+	    (vend - vstart <= mask256mb)) {
+		pte_val ^= kern_linear_pte_xor[0];
+		pmd_val(*pmd) = pte_val | _PAGE_PMD_HUGE;
+
+		return vstart + PMD_SIZE;
+	}
+
+	if ((vstart & mask2gb) ||
+	    (vend - vstart <= mask2gb)) {
+		pte_val ^= kern_linear_pte_xor[1];
+		pte_val |= _PAGE_PMD_HUGE;
+		vend = vstart + mask256mb + 1UL;
+	} else {
+		pte_val ^= kern_linear_pte_xor[2];
+		pte_val |= _PAGE_PMD_HUGE;
+		vend = vstart + mask2gb + 1UL;
+	}
+
+	while (vstart < vend) {
+		pmd_val(*pmd) = pte_val;
+
+		pte_val += PMD_SIZE;
+		vstart += PMD_SIZE;
+		pmd++;
+	}
+
+	return vstart;
+}
+
+static bool kernel_can_map_hugepmd(unsigned long vstart, unsigned long vend,
+				   bool guard)
+{
+	if (guard && !(vstart & ~PMD_MASK) && (vend - vstart) >= PMD_SIZE)
+		return true;
+
+	return false;
+}
+
 static unsigned long __ref kernel_map_range(unsigned long pstart,
-					    unsigned long pend, pgprot_t prot)
+					    unsigned long pend, pgprot_t prot,
+					    bool use_huge)
 {
 	unsigned long vstart = PAGE_OFFSET + pstart;
 	unsigned long vend = PAGE_OFFSET + pend;
@@ -1394,15 +1526,23 @@ static unsigned long __ref kernel_map_range(unsigned long pstart,
 		if (pud_none(*pud)) {
 			pmd_t *new;
 
+			if (kernel_can_map_hugepud(vstart, vend, use_huge)) {
+				vstart = kernel_map_hugepud(vstart, vend, pud);
+				continue;
+			}
 			new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
 			alloc_bytes += PAGE_SIZE;
 			pud_populate(&init_mm, pud, new);
 		}
 
 		pmd = pmd_offset(pud, vstart);
-		if (!pmd_present(*pmd)) {
+		if (pmd_none(*pmd)) {
 			pte_t *new;
 
+			if (kernel_can_map_hugepmd(vstart, vend, use_huge)) {
+				vstart = kernel_map_hugepmd(vstart, vend, pmd);
+				continue;
+			}
 			new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
 			alloc_bytes += PAGE_SIZE;
 			pmd_populate_kernel(&init_mm, pmd, new);
@@ -1425,100 +1565,34 @@ static unsigned long __ref kernel_map_range(unsigned long pstart,
 	return alloc_bytes;
 }
 
-extern unsigned int kvmap_linear_patch[1];
-#endif /* CONFIG_DEBUG_PAGEALLOC */
-
-static void __init kpte_set_val(unsigned long index, unsigned long val)
-{
-	unsigned long *ptr = kpte_linear_bitmap;
-
-	val <<= ((index % (BITS_PER_LONG / 2)) * 2);
-	ptr += (index / (BITS_PER_LONG / 2));
-
-	*ptr |= val;
-}
-
-static const unsigned long kpte_shift_min = 28; /* 256MB */
-static const unsigned long kpte_shift_max = 34; /* 16GB */
-static const unsigned long kpte_shift_incr = 3;
-
-static unsigned long kpte_mark_using_shift(unsigned long start, unsigned long end,
-					   unsigned long shift)
+static void __init flush_all_kernel_tsbs(void)
 {
-	unsigned long size = (1UL << shift);
-	unsigned long mask = (size - 1UL);
-	unsigned long remains = end - start;
-	unsigned long val;
-
-	if (remains < size || (start & mask))
-		return start;
-
-	/* VAL maps:
-	 *
-	 *	shift 28 --> kern_linear_pte_xor index 1
-	 *	shift 31 --> kern_linear_pte_xor index 2
-	 *	shift 34 --> kern_linear_pte_xor index 3
-	 */
-	val = ((shift - kpte_shift_min) / kpte_shift_incr) + 1;
-
-	remains &= ~mask;
-	if (shift != kpte_shift_max)
-		remains = size;
-
-	while (remains) {
-		unsigned long index = start >> kpte_shift_min;
+	int i;
 
-		kpte_set_val(index, val);
+	for (i = 0; i < KERNEL_TSB_NENTRIES; i++) {
+		struct tsb *ent = &swapper_tsb[i];
 
-		start += 1UL << kpte_shift_min;
-		remains -= 1UL << kpte_shift_min;
+		ent->tag = (1UL << TSB_TAG_INVALID_BIT);
 	}
+#ifndef CONFIG_DEBUG_PAGEALLOC
+	for (i = 0; i < KERNEL_TSB4M_NENTRIES; i++) {
+		struct tsb *ent = &swapper_4m_tsb[i];
 
-	return start;
-}
-
-static void __init mark_kpte_bitmap(unsigned long start, unsigned long end)
-{
-	unsigned long smallest_size, smallest_mask;
-	unsigned long s;
-
-	smallest_size = (1UL << kpte_shift_min);
-	smallest_mask = (smallest_size - 1UL);
-
-	while (start < end) {
-		unsigned long orig_start = start;
-
-		for (s = kpte_shift_max; s >= kpte_shift_min; s -= kpte_shift_incr) {
-			start = kpte_mark_using_shift(start, end, s);
-
-			if (start != orig_start)
-				break;
-		}
-
-		if (start == orig_start)
-			start = (start + smallest_size) & ~smallest_mask;
+		ent->tag = (1UL << TSB_TAG_INVALID_BIT);
 	}
+#endif
 }
 
-static void __init init_kpte_bitmap(void)
-{
-	unsigned long i;
-
-	for (i = 0; i < pall_ents; i++) {
-		unsigned long phys_start, phys_end;
-
-		phys_start = pall[i].phys_addr;
-		phys_end = phys_start + pall[i].reg_size;
-
-		mark_kpte_bitmap(phys_start, phys_end);
-	}
-}
+extern unsigned int kvmap_linear_patch[1];
 
 static void __init kernel_physical_mapping_init(void)
 {
-#ifdef CONFIG_DEBUG_PAGEALLOC
 	unsigned long i, mem_alloced = 0UL;
+	bool use_huge = true;
 
+#ifdef CONFIG_DEBUG_PAGEALLOC
+	use_huge = false;
+#endif
 	for (i = 0; i < pall_ents; i++) {
 		unsigned long phys_start, phys_end;
 
@@ -1526,7 +1600,7 @@ static void __init kernel_physical_mapping_init(void)
 		phys_end = phys_start + pall[i].reg_size;
 
 		mem_alloced += kernel_map_range(phys_start, phys_end,
-						PAGE_KERNEL);
+						PAGE_KERNEL, use_huge);
 	}
 
 	printk("Allocated %ld bytes for kernel page tables.\n",
@@ -1535,8 +1609,9 @@ static void __init kernel_physical_mapping_init(void)
 	kvmap_linear_patch[0] = 0x01000000; /* nop */
 	flushi(&kvmap_linear_patch[0]);
 
+	flush_all_kernel_tsbs();
+
 	__flush_tlb_all();
-#endif
 }
 
 #ifdef CONFIG_DEBUG_PAGEALLOC
@@ -1546,7 +1621,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
 	unsigned long phys_end = phys_start + (numpages * PAGE_SIZE);
 
 	kernel_map_range(phys_start, phys_end,
-			 (enable ? PAGE_KERNEL : __pgprot(0)));
+			 (enable ? PAGE_KERNEL : __pgprot(0)), false);
 
 	flush_tsb_kernel_range(PAGE_OFFSET + phys_start,
 			       PAGE_OFFSET + phys_end);
@@ -1574,62 +1649,11 @@ unsigned long __init find_ecache_flush_span(unsigned long size)
 unsigned long PAGE_OFFSET;
 EXPORT_SYMBOL(PAGE_OFFSET);
 
-static void __init page_offset_shift_patch_one(unsigned int *insn, unsigned long phys_bits)
-{
-	unsigned long final_shift;
-	unsigned int val = *insn;
-	unsigned int cnt;
-
-	/* We are patching in ilog2(max_supported_phys_address), and
-	 * we are doing so in a manner similar to a relocation addend.
-	 * That is, we are adding the shift value to whatever value
-	 * is in the shift instruction count field already.
-	 */
-	cnt = (val & 0x3f);
-	val &= ~0x3f;
-
-	/* If we are trying to shift >= 64 bits, clear the destination
-	 * register.  This can happen when phys_bits ends up being equal
-	 * to MAX_PHYS_ADDRESS_BITS.
-	 */
-	final_shift = (cnt + (64 - phys_bits));
-	if (final_shift >= 64) {
-		unsigned int rd = (val >> 25) & 0x1f;
-
-		val = 0x80100000 | (rd << 25);
-	} else {
-		val |= final_shift;
-	}
-	*insn = val;
-
-	__asm__ __volatile__("flush	%0"
-			     : /* no outputs */
-			     : "r" (insn));
-}
-
-static void __init page_offset_shift_patch(unsigned long phys_bits)
-{
-	extern unsigned int __page_offset_shift_patch;
-	extern unsigned int __page_offset_shift_patch_end;
-	unsigned int *p;
-
-	p = &__page_offset_shift_patch;
-	while (p < &__page_offset_shift_patch_end) {
-		unsigned int *insn = (unsigned int *)(unsigned long)*p;
-
-		page_offset_shift_patch_one(insn, phys_bits);
-
-		p++;
-	}
-}
-
 unsigned long sparc64_va_hole_top =    0xfffff80000000000UL;
 unsigned long sparc64_va_hole_bottom = 0x0000080000000000UL;
 
 static void __init setup_page_offset(void)
 {
-	unsigned long max_phys_bits = 40;
-
 	if (tlb_type == cheetah || tlb_type == cheetah_plus) {
 		/* Cheetah/Panther support a full 64-bit virtual
 		 * address, so we can use all that our page tables
@@ -1678,8 +1702,6 @@ static void __init setup_page_offset(void)
 
 	pr_info("PAGE_OFFSET is 0x%016lx (max_phys_bits == %lu)\n",
 		PAGE_OFFSET, max_phys_bits);
-
-	page_offset_shift_patch(max_phys_bits);
 }
 
 static void __init tsb_phys_patch(void)
@@ -1724,7 +1746,6 @@ static void __init tsb_phys_patch(void)
 #define NUM_KTSB_DESCR	1
 #endif
 static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR];
-extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];
 
 /* The swapper TSBs are loaded with a base sequence of:
  *
@@ -2023,11 +2044,9 @@ void __init paging_init(void)
 
 	pmd = swapper_low_pmd_dir + (shift / sizeof(pmd_t));
 	pud_set(&swapper_pud_dir[0], pmd);
-	
+
 	inherit_prom_mappings();
 	
-	init_kpte_bitmap();
-
 	/* Ok, we can use our TLB miss and window trap handlers safely.  */
 	setup_tba();
 
@@ -2134,70 +2153,6 @@ int page_in_phys_avail(unsigned long paddr)
 	return 0;
 }
 
-static struct linux_prom64_registers pavail_rescan[MAX_BANKS] __initdata;
-static int pavail_rescan_ents __initdata;
-
-/* Certain OBP calls, such as fetching "available" properties, can
- * claim physical memory.  So, along with initializing the valid
- * address bitmap, what we do here is refetch the physical available
- * memory list again, and make sure it provides at least as much
- * memory as 'pavail' does.
- */
-static void __init setup_valid_addr_bitmap_from_pavail(unsigned long *bitmap)
-{
-	int i;
-
-	read_obp_memory("available", &pavail_rescan[0], &pavail_rescan_ents);
-
-	for (i = 0; i < pavail_ents; i++) {
-		unsigned long old_start, old_end;
-
-		old_start = pavail[i].phys_addr;
-		old_end = old_start + pavail[i].reg_size;
-		while (old_start < old_end) {
-			int n;
-
-			for (n = 0; n < pavail_rescan_ents; n++) {
-				unsigned long new_start, new_end;
-
-				new_start = pavail_rescan[n].phys_addr;
-				new_end = new_start +
-					pavail_rescan[n].reg_size;
-
-				if (new_start <= old_start &&
-				    new_end >= (old_start + PAGE_SIZE)) {
-					set_bit(old_start >> ILOG2_4MB, bitmap);
-					goto do_next_page;
-				}
-			}
-
-			prom_printf("mem_init: Lost memory in pavail\n");
-			prom_printf("mem_init: OLD start[%lx] size[%lx]\n",
-				    pavail[i].phys_addr,
-				    pavail[i].reg_size);
-			prom_printf("mem_init: NEW start[%lx] size[%lx]\n",
-				    pavail_rescan[i].phys_addr,
-				    pavail_rescan[i].reg_size);
-			prom_printf("mem_init: Cannot continue, aborting.\n");
-			prom_halt();
-
-		do_next_page:
-			old_start += PAGE_SIZE;
-		}
-	}
-}
-
-static void __init patch_tlb_miss_handler_bitmap(void)
-{
-	extern unsigned int valid_addr_bitmap_insn[];
-	extern unsigned int valid_addr_bitmap_patch[];
-
-	valid_addr_bitmap_insn[1] = valid_addr_bitmap_patch[1];
-	mb();
-	valid_addr_bitmap_insn[0] = valid_addr_bitmap_patch[0];
-	flushi(&valid_addr_bitmap_insn[0]);
-}
-
 static void __init register_page_bootmem_info(void)
 {
 #ifdef CONFIG_NEED_MULTIPLE_NODES
@@ -2210,18 +2165,6 @@ static void __init register_page_bootmem_info(void)
 }
 void __init mem_init(void)
 {
-	unsigned long addr, last;
-
-	addr = PAGE_OFFSET + kern_base;
-	last = PAGE_ALIGN(kern_size) + addr;
-	while (addr < last) {
-		set_bit(__pa(addr) >> ILOG2_4MB, sparc64_valid_addr_bitmap);
-		addr += PAGE_SIZE;
-	}
-
-	setup_valid_addr_bitmap_from_pavail(sparc64_valid_addr_bitmap);
-	patch_tlb_miss_handler_bitmap();
-
 	high_memory = __va(last_valid_pfn << PAGE_SHIFT);
 
 	register_page_bootmem_info();
diff --git a/arch/sparc/mm/init_64.h b/arch/sparc/mm/init_64.h
index 5d3782de..3ccbf92 100644
--- a/arch/sparc/mm/init_64.h
+++ b/arch/sparc/mm/init_64.h
@@ -8,15 +8,8 @@
  */
 
 #define MAX_PHYS_ADDRESS	(1UL << MAX_PHYS_ADDRESS_BITS)
-#define KPTE_BITMAP_CHUNK_SZ		(256UL * 1024UL * 1024UL)
-#define KPTE_BITMAP_BYTES	\
-	((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 4)
-#define VALID_ADDR_BITMAP_CHUNK_SZ	(4UL * 1024UL * 1024UL)
-#define VALID_ADDR_BITMAP_BYTES	\
-	((MAX_PHYS_ADDRESS / VALID_ADDR_BITMAP_CHUNK_SZ) / 8)
 
 extern unsigned long kern_linear_pte_xor[4];
-extern unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
 extern unsigned int sparc64_highest_unlocked_tlb_ent;
 extern unsigned long sparc64_kern_pri_context;
 extern unsigned long sparc64_kern_pri_nuc_bits;
-- 
1.9.1


  parent reply	other threads:[~2014-11-06 23:10 UTC|newest]

Thread overview: 170+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-06 22:34 [3.13.y.z extended stable] Linux 3.13.11.11 stable review Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 001/162] netlink: reset network header before passing to taps Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 002/162] rtnetlink: fix VF info size Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 003/162] myri10ge: check for DMA mapping errors Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 004/162] tcp: don't use timestamp from repaired skb-s to calculate RTT (v2) Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 005/162] sit: Fix ipip6_tunnel_lookup device matching criteria Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 006/162] tcp: fix tcp_release_cb() to dispatch via address family for mtu_reduced() Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 007/162] tcp: fix ssthresh and undo for consecutive short FRTO episodes Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 008/162] packet: handle too big packets for PACKET_V3 Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 009/162] openvswitch: fix panic with multiple vlan headers Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 010/162] vxlan: fix incorrect initializer in union vxlan_addr Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 011/162] l2tp: fix race while getting PMTU on PPP pseudo-wire Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 012/162] bonding: fix div by zero while enslaving and transmitting Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 013/162] bridge: Check if vlan filtering is enabled only once Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 014/162] bridge: Fix br_should_learn to check vlan_enabled Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 015/162] net: allow macvlans to move to net namespace Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 016/162] tg3: Work around HW/FW limitations with vlan encapsulated frames Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 017/162] tg3: Allow for recieve of full-size 8021AD frames Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 018/162] xfrm: Generate blackhole routes only from route lookup functions Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 019/162] xfrm: Generate queueing " Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 020/162] macvtap: Fix race between device delete and open Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 021/162] Revert "net/macb: add pinctrl consumer support" Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 022/162] gro: fix aggregation for skb using frag_list Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 023/162] hyperv: Fix a bug in netvsc_start_xmit() Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 024/162] ip6_gre: fix flowi6_proto value in xmit path Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 025/162] team: avoid race condition in scheduling delayed work Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 026/162] sctp: handle association restarts when the socket is closed Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 027/162] tcp: fixing TLP's FIN recovery Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 028/162] sparc64: Do not disable interrupts in nmi_cpu_busy() Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 029/162] sparc64: Fix pcr_ops initialization and usage bugs Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 030/162] sparc32: dma_alloc_coherent must honour gfp flags Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 031/162] sparc64: sun4v TLB error power off events Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 032/162] sparc64: Fix corrupted thread fault code Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 033/162] sparc64: find_node adjustment Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 034/162] sparc64: Move request_irq() from ldc_bind() to ldc_alloc() Kamal Mostafa
2014-11-06 22:34 ` [PATCH 3.13 035/162] sparc: Let memset return the address argument Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 036/162] sparc64: Fix reversed start/end in flush_tlb_kernel_range() Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 037/162] sparc64: Fix lockdep warnings on reboot on Ultra-5 Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 038/162] sparc64: Fix FPU register corruption with AES crypto offload Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 039/162] sparc64: Do not define thread fpregs save area as zero-length array Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 040/162] sparc64: Fix hibernation code refrence to PAGE_OFFSET Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 041/162] sparc64: correctly recognise M6 and M7 cpu type Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 042/162] sparc64: support M6 and M7 for building CPU distribution map Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 043/162] sparc64: cpu hardware caps support for sparc M6 and M7 Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 044/162] sparc64: T5 PMU Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 045/162] sparc64: Switch to 4-level page tables Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 046/162] sparc64: Define VA hole at run time, rather than at compile time Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 047/162] sparc64: Adjust KTSB assembler to support larger physical addresses Kamal Mostafa
2014-11-06 22:35 ` Kamal Mostafa [this message]
2014-11-06 22:35 ` [PATCH 3.13 049/162] sparc64: Use kernel page tables for vmemmap Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 050/162] sparc64: Increase MAX_PHYS_ADDRESS_BITS to 53 Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 051/162] sparc64: Adjust vmalloc region size based upon available virtual address bits Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 052/162] sparc64: sparse irq Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 053/162] sparc64: Kill unnecessary tables and increase MAX_BANKS Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 054/162] sparc64: Increase size of boot string to 1024 bytes Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 055/162] sparc64: Fix register corruption in top-most kernel stack frame during boot Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 056/162] sparc64: Implement __get_user_pages_fast() Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 057/162] ext4: check EA value offset when loading Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 058/162] jbd2: free bh when descriptor block checksum fails Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 059/162] ext4: don't check quota format when there are no quota files Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 060/162] target: Fix queue full status NULL pointer for SCF_TRANSPORT_TASK_SENSE Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 061/162] vfs: fix data corruption when blocksize < pagesize for mmaped data Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 062/162] ext4: fix mmap data corruption when blocksize < pagesize Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 063/162] ext4: grab missed write_count for EXT4_IOC_SWAP_BOOT Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 064/162] qla_target: don't delete changed nacls Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 065/162] target: Fix APTPL metadata handling for dynamic MappedLUNs Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 066/162] iser-target: Disable TX completion interrupt coalescing Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 067/162] ext4: don't orphan or truncate the boot loader inode Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 068/162] ext4: add ext4_iget_normal() which is to be used for dir tree lookups Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 069/162] ext4: fix reservation overflow in ext4_da_write_begin Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 070/162] ext4: Replace open coded mdata csum feature to helper function Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 071/162] ext4: move error report out of atomic context in ext4_init_block_bitmap() Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 072/162] ARC: [nsimosci] Allow "headless" models to boot Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 073/162] ARC: Update order of registers in KGDB to match GDB 7.5 Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 074/162] ext4: check s_chksum_driver when looking for bg csum presence Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 075/162] drm/radeon: fix speaker allocation setup Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 076/162] drm/radeon: use gart memory for DMA ring tests Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 077/162] compiler: define OPTIMIZER_HIDE_VAR() macro Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 078/162] random: add and use memzero_explicit() for clearing data Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 079/162] ALSA: pcm: use the same dma mmap codepath both for arm and arm64 Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 080/162] ALSA: ALC283 codec - Avoid pop noise on headphones during suspend/resume Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 081/162] ALSA: usb-audio: Add support for Steinberg UR22 USB interface Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 082/162] ALSA: hda - hdmi: Fix missing ELD change event on plug/unplug Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 083/162] arm64: compat: fix compat types affecting struct compat_elf_prpsinfo Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 084/162] freezer: Do not freeze tasks killed by OOM killer Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 085/162] OOM, PM: OOM killed task shouldn't escape PM suspend Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 086/162] qxl: don't create too large primary surface Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 087/162] MIPS: tlbex: Properly fix HUGE TLB Refill exception handler Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 088/162] drm/cirrus: bind also to qemu-xen-traditional Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 089/162] cpufreq: intel_pstate: Fix setting max_perf_pct in performance policy Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 090/162] cpufreq: expose scaling_cur_freq sysfs file for set_policy() drivers Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 091/162] cpufreq: intel_pstate: Reflect current no_turbo state correctly Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 092/162] intel_pstate: Don't lose sysfs settings during cpu offline Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 093/162] intel_pstate: Fix BYT frequency reporting Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 094/162] intel_pstate: Correct BYT VID values Kamal Mostafa
2014-11-06 22:35 ` [PATCH 3.13 095/162] MIPS: ftrace: Fix a microMIPS build problem Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 096/162] KVM: x86: Check non-canonical addresses upon WRMSR Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 097/162] KVM: x86: Prevent host from panicking on shared MSR writes Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 098/162] KVM: x86: Improve thread safety in pit Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 099/162] KVM: x86: Fix wrong masking on relative jump/call Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 100/162] KVM: x86: Emulator fixes for eip canonical checks on near branches Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 101/162] kvm: vmx: handle invvpid vm exit gracefully Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 102/162] kvm: x86: don't kill guest on unknown exit reason Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 103/162] kvm: fix excessive pages un-pinning in kvm_iommu_map error path Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 104/162] KVM: x86: use new CS.RPL as CPL during task switch Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 105/162] KVM: x86: Handle errors when RIP is set during far jumps Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 106/162] KVM: x86: Fix far-jump to non-canonical check Kamal Mostafa
2014-12-29 23:58   ` Vinson Lee
2014-12-30 22:27     ` Nadav Amit
2015-01-13 18:38       ` Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 107/162] staging:iio:ad5933: Fix NULL pointer deref when enabling buffer Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 108/162] staging:iio:ad5933: Drop "raw" from channel names Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 109/162] iio: st_sensors: Fix buffer copy Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 110/162] iio: mxs-lradc: Propagate the real error code on platform_get_irq() failure Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 111/162] iio: adc: mxs-lradc: Disable the clock on probe failure Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 112/162] spi: pl022: Fix incorrect dma_unmap_sg Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 113/162] mac80211: fix typo in starting baserate for rts_cts_rate_idx Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 114/162] usb: dwc3: gadget: fix set_halt() bug with pending transfers Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 115/162] usb: gadget: function: acm: make f_acm pass USB20CV Chapter9 Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 116/162] ext3: Don't check quota format when there are no quota files Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 117/162] quota: Properly return errors from dquot_writeback_dquots() Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 118/162] USB: serial: cp210x: add Silicon Labs 358x VID and PID Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 119/162] usb: serial: ftdi_sio: add Awinda Station and Dongle products Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 120/162] usb: option: add support for Telit LE910 Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 121/162] USB: option: add Haier CE81B CDMA modem Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 122/162] x86, apic: Handle a bad TSC more gracefully Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 123/162] i3200_edac: Report CE events properly Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 124/162] i82860_edac: " Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 125/162] cpc925_edac: Report UE " Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 126/162] e7xxx_edac: Report CE " Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 127/162] scsi: Fix error handling in SCSI_IOCTL_SEND_COMMAND Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 128/162] usb: serial: ftdi_sio: add "bricked" FTDI device PID Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 129/162] usb: musb: cppi41: restart hrtimer only if not yet done Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 130/162] usb: gadget: udc: core: fix kernel oops with soft-connect Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 131/162] nfsd4: fix crash on unknown operation number Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 132/162] iwlwifi: configure the LTR Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 133/162] mac80211: add vif to flush call Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 134/162] iwlwifi: dvm: drop non VO frames when flushing Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 135/162] Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate" Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 136/162] usb: dwc3: gadget: Properly initialize LINK TRB Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 137/162] Input: i8042 - quirks for Fujitsu Lifebook A544 and Lifebook AH544 Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 138/162] posix-timers: Fix stack info leak in timer_create() Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 139/162] futex: Fix a race condition between REQUEUE_PI and task death Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 140/162] PM / Sleep: fix recovery during resuming from hibernation Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 141/162] ALSA: pcm: Zero-clear reserved fields of PCM status ioctl in compat mode Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 142/162] ima: check xattr value length and type in the ima_inode_setxattr() Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 143/162] evm: check xattr value length and type in evm_inode_setxattr() Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 144/162] drm/radeon/dpm: disable ulv support on SI Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 145/162] drm/radeon: dpm fixes for asrock systems Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 146/162] drm/radeon: remove invalid pci id Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 147/162] x86, pageattr: Prevent overflow in slow_virt_to_phys() for X86_PAE Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 148/162] cgroup/kmemleak: add kmemleak_free() for cgroup deallocations Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 149/162] mm: free compound page with correct order Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 150/162] mm, thp: fix collapsing of hugepages on madvise Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 151/162] lib/bitmap.c: fix undefined shift in __bitmap_shift_{left|right}() Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 152/162] ext4: fix overflow when updating superblock backups after resize Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 153/162] ext4: fix oops when loading block bitmap failed Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 154/162] ext4: enable journal checksum when metadata checksum feature enabled Kamal Mostafa
2014-11-06 22:36 ` [PATCH 3.13 155/162] ext4: bail out from make_indexed_dir() on first error Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 156/162] PCI: Rename sysfs 'enabled' file back to 'enable' Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 157/162] wireless: rt2x00: add new rt2800usb device Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 158/162] fs: allow open(dir, O_TMPFILE|..., 0) with mode 0 Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 159/162] tracing/syscalls: Ignore numbers outside NR_syscalls' range Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 160/162] x86_64, entry: Fix out of bounds read on sysenter Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 161/162] ACPI / EC: Add support to disallow QR_EC to be issued when SCI_EVT isn't set Kamal Mostafa
2014-11-06 22:37 ` [PATCH 3.13 162/162] ACPI / EC: Fix regression due to conflicting firmware behavior between Samsung and Acer Kamal Mostafa
2014-11-07 17:29 ` [PATCH 3.13 115/165 corrected] usb: gadget: function: acm: make f_acm pass USB20CV Chapter9 Kamal Mostafa
2014-11-07 17:29 ` [PATCH 3.13 163/165] net: sctp: fix skb_over_panic when receiving malformed ASCONF chunks Kamal Mostafa
2014-11-07 17:29 ` [PATCH 3.13 164/165] net: sctp: fix panic on duplicate " Kamal Mostafa
2014-11-07 17:29 ` [PATCH 3.13 165/165] net: sctp: fix remote memory pressure from excessive queueing Kamal Mostafa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1415313426-9622-49-git-send-email-kamal@canonical.com \
    --to=kamal@canonical.com \
    --cc=davem@davemloft.net \
    --cc=kernel-team@lists.ubuntu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®