* [PATCH V2] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT @ 2021-02-27 6:19 Huang Pei 2021-02-27 6:19 ` [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling Huang Pei 0 siblings, 1 reply; 8+ messages in thread From: Huang Pei @ 2021-02-27 6:19 UTC (permalink / raw) To: Thomas Bogendoerfer, ambrosehua Cc: Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen, kernel test robot In-Reply-To: fix waring when building 32bit kernel Reported-by: kernel test robot <lkp@intel.com> ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-02-27 6:19 [PATCH V2] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT Huang Pei @ 2021-02-27 6:19 ` Huang Pei 2021-02-28 23:00 ` Maciej W. Rozycki 0 siblings, 1 reply; 8+ messages in thread From: Huang Pei @ 2021-02-27 6:19 UTC (permalink / raw) To: Thomas Bogendoerfer, ambrosehua Cc: Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen CP0 Context has enough room for wraping pgd into its 41-bit PTEBase field. +. For XPHYS, the trick is that pgd is 4kB aligned, and the PABITS <= 48, only save 48 - 12 + 5(for bit[63:59]) = 41 bits, aka. : bit[63:59] | 0000 0000 000 | bit[47:12] | 0000 0000 0000 +. for CKSEG0, only save 29 - 12 = 17 bits +. use CAC_BASE for accessing bit[63:59] of pgd +. let CONFIG_MIPS_PGD_C0_CONTEXT depend on 64bit, and protect build_fast_mips_refill_handler from 32bit building Signed-off-by: Huang Pei <huangpei@loongson.cn> --- arch/mips/Kconfig | 1 + arch/mips/mm/tlbex.c | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 2000bb2b0220..517509ad8596 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -2142,6 +2142,7 @@ config CPU_SUPPORTS_HUGEPAGES depends on !(32BIT && (ARCH_PHYS_ADDR_T_64BIT || EVA)) config MIPS_PGD_C0_CONTEXT bool + depends on 64BIT default y if 64BIT && (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP # diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index a7521b8f7658..5bb9724578f7 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c @@ -848,8 +848,8 @@ void build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, /* Clear lower 23 bits of context. */ uasm_i_dins(p, ptr, 0, 0, 23); - /* 1 0 1 0 1 << 6 xkphys cached */ - uasm_i_ori(p, ptr, ptr, 0x540); + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); uasm_i_drotr(p, ptr, ptr, 11); #elif defined(CONFIG_SMP) UASM_i_CPUID_MFC0(p, ptr, SMP_CPUID_REG); @@ -1106,6 +1106,7 @@ struct mips_huge_tlb_info { bool need_reload_pte; }; +#ifdef CONFIG_64BIT static struct mips_huge_tlb_info build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, struct uasm_reloc **r, unsigned int tmp, @@ -1164,8 +1165,8 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, if (pgd_reg == -1) { vmalloc_branch_delay_filled = 1; - /* 1 0 1 0 1 << 6 xkphys cached */ - uasm_i_ori(p, ptr, ptr, 0x540); + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); uasm_i_drotr(p, ptr, ptr, 11); } @@ -1292,7 +1293,7 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, return rv; } - +#endif /* * For a 64-bit kernel, we are using the 64-bit XTLB refill exception * because EXL == 0. If we wrap, we can also use the 32 instruction -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-02-27 6:19 ` [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling Huang Pei @ 2021-02-28 23:00 ` Maciej W. Rozycki 2021-03-04 1:06 ` Huang Pei 0 siblings, 1 reply; 8+ messages in thread From: Maciej W. Rozycki @ 2021-02-28 23:00 UTC (permalink / raw) To: Huang Pei, Thomas Bogendoerfer Cc: ambrosehua, Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen On Sat, 27 Feb 2021, Huang Pei wrote: > index 2000bb2b0220..517509ad8596 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -2142,6 +2142,7 @@ config CPU_SUPPORTS_HUGEPAGES > depends on !(32BIT && (ARCH_PHYS_ADDR_T_64BIT || EVA)) > config MIPS_PGD_C0_CONTEXT > bool > + depends on 64BIT > default y if 64BIT && (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP I guess you want: default y if (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP at the same time too. Otherwise you have cruft left behind. > diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c > index a7521b8f7658..5bb9724578f7 100644 > --- a/arch/mips/mm/tlbex.c > +++ b/arch/mips/mm/tlbex.c > @@ -1106,6 +1106,7 @@ struct mips_huge_tlb_info { > bool need_reload_pte; > }; > > +#ifdef CONFIG_64BIT > static struct mips_huge_tlb_info > build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > struct uasm_reloc **r, unsigned int tmp, Does it actually build without a warning for !CONFIG_64BIT given the reference below? > @@ -1164,8 +1165,8 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > > if (pgd_reg == -1) { > vmalloc_branch_delay_filled = 1; > - /* 1 0 1 0 1 << 6 xkphys cached */ > - uasm_i_ori(p, ptr, ptr, 0x540); > + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ > + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); Instead I'd paper the issue over by casting the constant to `s64'. Or better yet fixed it properly by defining CAC_BASE, etc. as `unsigned long long' long rather than `unsigned long' to stop all this nonsense (e.g. PHYS_TO_XKPHYS already casts the result to `s64'). Thomas, WDYT? Maciej ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-02-28 23:00 ` Maciej W. Rozycki @ 2021-03-04 1:06 ` Huang Pei 2021-03-04 1:40 ` Maciej W. Rozycki 0 siblings, 1 reply; 8+ messages in thread From: Huang Pei @ 2021-03-04 1:06 UTC (permalink / raw) To: Maciej W. Rozycki Cc: Thomas Bogendoerfer, ambrosehua, Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen Hi, On Mon, Mar 01, 2021 at 12:00:28AM +0100, Maciej W. Rozycki wrote: > On Sat, 27 Feb 2021, Huang Pei wrote: > > > index 2000bb2b0220..517509ad8596 100644 > > --- a/arch/mips/Kconfig > > +++ b/arch/mips/Kconfig > > @@ -2142,6 +2142,7 @@ config CPU_SUPPORTS_HUGEPAGES > > depends on !(32BIT && (ARCH_PHYS_ADDR_T_64BIT || EVA)) > > config MIPS_PGD_C0_CONTEXT > > bool > > + depends on 64BIT > > default y if 64BIT && (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP > > I guess you want: > > default y if (CPU_MIPSR2 || CPU_MIPSR6) && !CPU_XLP > > at the same time too. Otherwise you have cruft left behind. > Yes, it is much better > > diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c > > index a7521b8f7658..5bb9724578f7 100644 > > --- a/arch/mips/mm/tlbex.c > > +++ b/arch/mips/mm/tlbex.c > > @@ -1106,6 +1106,7 @@ struct mips_huge_tlb_info { > > bool need_reload_pte; > > }; > > > > +#ifdef CONFIG_64BIT > > static struct mips_huge_tlb_info > > build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > > struct uasm_reloc **r, unsigned int tmp, > > Does it actually build without a warning for !CONFIG_64BIT given the > reference below? No, my bad, my first reaction when seeing "IS_ENABLED(CONFIG_64BIT)" is "#ifdef CONFIG_64BIT" > > > @@ -1164,8 +1165,8 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > > > > if (pgd_reg == -1) { > > vmalloc_branch_delay_filled = 1; > > - /* 1 0 1 0 1 << 6 xkphys cached */ > > - uasm_i_ori(p, ptr, ptr, 0x540); > > + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ > > + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); > > Instead I'd paper the issue over by casting the constant to `s64'. > > Or better yet fixed it properly by defining CAC_BASE, etc. as `unsigned > long long' long rather than `unsigned long' to stop all this nonsense > (e.g. PHYS_TO_XKPHYS already casts the result to `s64'). Thomas, WDYT? Sorry, I do not get it , on MIPS32, how can CAC_BASE be unsigned long long ? If this did not work, how about one step back, just explicit comment wihtout "(CAC_BASE << 53)" ? > > Maciej ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-03-04 1:06 ` Huang Pei @ 2021-03-04 1:40 ` Maciej W. Rozycki 2021-03-05 7:13 ` Huang Pei 0 siblings, 1 reply; 8+ messages in thread From: Maciej W. Rozycki @ 2021-03-04 1:40 UTC (permalink / raw) To: Huang Pei Cc: Thomas Bogendoerfer, ambrosehua, Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen On Thu, 4 Mar 2021, Huang Pei wrote: > > > @@ -1164,8 +1165,8 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > > > > > > if (pgd_reg == -1) { > > > vmalloc_branch_delay_filled = 1; > > > - /* 1 0 1 0 1 << 6 xkphys cached */ > > > - uasm_i_ori(p, ptr, ptr, 0x540); > > > + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ > > > + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); > > > > Instead I'd paper the issue over by casting the constant to `s64'. > > > > Or better yet fixed it properly by defining CAC_BASE, etc. as `unsigned > > long long' long rather than `unsigned long' to stop all this nonsense > > (e.g. PHYS_TO_XKPHYS already casts the result to `s64'). Thomas, WDYT? > Sorry, I do not get it , on MIPS32, how can CAC_BASE be unsigned long > long ? By using the `ULL' suffix with constants. It won't change code produced, because they are unsigned anyway and the compiler will truncate them with no change to the actual value to fit in narrower data types as needed, but it will silence the warnings. Maciej ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-03-04 1:40 ` Maciej W. Rozycki @ 2021-03-05 7:13 ` Huang Pei 2021-03-07 20:54 ` Maciej W. Rozycki 0 siblings, 1 reply; 8+ messages in thread From: Huang Pei @ 2021-03-05 7:13 UTC (permalink / raw) To: Maciej W. Rozycki Cc: Thomas Bogendoerfer, ambrosehua, Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen Hi, On Thu, Mar 04, 2021 at 02:40:54AM +0100, Maciej W. Rozycki wrote: > On Thu, 4 Mar 2021, Huang Pei wrote: > > > > > @@ -1164,8 +1165,8 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, > > > > > > > > if (pgd_reg == -1) { > > > > vmalloc_branch_delay_filled = 1; > > > > - /* 1 0 1 0 1 << 6 xkphys cached */ > > > > - uasm_i_ori(p, ptr, ptr, 0x540); > > > > + /* insert bit[63:59] of CAC_BASE into bit[11:6] of ptr */ > > > > + uasm_i_ori(p, ptr, ptr, (CAC_BASE >> 53)); > > > > > > Instead I'd paper the issue over by casting the constant to `s64'. > > > > > > Or better yet fixed it properly by defining CAC_BASE, etc. as `unsigned > > > long long' long rather than `unsigned long' to stop all this nonsense > > > (e.g. PHYS_TO_XKPHYS already casts the result to `s64'). Thomas, WDYT? > > Sorry, I do not get it , on MIPS32, how can CAC_BASE be unsigned long > > long ? > > By using the `ULL' suffix with constants. It won't change code produced, > because they are unsigned anyway and the compiler will truncate them with > no change to the actual value to fit in narrower data types as needed, but > it will silence the warnings. > > Maciej On Linux 5.11 with this patch and **ONLY** attaching ULL to CAC_BASE in arch/mips/include/asm/mach-generic/space.h for CONFIG_32BIT, cross gcc 7.5 in Ubuntu 18.04, loongon1c_defconfig .......... make[1]: Entering directory '/home/hp/projects/Linux/temp/out_stable' GEN Makefile CALL /home/hp/projects/Linux/temp/linux-stable/scripts/atomic/check-atomics.sh CALL /home/hp/projects/Linux/temp/linux-stable/scripts/checksyscalls.sh CC arch/mips/mm/cache.o CC arch/mips/kernel/branch.o CC arch/mips/mm/context.o CC arch/mips/loongson32/common/time.o CC arch/mips/loongson32/ls1c/board.o CHK include/generated/compile.h CC arch/mips/vdso/vgettimeofday.o HOSTCC arch/mips/vdso/genvdso CC kernel/sched/cputime.o In file included from /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/mmiowb.h:5:0, from /home/hp/projects/Linux/temp/linux-stable/include/linux/spinlock.h:61, from /home/hp/projects/Linux/temp/linux-stable/include/linux/wait.h:9, from /home/hp/projects/Linux/temp/linux-stable/include/linux/wait_bit.h:8, from /home/hp/projects/Linux/temp/linux-stable/include/linux/fs.h:6, from /home/hp/projects/Linux/temp/linux-stable/arch/mips/mm/cache.c:9: /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h: In function ‘phys_to_virt’: /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h:122:9: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] return (void *)(address + PAGE_OFFSET - PHYS_OFFSET); ^ In file included from /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/mmiowb.h:5:0, from /home/hp/projects/Linux/temp/linux-stable/include/linux/spinlock.h:61, from /home/hp/projects/Linux/temp/linux-stable/include/linux/wait.h:9, from /home/hp/projects/Linux/temp/linux-stable/include/linux/pid.h:6, from /home/hp/projects/Linux/temp/linux-stable/include/linux/sched.h:14, from /home/hp/projects/Linux/temp/linux-stable/include/linux/sched/signal.h:7, from /home/hp/projects/Linux/temp/linux-stable/arch/mips/kernel/branch.c:10: /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h: In function ‘phys_to_virt’: /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h:122:9: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] return (void *)(address + PAGE_OFFSET - PHYS_OFFSET); ......... Only change CAC_BASE Does NOT work Huang Pei ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-03-05 7:13 ` Huang Pei @ 2021-03-07 20:54 ` Maciej W. Rozycki 2021-03-08 1:27 ` huangpei 0 siblings, 1 reply; 8+ messages in thread From: Maciej W. Rozycki @ 2021-03-07 20:54 UTC (permalink / raw) To: Huang Pei Cc: Thomas Bogendoerfer, ambrosehua, Bibo Mao, Andrew Morton, linux-mips, linux-arch, linux-mm, Jiaxun Yang, Paul Burton, Li Xuefeng, Yang Tiezhu, Gao Juxin, Fuxin Zhang, Huacai Chen On Fri, 5 Mar 2021, Huang Pei wrote: > /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h: In function ‘phys_to_virt’: > /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h:122:9: error: cast to pointer > from integer of different size [-Werror=int-to-pointer-cast] > return (void *)(address + PAGE_OFFSET - PHYS_OFFSET); > > > ......... > > Only change CAC_BASE Does NOT work Thank you for checking. Right. I don't know why it fails for `phys_to_virt' where `address' is of the `unsigned long' type, but there are other places where the macros themselves are cast to `void *'. We may want to rework that stuff, but not necessarily on this occasion. Use an explicit cast of the macro to `s64' here then, as my other suggestion was. Anything is better than hardcoded magic numbers. Maciej ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling 2021-03-07 20:54 ` Maciej W. Rozycki @ 2021-03-08 1:27 ` huangpei 0 siblings, 0 replies; 8+ messages in thread From: huangpei @ 2021-03-08 1:27 UTC (permalink / raw) To: Maciej W. Rozycki Cc: Thomas Bogendoerfer, ambrosehua, 毛碧波, Andrew Morton, linux-mips, linux-arch, linux-mm, jiaxun.yang, Paul Burton, lixuefeng, Yang Tiezhu, gaojuxin, 张福新, 陈华才 Hi, >On Fri, 5 Mar 2021, Huang Pei wrote: > >> /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h: In function ‘phys_to_virt’: >> /home/hp/projects/Linux/temp/linux-stable/arch/mips/include/asm/io.h:122:9: error: cast to pointer >> from integer of different size [-Werror=int-to-pointer-cast] >> return (void *)(address + PAGE_OFFSET - PHYS_OFFSET); >> >> >> ......... >> >> Only change CAC_BASE Does NOT work > > Thank you for checking. > > Right. I don't know why it fails for `phys_to_virt' where `address' is >of the `unsigned long' type, but there are other places where the macros >themselves are cast to `void *'. We may want to rework that stuff, but >not necessarily on this occasion. > > Use an explicit cast of the macro to `s64' here then, as my other >suggestion was. Anything is better than hardcoded magic numbers. > > Maciej cast into s64 works. I will resend v3 soon. Another issue, please take a look at GCC bug 99217, there is a partial fix, but I am not sure that if it is advised mips16 should also be covered and how? I found the ftrace on MIPS is not safe on SMP, since when disabling tracing, the callsite of _mcount need two writes to transform jal _mcount addiu sp, sp, -offset into nop nop no matter in what order these two writes are seen, it is wrecked in these two case jal _mcount nop or nop addiu sp, sp, -offset so, I add a new ftrace implementation based on -fpatchable-function-entry=3, which is blocked by GCC bug 99217 see https://lore.kernel.org/linux-mips/20210305101933.9799-1-huangpei@loongson.cn/ At last, is it possible to add fix 99217 and 93242 into gcc 8.5? ----------------- Huang Pei ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-03-08 1:27 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-02-27 6:19 [PATCH V2] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT Huang Pei 2021-02-27 6:19 ` [PATCH] MIPS: clean up CONFIG_MIPS_PGD_C0_CONTEXT handling Huang Pei 2021-02-28 23:00 ` Maciej W. Rozycki 2021-03-04 1:06 ` Huang Pei 2021-03-04 1:40 ` Maciej W. Rozycki 2021-03-05 7:13 ` Huang Pei 2021-03-07 20:54 ` Maciej W. Rozycki 2021-03-08 1:27 ` huangpei
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).