From: James Hogan <james.hogan@imgtec.com>
To: Paul Burton <paul.burton@imgtec.com>
Cc: <linux-mips@linux-mips.org>, Ralf Baechle <ralf@linux-mips.org>,
"Adam Buchbinder" <adam.buchbinder@gmail.com>,
David Daney <david.daney@cavium.com>,
"Maciej W. Rozycki" <macro@linux-mips.org>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>,
<linux-kernel@vger.kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
Markos Chandras <markos.chandras@imgtec.com>,
Alex Smith <alex.smith@imgtec.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 05/12] MIPS: mm: Standardise on _PAGE_NO_READ, drop _PAGE_READ
Date: Fri, 15 Apr 2016 22:22:00 +0100 [thread overview]
Message-ID: <20160415212200.GG7859@jhogan-linux.le.imgtec.org> (raw)
In-Reply-To: <1460716620-13382-6-git-send-email-paul.burton@imgtec.com>
[-- Attachment #1: Type: text/plain, Size: 8903 bytes --]
On Fri, Apr 15, 2016 at 11:36:53AM +0100, Paul Burton wrote:
> Ever since support for RI/XI was implemented by commit 6dd9344cfc41
> ("MIPS: Implement Read Inhibit/eXecute Inhibit") we've had a mixture of
> _PAGE_READ & _PAGE_NO_READ bits. Rather than keep both around, switch
> away from using _PAGE_READ to determine page presence & instead invert
> the use to _PAGE_NO_READ. Wherever we formerly had no definition for
> _PAGE_NO_READ, change what was _PAGE_READ to _PAGE_NO_READ. The end
> result is that we consistently use _PAGE_NO_READ to determine whether a
> page is readable, regardless of whether RI/XI is implemented.
>
> Signed-off-by: Paul Burton <paul.burton@imgtec.com>
> ---
>
> arch/mips/include/asm/pgtable-bits.h | 19 ++++---------------
> arch/mips/include/asm/pgtable.h | 23 +++++++----------------
> arch/mips/mm/tlbex.c | 13 ++++---------
> 3 files changed, 15 insertions(+), 40 deletions(-)
>
> diff --git a/arch/mips/include/asm/pgtable-bits.h b/arch/mips/include/asm/pgtable-bits.h
> index c81fc17..5bc663d 100644
> --- a/arch/mips/include/asm/pgtable-bits.h
> +++ b/arch/mips/include/asm/pgtable-bits.h
> @@ -49,7 +49,6 @@ enum pgtable_bits {
>
> /* Used only by software (masked out before writing EntryLo*) */
> _PAGE_PRESENT_SHIFT = 24,
> - _PAGE_READ_SHIFT,
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> _PAGE_MODIFIED_SHIFT,
> @@ -66,7 +65,7 @@ enum pgtable_bits {
> enum pgtable_bits {
> /* Used only by software (writes to EntryLo ignored) */
> _PAGE_PRESENT_SHIFT,
> - _PAGE_READ_SHIFT,
> + _PAGE_NO_READ_SHIFT,
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> _PAGE_MODIFIED_SHIFT,
> @@ -85,7 +84,7 @@ enum pgtable_bits {
> /* Used only by software (masked out before writing EntryLo*) */
> _PAGE_PRESENT_SHIFT,
> #if !defined(CONFIG_CPU_MIPSR2) && !defined(CONFIG_CPU_MIPSR6)
> - _PAGE_READ_SHIFT,
> + _PAGE_NO_READ_SHIFT,
> #endif
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> @@ -98,7 +97,6 @@ enum pgtable_bits {
> #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> _PAGE_NO_EXEC_SHIFT,
> _PAGE_NO_READ_SHIFT,
> - _PAGE_READ_SHIFT = _PAGE_NO_READ_SHIFT,
> #endif
> _PAGE_GLOBAL_SHIFT,
> _PAGE_VALID_SHIFT,
> @@ -110,11 +108,6 @@ enum pgtable_bits {
>
> /* Used only by software */
> #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> -# define _PAGE_READ (cpu_has_rixi ? 0 : (1 << _PAGE_READ_SHIFT))
> -#else
> -# define _PAGE_READ (1 << _PAGE_READ_SHIFT)
> -#endif
> #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
> #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
> #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
> @@ -125,11 +118,10 @@ enum pgtable_bits {
> /* Used by TLB hardware (placed in EntryLo*) */
> #if (defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32))
> # define _PAGE_NO_EXEC (1 << _PAGE_NO_EXEC_SHIFT)
> -# define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT)
> #elif defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> # define _PAGE_NO_EXEC (cpu_has_rixi ? (1 << _PAGE_NO_EXEC_SHIFT) : 0)
> -# define _PAGE_NO_READ (cpu_has_rixi ? (1 << _PAGE_NO_READ_SHIFT) : 0)
> #endif
> +#define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT)
> #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
> #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
> #define _PAGE_DIRTY (1 << _PAGE_DIRTY_SHIFT)
> @@ -145,9 +137,6 @@ enum pgtable_bits {
> #ifndef _PAGE_NO_EXEC
> #define _PAGE_NO_EXEC 0
> #endif
> -#ifndef _PAGE_NO_READ
> -#define _PAGE_NO_READ 0
> -#endif
>
> #define _PAGE_SILENT_READ _PAGE_VALID
> #define _PAGE_SILENT_WRITE _PAGE_DIRTY
> @@ -245,7 +234,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val)
> #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT)
> #endif
>
> -#define __READABLE (_PAGE_SILENT_READ | _PAGE_READ | _PAGE_ACCESSED)
> +#define __READABLE (_PAGE_SILENT_READ | _PAGE_ACCESSED)
> #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED)
>
> #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \
> diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h
> index 9a4fe01..1459ee9 100644
> --- a/arch/mips/include/asm/pgtable.h
> +++ b/arch/mips/include/asm/pgtable.h
> @@ -23,18 +23,19 @@
> struct mm_struct;
> struct vm_area_struct;
>
> -#define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT)
> -#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | \
> +#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_NO_READ | \
> + _CACHE_CACHABLE_NONCOHERENT)
> +#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
> _page_cachable_default)
> -#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_NO_EXEC | \
> +#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_NO_EXEC | \
> _page_cachable_default)
> -#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | \
> +#define PAGE_READONLY __pgprot(_PAGE_PRESENT | \
> _page_cachable_default)
> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
> _PAGE_GLOBAL | _page_cachable_default)
> #define PAGE_KERNEL_NC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
> _PAGE_GLOBAL | _CACHE_CACHABLE_NONCOHERENT)
> -#define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
> +#define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
> _page_cachable_default)
> #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \
> __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED)
> @@ -307,7 +308,7 @@ static inline pte_t pte_mkdirty(pte_t pte)
> static inline pte_t pte_mkyoung(pte_t pte)
> {
> pte.pte_low |= _PAGE_ACCESSED;
> - if (pte.pte_low & _PAGE_READ)
> + if (!(pte.pte_low & _PAGE_NO_READ))
> pte.pte_high |= _PAGE_SILENT_READ;
> return pte;
> }
> @@ -353,13 +354,8 @@ static inline pte_t pte_mkdirty(pte_t pte)
> static inline pte_t pte_mkyoung(pte_t pte)
> {
> pte_val(pte) |= _PAGE_ACCESSED;
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> if (!(pte_val(pte) & _PAGE_NO_READ))
> pte_val(pte) |= _PAGE_SILENT_READ;
> - else
> -#endif
> - if (pte_val(pte) & _PAGE_READ)
> - pte_val(pte) |= _PAGE_SILENT_READ;
> return pte;
> }
>
> @@ -542,13 +538,8 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
> {
> pmd_val(pmd) |= _PAGE_ACCESSED;
>
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> if (!(pmd_val(pmd) & _PAGE_NO_READ))
> pmd_val(pmd) |= _PAGE_SILENT_READ;
> - else
> -#endif
> - if (pmd_val(pmd) & _PAGE_READ)
> - pmd_val(pmd) |= _PAGE_SILENT_READ;
>
> return pmd;
> }
> diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
> index 86aa7c2..7e3272f 100644
> --- a/arch/mips/mm/tlbex.c
> +++ b/arch/mips/mm/tlbex.c
> @@ -234,20 +234,16 @@ static void output_pgtable_bits_defines(void)
> pr_debug("\n");
>
> pr_define("_PAGE_PRESENT_SHIFT %d\n", _PAGE_PRESENT_SHIFT);
> - pr_define("_PAGE_READ_SHIFT %d\n", _PAGE_READ_SHIFT);
> + pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT);
> pr_define("_PAGE_WRITE_SHIFT %d\n", _PAGE_WRITE_SHIFT);
> pr_define("_PAGE_ACCESSED_SHIFT %d\n", _PAGE_ACCESSED_SHIFT);
> pr_define("_PAGE_MODIFIED_SHIFT %d\n", _PAGE_MODIFIED_SHIFT);
> #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
> pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT);
> #endif
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> - if (cpu_has_rixi) {
> #ifdef _PAGE_NO_EXEC_SHIFT
> + if (cpu_has_rixi)
> pr_define("_PAGE_NO_EXEC_SHIFT %d\n", _PAGE_NO_EXEC_SHIFT);
> - pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT);
> -#endif
> - }
> #endif
> pr_define("_PAGE_GLOBAL_SHIFT %d\n", _PAGE_GLOBAL_SHIFT);
> pr_define("_PAGE_VALID_SHIFT %d\n", _PAGE_VALID_SHIFT);
> @@ -1615,9 +1611,8 @@ build_pte_present(u32 **p, struct uasm_reloc **r,
> cur = t;
> }
> uasm_i_andi(p, t, cur,
> - (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
> - uasm_i_xori(p, t, t,
> - (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
> + (_PAGE_PRESENT | _PAGE_NO_READ) >> _PAGE_PRESENT_SHIFT);
> + uasm_i_xori(p, t, t, _PAGE_PRESENT >> _PAGE_PRESENT_SHIFT);
This code makes the assumption that _PAGE_READ was always at a higher
bit number than _PAGE_PRESENT, however this isn't true for _PAGE_NO_READ
in the defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
case, where the no read bit will have been shifted off the end of the
register value.
Other than that, I can't fault this patch.
Cheers
James
> uasm_il_bnez(p, r, t, lid);
> if (pte == t)
> /* You lose the SMP race :-(*/
> --
> 2.8.0
>
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: James Hogan <james.hogan@imgtec.com>
To: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org, Ralf Baechle <ralf@linux-mips.org>,
Adam Buchbinder <adam.buchbinder@gmail.com>,
David Daney <david.daney@cavium.com>,
"Maciej W. Rozycki" <macro@linux-mips.org>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Markos Chandras <markos.chandras@imgtec.com>,
Alex Smith <alex.smith@imgtec.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 05/12] MIPS: mm: Standardise on _PAGE_NO_READ, drop _PAGE_READ
Date: Fri, 15 Apr 2016 22:22:00 +0100 [thread overview]
Message-ID: <20160415212200.GG7859@jhogan-linux.le.imgtec.org> (raw)
Message-ID: <20160415212200.3z-Wng_dMkYdxRfFHT2A6hu63Iqv3791-9SgtUc_csA@z> (raw)
In-Reply-To: <1460716620-13382-6-git-send-email-paul.burton@imgtec.com>
[-- Attachment #1: Type: text/plain, Size: 8903 bytes --]
On Fri, Apr 15, 2016 at 11:36:53AM +0100, Paul Burton wrote:
> Ever since support for RI/XI was implemented by commit 6dd9344cfc41
> ("MIPS: Implement Read Inhibit/eXecute Inhibit") we've had a mixture of
> _PAGE_READ & _PAGE_NO_READ bits. Rather than keep both around, switch
> away from using _PAGE_READ to determine page presence & instead invert
> the use to _PAGE_NO_READ. Wherever we formerly had no definition for
> _PAGE_NO_READ, change what was _PAGE_READ to _PAGE_NO_READ. The end
> result is that we consistently use _PAGE_NO_READ to determine whether a
> page is readable, regardless of whether RI/XI is implemented.
>
> Signed-off-by: Paul Burton <paul.burton@imgtec.com>
> ---
>
> arch/mips/include/asm/pgtable-bits.h | 19 ++++---------------
> arch/mips/include/asm/pgtable.h | 23 +++++++----------------
> arch/mips/mm/tlbex.c | 13 ++++---------
> 3 files changed, 15 insertions(+), 40 deletions(-)
>
> diff --git a/arch/mips/include/asm/pgtable-bits.h b/arch/mips/include/asm/pgtable-bits.h
> index c81fc17..5bc663d 100644
> --- a/arch/mips/include/asm/pgtable-bits.h
> +++ b/arch/mips/include/asm/pgtable-bits.h
> @@ -49,7 +49,6 @@ enum pgtable_bits {
>
> /* Used only by software (masked out before writing EntryLo*) */
> _PAGE_PRESENT_SHIFT = 24,
> - _PAGE_READ_SHIFT,
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> _PAGE_MODIFIED_SHIFT,
> @@ -66,7 +65,7 @@ enum pgtable_bits {
> enum pgtable_bits {
> /* Used only by software (writes to EntryLo ignored) */
> _PAGE_PRESENT_SHIFT,
> - _PAGE_READ_SHIFT,
> + _PAGE_NO_READ_SHIFT,
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> _PAGE_MODIFIED_SHIFT,
> @@ -85,7 +84,7 @@ enum pgtable_bits {
> /* Used only by software (masked out before writing EntryLo*) */
> _PAGE_PRESENT_SHIFT,
> #if !defined(CONFIG_CPU_MIPSR2) && !defined(CONFIG_CPU_MIPSR6)
> - _PAGE_READ_SHIFT,
> + _PAGE_NO_READ_SHIFT,
> #endif
> _PAGE_WRITE_SHIFT,
> _PAGE_ACCESSED_SHIFT,
> @@ -98,7 +97,6 @@ enum pgtable_bits {
> #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> _PAGE_NO_EXEC_SHIFT,
> _PAGE_NO_READ_SHIFT,
> - _PAGE_READ_SHIFT = _PAGE_NO_READ_SHIFT,
> #endif
> _PAGE_GLOBAL_SHIFT,
> _PAGE_VALID_SHIFT,
> @@ -110,11 +108,6 @@ enum pgtable_bits {
>
> /* Used only by software */
> #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> -# define _PAGE_READ (cpu_has_rixi ? 0 : (1 << _PAGE_READ_SHIFT))
> -#else
> -# define _PAGE_READ (1 << _PAGE_READ_SHIFT)
> -#endif
> #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
> #define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
> #define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
> @@ -125,11 +118,10 @@ enum pgtable_bits {
> /* Used by TLB hardware (placed in EntryLo*) */
> #if (defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32))
> # define _PAGE_NO_EXEC (1 << _PAGE_NO_EXEC_SHIFT)
> -# define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT)
> #elif defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> # define _PAGE_NO_EXEC (cpu_has_rixi ? (1 << _PAGE_NO_EXEC_SHIFT) : 0)
> -# define _PAGE_NO_READ (cpu_has_rixi ? (1 << _PAGE_NO_READ_SHIFT) : 0)
> #endif
> +#define _PAGE_NO_READ (1 << _PAGE_NO_READ_SHIFT)
> #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
> #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
> #define _PAGE_DIRTY (1 << _PAGE_DIRTY_SHIFT)
> @@ -145,9 +137,6 @@ enum pgtable_bits {
> #ifndef _PAGE_NO_EXEC
> #define _PAGE_NO_EXEC 0
> #endif
> -#ifndef _PAGE_NO_READ
> -#define _PAGE_NO_READ 0
> -#endif
>
> #define _PAGE_SILENT_READ _PAGE_VALID
> #define _PAGE_SILENT_WRITE _PAGE_DIRTY
> @@ -245,7 +234,7 @@ static inline uint64_t pte_to_entrylo(unsigned long pte_val)
> #define _CACHE_UNCACHED_ACCELERATED (7<<_CACHE_SHIFT)
> #endif
>
> -#define __READABLE (_PAGE_SILENT_READ | _PAGE_READ | _PAGE_ACCESSED)
> +#define __READABLE (_PAGE_SILENT_READ | _PAGE_ACCESSED)
> #define __WRITEABLE (_PAGE_SILENT_WRITE | _PAGE_WRITE | _PAGE_MODIFIED)
>
> #define _PAGE_CHG_MASK (_PAGE_ACCESSED | _PAGE_MODIFIED | \
> diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h
> index 9a4fe01..1459ee9 100644
> --- a/arch/mips/include/asm/pgtable.h
> +++ b/arch/mips/include/asm/pgtable.h
> @@ -23,18 +23,19 @@
> struct mm_struct;
> struct vm_area_struct;
>
> -#define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT)
> -#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | \
> +#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_NO_READ | \
> + _CACHE_CACHABLE_NONCOHERENT)
> +#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
> _page_cachable_default)
> -#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_NO_EXEC | \
> +#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_NO_EXEC | \
> _page_cachable_default)
> -#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | \
> +#define PAGE_READONLY __pgprot(_PAGE_PRESENT | \
> _page_cachable_default)
> #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
> _PAGE_GLOBAL | _page_cachable_default)
> #define PAGE_KERNEL_NC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
> _PAGE_GLOBAL | _CACHE_CACHABLE_NONCOHERENT)
> -#define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
> +#define PAGE_USERIO __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
> _page_cachable_default)
> #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \
> __WRITEABLE | _PAGE_GLOBAL | _CACHE_UNCACHED)
> @@ -307,7 +308,7 @@ static inline pte_t pte_mkdirty(pte_t pte)
> static inline pte_t pte_mkyoung(pte_t pte)
> {
> pte.pte_low |= _PAGE_ACCESSED;
> - if (pte.pte_low & _PAGE_READ)
> + if (!(pte.pte_low & _PAGE_NO_READ))
> pte.pte_high |= _PAGE_SILENT_READ;
> return pte;
> }
> @@ -353,13 +354,8 @@ static inline pte_t pte_mkdirty(pte_t pte)
> static inline pte_t pte_mkyoung(pte_t pte)
> {
> pte_val(pte) |= _PAGE_ACCESSED;
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> if (!(pte_val(pte) & _PAGE_NO_READ))
> pte_val(pte) |= _PAGE_SILENT_READ;
> - else
> -#endif
> - if (pte_val(pte) & _PAGE_READ)
> - pte_val(pte) |= _PAGE_SILENT_READ;
> return pte;
> }
>
> @@ -542,13 +538,8 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
> {
> pmd_val(pmd) |= _PAGE_ACCESSED;
>
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> if (!(pmd_val(pmd) & _PAGE_NO_READ))
> pmd_val(pmd) |= _PAGE_SILENT_READ;
> - else
> -#endif
> - if (pmd_val(pmd) & _PAGE_READ)
> - pmd_val(pmd) |= _PAGE_SILENT_READ;
>
> return pmd;
> }
> diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
> index 86aa7c2..7e3272f 100644
> --- a/arch/mips/mm/tlbex.c
> +++ b/arch/mips/mm/tlbex.c
> @@ -234,20 +234,16 @@ static void output_pgtable_bits_defines(void)
> pr_debug("\n");
>
> pr_define("_PAGE_PRESENT_SHIFT %d\n", _PAGE_PRESENT_SHIFT);
> - pr_define("_PAGE_READ_SHIFT %d\n", _PAGE_READ_SHIFT);
> + pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT);
> pr_define("_PAGE_WRITE_SHIFT %d\n", _PAGE_WRITE_SHIFT);
> pr_define("_PAGE_ACCESSED_SHIFT %d\n", _PAGE_ACCESSED_SHIFT);
> pr_define("_PAGE_MODIFIED_SHIFT %d\n", _PAGE_MODIFIED_SHIFT);
> #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
> pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT);
> #endif
> -#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
> - if (cpu_has_rixi) {
> #ifdef _PAGE_NO_EXEC_SHIFT
> + if (cpu_has_rixi)
> pr_define("_PAGE_NO_EXEC_SHIFT %d\n", _PAGE_NO_EXEC_SHIFT);
> - pr_define("_PAGE_NO_READ_SHIFT %d\n", _PAGE_NO_READ_SHIFT);
> -#endif
> - }
> #endif
> pr_define("_PAGE_GLOBAL_SHIFT %d\n", _PAGE_GLOBAL_SHIFT);
> pr_define("_PAGE_VALID_SHIFT %d\n", _PAGE_VALID_SHIFT);
> @@ -1615,9 +1611,8 @@ build_pte_present(u32 **p, struct uasm_reloc **r,
> cur = t;
> }
> uasm_i_andi(p, t, cur,
> - (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
> - uasm_i_xori(p, t, t,
> - (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
> + (_PAGE_PRESENT | _PAGE_NO_READ) >> _PAGE_PRESENT_SHIFT);
> + uasm_i_xori(p, t, t, _PAGE_PRESENT >> _PAGE_PRESENT_SHIFT);
This code makes the assumption that _PAGE_READ was always at a higher
bit number than _PAGE_PRESENT, however this isn't true for _PAGE_NO_READ
in the defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
case, where the no read bit will have been shifted off the end of the
register value.
Other than that, I can't fault this patch.
Cheers
James
> uasm_il_bnez(p, r, t, lid);
> if (pte == t)
> /* You lose the SMP race :-(*/
> --
> 2.8.0
>
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-04-15 21:22 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-15 10:36 [PATCH 00/12] TLB/XPA fixes & cleanups Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 10:36 ` [PATCH 01/12] MIPS: Separate XPA CPU feature into LPA and MVH Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 10:36 ` [PATCH 02/12] MIPS: Fix HTW config on XPA kernel without LPA enabled Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 10:36 ` [PATCH 03/12] MIPS: Remove redundant asm/pgtable-bits.h inclusions Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 19:16 ` James Hogan
2016-04-15 19:16 ` James Hogan
2016-04-15 21:19 ` Paul Burton
2016-04-15 21:19 ` Paul Burton
2016-04-15 10:36 ` [PATCH 04/12] MIPS: Use enums to make asm/pgtable-bits.h readable Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 20:29 ` James Hogan
2016-04-15 20:29 ` James Hogan
2016-05-11 9:38 ` Ralf Baechle
2016-04-15 10:36 ` [PATCH 05/12] MIPS: mm: Standardise on _PAGE_NO_READ, drop _PAGE_READ Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 21:22 ` James Hogan [this message]
2016-04-15 21:22 ` James Hogan
2016-04-18 9:03 ` Paul Burton
2016-04-18 9:03 ` Paul Burton
2016-04-18 9:10 ` James Hogan
2016-04-18 9:10 ` James Hogan
2016-04-15 10:36 ` [PATCH 06/12] MIPS: mm: Unify pte_page definition Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 23:16 ` James Hogan
2016-04-15 23:16 ` James Hogan
2016-04-15 10:36 ` [PATCH 07/12] MIPS: mm: Fix MIPS32 36b physical addressing (alchemy, netlogic) Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 22:17 ` James Hogan
2016-04-15 22:17 ` James Hogan
2016-04-15 10:36 ` [PATCH 08/12] MIPS: mm: Don't clobber $1 on XPA TLB refill Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 10:36 ` [PATCH 09/12] MIPS: mm: Pass scratch register through to iPTE_SW Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 22:28 ` James Hogan
2016-04-15 22:28 ` James Hogan
2016-04-15 10:36 ` [PATCH 10/12] MIPS: mm: Be more explicit about PTE mode bit handling Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 10:36 ` [PATCH 11/12] MIPS: mm: Simplify build_update_entries Paul Burton
2016-04-15 10:36 ` Paul Burton
2016-04-15 23:09 ` James Hogan
2016-04-15 23:09 ` James Hogan
2016-04-15 10:37 ` [PATCH 12/12] MIPS: mm: Don't do MTHC0 if XPA not present Paul Burton
2016-04-15 10:37 ` Paul Burton
2016-05-10 12:44 ` [PATCH 00/12] TLB/XPA fixes & cleanups Ralf Baechle
2016-05-10 17:47 ` Florian Fainelli
2016-05-11 10:03 ` Ralf Baechle
2016-05-11 19:17 ` Florian Fainelli
2016-05-11 21:15 ` Maciej W. Rozycki
2016-05-11 21:15 ` Maciej W. Rozycki
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=20160415212200.GG7859@jhogan-linux.le.imgtec.org \
--to=james.hogan@imgtec.com \
--cc=adam.buchbinder@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alex.smith@imgtec.com \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=david.daney@cavium.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=macro@linux-mips.org \
--cc=markos.chandras@imgtec.com \
--cc=paul.burton@imgtec.com \
--cc=paul.gortmaker@windriver.com \
--cc=ralf@linux-mips.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.