* [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix()
@ 2020-06-27 8:16 Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 1/2] sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings() Mike Rapoport
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Mike Rapoport @ 2020-06-27 8:16 UTC (permalink / raw)
To: sparclinux
Cc: David Miller, Linus Torvalds, Mike Rapoport, linux-kernel, Mike Rapoport
From: Mike Rapoport <rppt@linux.ibm.com>
Hi,
As discussed at [1] the __nocache_fix() macro in sparc's SRMMU can be made
type safe and so the compiler will yell anout misuse of pXd pointers for
which the __nocache_fix() is primarily used.
The first patch is an fix of such misuse that I've discovered after adding
type cast to __nocache_fix(), but to avoid breaking bisection I've made it
the first commit.
v2: rebased on v5.8-rc2+
--
Sincerely yours,
Mike.
[1] https://lkml.kernel.org/r/CAHk-=wisORTa7QVPnFqNw9pFs62UiwgsD4C4d=MtYy1o4JPyGQ@mail.gmail.com
Mike Rapoport (2):
sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings()
sparc32: srmmu: improve type safety of __nocache_fix()
arch/sparc/include/asm/pgtsrmmu.h | 2 +-
arch/sparc/mm/srmmu.c | 18 +++++++++---------
2 files changed, 10 insertions(+), 10 deletions(-)
base-commit: 1590a2e1c681b0991bd42c992cabfd380e0338f2
--
2.26.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings()
2020-06-27 8:16 [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
@ 2020-06-27 8:16 ` Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 2/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2020-06-27 8:16 UTC (permalink / raw)
To: sparclinux
Cc: David Miller, Linus Torvalds, Mike Rapoport, linux-kernel, Mike Rapoport
From: Mike Rapoport <rppt@linux.ibm.com>
This is a misprint in the page table traversal in
srmmu_inherit_prom_mappings`() function which accessed a PMD entry using
PGD rather than PUD.
Since sparc32 has only 3 page table levels, the PGD and PUD are
essentially the same and usage of __nocache_fix() removed the type
checking.
Use PUD for the consistency and to avoid breakage because of upcoming
addition of type checking into __nocache_fix().
Fixes: 7235db268a2777bc38 ("sparc32: use pgtable-nopud instead of 4level-fixup")
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
---
arch/sparc/mm/srmmu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
index 0070f8b9a753..f5fa07958f34 100644
--- a/arch/sparc/mm/srmmu.c
+++ b/arch/sparc/mm/srmmu.c
@@ -822,7 +822,7 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
memset(__nocache_fix(pmdp), 0, SRMMU_PMD_TABLE_SIZE);
pud_set(__nocache_fix(pudp), pmdp);
}
- pmdp = pmd_offset(__nocache_fix(pgdp), start);
+ pmdp = pmd_offset(__nocache_fix(pudp), start);
if (what == 1) {
*(pmd_t *)__nocache_fix(pmdp) = __pmd(probed);
start += PMD_SIZE;
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] sparc32: srmmu: improve type safety of __nocache_fix()
2020-06-27 8:16 [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 1/2] sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings() Mike Rapoport
@ 2020-06-27 8:16 ` Mike Rapoport
2020-07-08 16:56 ` [PATCH v2 0/2] " Mike Rapoport
2020-07-22 1:26 ` David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2020-06-27 8:16 UTC (permalink / raw)
To: sparclinux
Cc: David Miller, Linus Torvalds, Mike Rapoport, linux-kernel, Mike Rapoport
From: Mike Rapoport <rppt@linux.ibm.com>
The __nocache_fix(VADDR) macro is used to add an offset for pointers and
its "return type" is 'void *'.
We can do better and keep the type information with simply by casting the
return value to (__typeof__(VADDR)).
This will ".. show when those pgd/p4d/pud pointers get mis-used because
they don't end up dropping the type info.."
The addition of the casting to __nocache_fix() also allows to remove
explicit casts at its call sites.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
Link: https://lkml.kernel.org/r/CAHk-=wisORTa7QVPnFqNw9pFs62UiwgsD4C4d=MtYy1o4JPyGQ@mail.gmail.com
---
arch/sparc/include/asm/pgtsrmmu.h | 2 +-
arch/sparc/mm/srmmu.c | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/arch/sparc/include/asm/pgtsrmmu.h b/arch/sparc/include/asm/pgtsrmmu.h
index 7708d015712b..6067925972d9 100644
--- a/arch/sparc/include/asm/pgtsrmmu.h
+++ b/arch/sparc/include/asm/pgtsrmmu.h
@@ -113,7 +113,7 @@ extern unsigned long last_valid_pfn;
extern void *srmmu_nocache_pool;
#define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool))
#define __nocache_va(PADDR) (__va((unsigned long)PADDR) - (unsigned long)srmmu_nocache_pool + SRMMU_NOCACHE_VADDR)
-#define __nocache_fix(VADDR) __va(__nocache_pa(VADDR))
+#define __nocache_fix(VADDR) ((__typeof__(VADDR))__va(__nocache_pa(VADDR)))
/* Accessing the MMU control register. */
unsigned int srmmu_get_mmureg(void);
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
index f5fa07958f34..da4e10b4cb37 100644
--- a/arch/sparc/mm/srmmu.c
+++ b/arch/sparc/mm/srmmu.c
@@ -689,7 +689,7 @@ static void __init srmmu_early_allocate_ptable_skeleton(unsigned long start,
pgdp = pgd_offset_k(start);
p4dp = p4d_offset(pgdp, start);
pudp = pud_offset(p4dp, start);
- if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
+ if (pud_none(*__nocache_fix(pudp))) {
pmdp = __srmmu_get_nocache(
SRMMU_PMD_TABLE_SIZE, SRMMU_PMD_TABLE_SIZE);
if (pmdp == NULL)
@@ -698,7 +698,7 @@ static void __init srmmu_early_allocate_ptable_skeleton(unsigned long start,
pud_set(__nocache_fix(pudp), pmdp);
}
pmdp = pmd_offset(__nocache_fix(pudp), start);
- if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
+ if (srmmu_pmd_none(*__nocache_fix(pmdp))) {
ptep = __srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
if (ptep == NULL)
early_pgtable_allocfail("pte");
@@ -810,11 +810,11 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
p4dp = p4d_offset(pgdp, start);
pudp = pud_offset(p4dp, start);
if (what == 2) {
- *(pgd_t *)__nocache_fix(pgdp) = __pgd(probed);
+ *__nocache_fix(pgdp) = __pgd(probed);
start += PGDIR_SIZE;
continue;
}
- if (pud_none(*(pud_t *)__nocache_fix(pudp))) {
+ if (pud_none(*__nocache_fix(pudp))) {
pmdp = __srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
SRMMU_PMD_TABLE_SIZE);
if (pmdp == NULL)
@@ -828,7 +828,7 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
start += PMD_SIZE;
continue;
}
- if (srmmu_pmd_none(*(pmd_t *)__nocache_fix(pmdp))) {
+ if (srmmu_pmd_none(*__nocache_fix(pmdp))) {
ptep = __srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
if (ptep == NULL)
early_pgtable_allocfail("pte");
@@ -836,7 +836,7 @@ static void __init srmmu_inherit_prom_mappings(unsigned long start,
pmd_set(__nocache_fix(pmdp), ptep);
}
ptep = pte_offset_kernel(__nocache_fix(pmdp), start);
- *(pte_t *)__nocache_fix(ptep) = __pte(probed);
+ *__nocache_fix(ptep) = __pte(probed);
start += PAGE_SIZE;
}
}
@@ -850,7 +850,7 @@ static void __init do_large_mapping(unsigned long vaddr, unsigned long phys_base
unsigned long big_pte;
big_pte = KERNEL_PTE(phys_base >> 4);
- *(pgd_t *)__nocache_fix(pgdp) = __pgd(big_pte);
+ *__nocache_fix(pgdp) = __pgd(big_pte);
}
/* Map sp_bank entry SP_ENTRY, starting at virtual address VBASE. */
@@ -940,7 +940,7 @@ void __init srmmu_paging_init(void)
srmmu_ctx_table_phys = (ctxd_t *)__nocache_pa(srmmu_context_table);
for (i = 0; i < num_contexts; i++)
- srmmu_ctxd_set((ctxd_t *)__nocache_fix(&srmmu_context_table[i]), srmmu_swapper_pg_dir);
+ srmmu_ctxd_set(__nocache_fix(&srmmu_context_table[i]), srmmu_swapper_pg_dir);
flush_cache_all();
srmmu_set_ctable_ptr((unsigned long)srmmu_ctx_table_phys);
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix()
2020-06-27 8:16 [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 1/2] sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings() Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 2/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
@ 2020-07-08 16:56 ` Mike Rapoport
2020-07-22 1:26 ` David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2020-07-08 16:56 UTC (permalink / raw)
To: sparclinux; +Cc: David Miller, Linus Torvalds, linux-kernel, Mike Rapoport
Gentle ping.
On Sat, Jun 27, 2020 at 11:16:51AM +0300, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
>
> Hi,
>
> As discussed at [1] the __nocache_fix() macro in sparc's SRMMU can be made
> type safe and so the compiler will yell anout misuse of pXd pointers for
> which the __nocache_fix() is primarily used.
>
> The first patch is an fix of such misuse that I've discovered after adding
> type cast to __nocache_fix(), but to avoid breaking bisection I've made it
> the first commit.
>
> v2: rebased on v5.8-rc2+
>
> --
> Sincerely yours,
> Mike.
>
> [1] https://lkml.kernel.org/r/CAHk-=wisORTa7QVPnFqNw9pFs62UiwgsD4C4d=MtYy1o4JPyGQ@mail.gmail.com
>
> Mike Rapoport (2):
> sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings()
> sparc32: srmmu: improve type safety of __nocache_fix()
>
> arch/sparc/include/asm/pgtsrmmu.h | 2 +-
> arch/sparc/mm/srmmu.c | 18 +++++++++---------
> 2 files changed, 10 insertions(+), 10 deletions(-)
>
> base-commit: 1590a2e1c681b0991bd42c992cabfd380e0338f2
> --
> 2.26.2
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix()
2020-06-27 8:16 [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
` (2 preceding siblings ...)
2020-07-08 16:56 ` [PATCH v2 0/2] " Mike Rapoport
@ 2020-07-22 1:26 ` David Miller
3 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2020-07-22 1:26 UTC (permalink / raw)
To: rppt; +Cc: sparclinux, torvalds, linux-kernel, rppt
From: Mike Rapoport <rppt@kernel.org>
Date: Sat, 27 Jun 2020 11:16:51 +0300
> From: Mike Rapoport <rppt@linux.ibm.com>
>
> Hi,
>
> As discussed at [1] the __nocache_fix() macro in sparc's SRMMU can be made
> type safe and so the compiler will yell anout misuse of pXd pointers for
> which the __nocache_fix() is primarily used.
>
> The first patch is an fix of such misuse that I've discovered after adding
> type cast to __nocache_fix(), but to avoid breaking bisection I've made it
> the first commit.
>
> v2: rebased on v5.8-rc2+
Series applied, thanks Mike.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-07-22 1:26 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-27 8:16 [PATCH v2 0/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 1/2] sparc32: use PUD rather than PGD to get PMD in srmmu_inherit_prom_mappings() Mike Rapoport
2020-06-27 8:16 ` [PATCH v2 2/2] sparc32: srmmu: improve type safety of __nocache_fix() Mike Rapoport
2020-07-08 16:56 ` [PATCH v2 0/2] " Mike Rapoport
2020-07-22 1:26 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).