Received: from mail.onstor.com (66.201.51.107) by exch1.onstor.net
 (10.0.0.225) with Microsoft SMTP Server id 8.1.311.2; Sat, 25 Apr 2009
 02:25:31 -0700
Received: from psmtp.com ([64.18.0.105]) by mail.onstor.com with Microsoft
 SMTPSVC(6.0.3790.3959);	 Sat, 25 Apr 2009 02:25:30 -0700
Received: from source ([213.58.128.207]) by exprod5mx281.postini.com
 ([64.18.4.13]) with SMTP;	Sat, 25 Apr 2009 03:25:30 MDT
Received: from localhost.localdomain ([127.0.0.1]:23451 "EHLO
	ftp.linux-mips.org") by ftp.linux-mips.org with ESMTP	id S20021903AbZDYJZI
 (ORCPT <rfc822;andy.sharp@onstor.com>);	Sat, 25 Apr 2009 10:25:08 +0100
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 25 Apr 2009 10:24:51
 +0100 (BST)
Received: from localhost.localdomain ([127.0.0.1]:22939 "EHLO
 h5.dl5rb.org.uk")	by ftp.linux-mips.org with ESMTP id S20021892AbZDYJYt
 (ORCPT	<rfc822;linux-mips@linux-mips.org>); Sat, 25 Apr 2009 10:24:49 +0100
Received: from h5.dl5rb.org.uk (localhost.localdomain [127.0.0.1])	by
 h5.dl5rb.org.uk (8.14.3/8.14.3) with ESMTP id n3P9OlVC009865;	Sat, 25 Apr
 2009 11:24:47 +0200
Received: (from ralf@localhost)	by h5.dl5rb.org.uk (8.14.3/8.14.3/Submit) id
 n3P9Ok37009862;	Sat, 25 Apr 2009 11:24:46 +0200
From: Ralf Baechle <ralf@linux-mips.org>
To: Jon Fraser <jfraser@broadcom.com>
CC: "linux-mips@linux-mips.org" <linux-mips@linux-mips.org>
Sender: "linux-mips-bounce@linux-mips.org" <linux-mips-bounce@linux-mips.org>
Date: Sat, 25 Apr 2009 02:24:46 -0700
Subject: Re: HIGHMEM fix for r24k
Thread-Topic: HIGHMEM fix for r24k
Thread-Index: AcnFh8d/XpSFSeOnT9uxk7OirNcx7w==
Message-ID: <20090425092446.GA9845@linux-mips.org>
References: <1240525424.15448.33.camel@chaos.ne.broadcom.com>
 <20090424154349.GB3614@linux-mips.org>
 <1240589632.15448.38.camel@chaos.ne.broadcom.com>
In-Reply-To: <1240589632.15448.38.camel@chaos.ne.broadcom.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 0b
X-MS-Exchange-Organization-AuthSource: exch1.onstor.net
X-MS-Has-Attach:
X-Auto-Response-Suppress: All
X-MS-TNEF-Correlator:
x-originalarrivaltime: 25 Apr 2009 09:25:30.0828 (UTC)
 FILETIME=[C71838C0:01C9C587]
user-agent: Mutt/1.5.18 (2008-05-17)
errors-to: linux-mips-bounce@linux-mips.org
x-pstn-levels: (S:99.90000/99.90000 CV: 7.8455 FC:95.5390 LC:95.5390
 R:95.9108 P:95.9108 M:97.0282 C:98.6951 )
x-pstn-neptune: 2/1/0.50/62
x-ems-proccessed: 2K3Xl1OQTInXD6xxuA8z3Q==
x-ems-stamp: pO0lcZ9iD0cMADgllLK7gw==
x-list: linux-mips
x-archive-position: 22479
x-ecartis-version: Ecartis v1.0.0
x-original-sender: ralf@linux-mips.org
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

On Fri, Apr 24, 2009 at 12:13:52PM -0400, Jon Fraser wrote:

> That's why I haven't proposed a fix yet.  But there are other people
> dealing with the same HIGHMEM issues and I wanted them to know about the
> problem.

Can you test below fix?  Thanks,

  Ralf

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

 arch/mips/include/asm/fixmap.h  |    3 +++
 arch/mips/include/asm/highmem.h |    6 ++++--
 arch/mips/mm/highmem.c          |   25 +++++++++++++++++++------
 arch/mips/mm/init.c             |   26 --------------------------
 4 files changed, 26 insertions(+), 34 deletions(-)

diff --git a/arch/mips/include/asm/fixmap.h b/arch/mips/include/asm/fixmap.=
h
index 9cc8522..0f5caa1 100644
--- a/arch/mips/include/asm/fixmap.h
+++ b/arch/mips/include/asm/fixmap.h
@@ -108,6 +108,9 @@ static inline unsigned long virt_to_fix(const unsigned =
long vaddr)
 	return __virt_to_fix(vaddr);
 }
=20
+#define kmap_get_fixmap_pte(vaddr)					\
+	pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (v=
addr)), (vaddr))
+
 /*
  * Called from pgtable_init()
  */
diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highme=
m.h
index 4374ab2..25adfb0 100644
--- a/arch/mips/include/asm/highmem.h
+++ b/arch/mips/include/asm/highmem.h
@@ -30,8 +30,6 @@
 /* declarations for highmem.c */
 extern unsigned long highstart_pfn, highend_pfn;
=20
-extern pte_t *kmap_pte;
-extern pgprot_t kmap_prot;
 extern pte_t *pkmap_page_table;
=20
 /*
@@ -62,6 +60,10 @@ extern struct page *__kmap_atomic_to_page(void *ptr);
=20
 #define flush_cache_kmaps()	flush_cache_all()
=20
+extern void kmap_init(void);
+
+#define kmap_prot PAGE_KERNEL
+
 #endif /* __KERNEL__ */
=20
 #endif /* _ASM_HIGHMEM_H */
diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c
index 4481656..2b1309b 100644
--- a/arch/mips/mm/highmem.c
+++ b/arch/mips/mm/highmem.c
@@ -1,7 +1,12 @@
 #include <linux/module.h>
 #include <linux/highmem.h>
+#include <asm/fixmap.h>
 #include <asm/tlbflush.h>
=20
+static pte_t *kmap_pte;
+
+unsigned long highstart_pfn, highend_pfn;
+
 void *__kmap(struct page *page)
 {
 	void *addr;
@@ -14,6 +19,7 @@ void *__kmap(struct page *page)
=20
 	return addr;
 }
+EXPORT_SYMBOL(__kmap);
=20
 void __kunmap(struct page *page)
 {
@@ -22,6 +28,7 @@ void __kunmap(struct page *page)
 		return;
 	kunmap_high(page);
 }
+EXPORT_SYMBOL(__kunmap);
=20
 /*
  * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap beca=
use
@@ -48,11 +55,12 @@ void *__kmap_atomic(struct page *page, enum km_type typ=
e)
 #ifdef CONFIG_DEBUG_HIGHMEM
 	BUG_ON(!pte_none(*(kmap_pte - idx)));
 #endif
-	set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
+	set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL));
 	local_flush_tlb_one((unsigned long)vaddr);
=20
 	return (void*) vaddr;
 }
+EXPORT_SYMBOL(__kmap_atomic);
=20
 void __kunmap_atomic(void *kvaddr, enum km_type type)
 {
@@ -77,6 +85,7 @@ void __kunmap_atomic(void *kvaddr, enum km_type type)
=20
 	pagefault_enable();
 }
+EXPORT_SYMBOL(__kunmap_atomic);
=20
 /*
  * This is the same as kmap_atomic() but can map memory that doesn't
@@ -92,7 +101,7 @@ void *kmap_atomic_pfn(unsigned long pfn, enum km_type ty=
pe)
 	debug_kmap_atomic(type);
 	idx =3D type + KM_TYPE_NR*smp_processor_id();
 	vaddr =3D __fix_to_virt(FIX_KMAP_BEGIN + idx);
-	set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
+	set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
 	flush_tlb_one(vaddr);
=20
 	return (void*) vaddr;
@@ -111,7 +120,11 @@ struct page *__kmap_atomic_to_page(void *ptr)
 	return pte_page(*pte);
 }
=20
-EXPORT_SYMBOL(__kmap);
-EXPORT_SYMBOL(__kunmap);
-EXPORT_SYMBOL(__kmap_atomic);
-EXPORT_SYMBOL(__kunmap_atomic);
+void __init kmap_init(void)
+{
+	unsigned long kmap_vstart;
+
+	/* cache the first kmap pte */
+	kmap_vstart =3D __fix_to_virt(FIX_KMAP_BEGIN);
+	kmap_pte =3D kmap_get_fixmap_pte(kmap_vstart);
+}
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index d934894..c551129 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -104,14 +104,6 @@ unsigned long setup_zero_pages(void)
 	return 1UL << order;
 }
=20
-/*
- * These are almost like kmap_atomic / kunmap_atmic except they take an
- * additional address argument as the hint.
- */
-
-#define kmap_get_fixmap_pte(vaddr)					\
-	pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (v=
addr)), (vaddr))
-
 #ifdef CONFIG_MIPS_MT_SMTC
 static pte_t *kmap_coherent_pte;
 static void __init kmap_coherent_init(void)
@@ -264,24 +256,6 @@ void copy_from_user_page(struct vm_area_struct *vma,
 	}
 }
=20
-#ifdef CONFIG_HIGHMEM
-unsigned long highstart_pfn, highend_pfn;
-
-pte_t *kmap_pte;
-pgprot_t kmap_prot;
-
-static void __init kmap_init(void)
-{
-	unsigned long kmap_vstart;
-
-	/* cache the first kmap pte */
-	kmap_vstart =3D __fix_to_virt(FIX_KMAP_BEGIN);
-	kmap_pte =3D kmap_get_fixmap_pte(kmap_vstart);
-
-	kmap_prot =3D PAGE_KERNEL;
-}
-#endif /* CONFIG_HIGHMEM */
-
 void __init fixrange_init(unsigned long start, unsigned long end,
 	pgd_t *pgd_base)
 {

