Message ID | 20230111171027.2392-11-jszhang@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv: improve boot time isa extensions handling | expand |
Context | Check | Description |
---|---|---|
conchuod/patch_count | success | Link |
conchuod/cover_letter | success | Series has a cover letter |
conchuod/tree_selection | success | Guessed tree name to be for-next |
conchuod/fixes_present | success | Fixes tag not required for -next series |
conchuod/maintainers_pattern | success | MAINTAINERS pattern errors before the patch: 13 and now 13 |
conchuod/verify_signedoff | success | Signed-off-by tag matches author and committer |
conchuod/kdoc | success | Errors and warnings before: 0 this patch: 0 |
conchuod/module_param | success | Was 0 now: 0 |
conchuod/alphanumeric_selects | success | Out of order selects before the patch: 57 and now 57 |
conchuod/build_rv32_defconfig | fail | Build failed |
conchuod/build_warn_rv64 | success | Errors and warnings before: 2054 this patch: 2054 |
conchuod/dtb_warn_rv64 | success | Errors and warnings before: 4 this patch: 4 |
conchuod/header_inline | success | No static functions without inline keyword in header files |
conchuod/checkpatch | warning | CHECK: Consider using #include <linux/module.h> instead of <asm/module.h> |
conchuod/source_inline | success | Was 0 now: 0 |
conchuod/build_rv64_nommu_k210_defconfig | success | Build OK |
conchuod/verify_fixes | success | No Fixes tag |
conchuod/build_rv64_nommu_virt_defconfig | success | Build OK |
Hi Jisheng, I love your patch! Yet something to improve: [auto build test ERROR on next-20230111] [cannot apply to linus/master v6.2-rc3 v6.2-rc2 v6.2-rc1 v6.2-rc3] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jisheng-Zhang/riscv-fix-jal-offsets-in-patched-alternatives/20230112-012447 patch link: https://lore.kernel.org/r/20230111171027.2392-11-jszhang%40kernel.org patch subject: [PATCH v3 10/13] riscv: alternative: patch alternatives in the vDSO config: riscv-randconfig-r042-20230110 compiler: riscv64-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/42cd9e915a1622a4d9332fbecb5d85c1dffbbce7 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Jisheng-Zhang/riscv-fix-jal-offsets-in-patched-alternatives/20230112-012447 git checkout 42cd9e915a1622a4d9332fbecb5d85c1dffbbce7 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): arch/riscv/kernel/alternative.c: In function 'apply_vdso_alternatives': >> arch/riscv/kernel/alternative.c:172:35: error: 'vdso_start' undeclared (first use in this function); did you mean 'vfs_stat'? 172 | hdr = (struct elf64_hdr *)vdso_start; | ^~~~~~~~~~ | vfs_stat arch/riscv/kernel/alternative.c:172:35: note: each undeclared identifier is reported only once for each function it appears in vim +172 arch/riscv/kernel/alternative.c 164 165 static void __init apply_vdso_alternatives(void) 166 { 167 const struct elf64_hdr *hdr; 168 const struct elf64_shdr *shdr; 169 const struct elf64_shdr *alt; 170 struct alt_entry *begin, *end; 171 > 172 hdr = (struct elf64_hdr *)vdso_start; 173 shdr = (void *)hdr + hdr->e_shoff; 174 alt = find_section(hdr, shdr, ".alternative"); 175 if (!alt) 176 return; 177 178 begin = (void *)hdr + alt->sh_offset, 179 end = (void *)hdr + alt->sh_offset + alt->sh_size, 180 181 _apply_alternatives((struct alt_entry *)begin, 182 (struct alt_entry *)end, 183 RISCV_ALTERNATIVES_BOOT); 184 } 185
Hey Jisheng, On Thu, Jan 12, 2023 at 01:10:24AM +0800, Jisheng Zhang wrote: > Make it possible to use alternatives in the vDSO, so that better > implementations can be used if possible. > > Signed-off-by: Jisheng Zhang <jszhang@kernel.org> > Reviewed-by: Guo Ren <guoren@kernel.org> > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> FYI, from this patch onwards the rv32 build is broken. Should be reproduceable with the in-tree rv32_defconfig. Unfortunately no logs for you, I've got a CI bug to fix! Thanks, Conor. > --- > arch/riscv/include/asm/vdso.h | 4 ++++ > arch/riscv/kernel/alternative.c | 25 +++++++++++++++++++++++++ > arch/riscv/kernel/vdso.c | 5 ----- > arch/riscv/kernel/vdso/vdso.lds.S | 7 +++++++ > 4 files changed, 36 insertions(+), 5 deletions(-) > > diff --git a/arch/riscv/include/asm/vdso.h b/arch/riscv/include/asm/vdso.h > index a7644f46d0e5..f891478829a5 100644 > --- a/arch/riscv/include/asm/vdso.h > +++ b/arch/riscv/include/asm/vdso.h > @@ -28,8 +28,12 @@ > #define COMPAT_VDSO_SYMBOL(base, name) \ > (void __user *)((unsigned long)(base) + compat__vdso_##name##_offset) > > +extern char compat_vdso_start[], compat_vdso_end[]; > + > #endif /* CONFIG_COMPAT */ > > +extern char vdso_start[], vdso_end[]; > + > #endif /* !__ASSEMBLY__ */ > > #endif /* CONFIG_MMU */ > diff --git a/arch/riscv/kernel/alternative.c b/arch/riscv/kernel/alternative.c > index 3d4f1f32c7f6..a883a309139f 100644 > --- a/arch/riscv/kernel/alternative.c > +++ b/arch/riscv/kernel/alternative.c > @@ -11,7 +11,9 @@ > #include <linux/cpu.h> > #include <linux/uaccess.h> > #include <asm/alternative.h> > +#include <asm/module.h> > #include <asm/sections.h> > +#include <asm/vdso.h> > #include <asm/vendorid_list.h> > #include <asm/sbi.h> > #include <asm/csr.h> > @@ -160,6 +162,27 @@ static void __init_or_module _apply_alternatives(struct alt_entry *begin, > stage); > } > > +static void __init apply_vdso_alternatives(void) > +{ > + const struct elf64_hdr *hdr; > + const struct elf64_shdr *shdr; > + const struct elf64_shdr *alt; > + struct alt_entry *begin, *end; > + > + hdr = (struct elf64_hdr *)vdso_start; > + shdr = (void *)hdr + hdr->e_shoff; > + alt = find_section(hdr, shdr, ".alternative"); > + if (!alt) > + return; > + > + begin = (void *)hdr + alt->sh_offset, > + end = (void *)hdr + alt->sh_offset + alt->sh_size, > + > + _apply_alternatives((struct alt_entry *)begin, > + (struct alt_entry *)end, > + RISCV_ALTERNATIVES_BOOT); > +} > + > void __init apply_boot_alternatives(void) > { > /* If called on non-boot cpu things could go wrong */ > @@ -168,6 +191,8 @@ void __init apply_boot_alternatives(void) > _apply_alternatives((struct alt_entry *)__alt_start, > (struct alt_entry *)__alt_end, > RISCV_ALTERNATIVES_BOOT); > + > + apply_vdso_alternatives(); > } > > /* > diff --git a/arch/riscv/kernel/vdso.c b/arch/riscv/kernel/vdso.c > index e410275918ac..4e631c098f4d 100644 > --- a/arch/riscv/kernel/vdso.c > +++ b/arch/riscv/kernel/vdso.c > @@ -22,11 +22,6 @@ struct vdso_data { > }; > #endif > > -extern char vdso_start[], vdso_end[]; > -#ifdef CONFIG_COMPAT > -extern char compat_vdso_start[], compat_vdso_end[]; > -#endif > - > enum vvar_pages { > VVAR_DATA_PAGE_OFFSET, > VVAR_TIMENS_PAGE_OFFSET, > diff --git a/arch/riscv/kernel/vdso/vdso.lds.S b/arch/riscv/kernel/vdso/vdso.lds.S > index 150b1a572e61..4a0606633290 100644 > --- a/arch/riscv/kernel/vdso/vdso.lds.S > +++ b/arch/riscv/kernel/vdso/vdso.lds.S > @@ -40,6 +40,13 @@ SECTIONS > . = 0x800; > .text : { *(.text .text.*) } :text > > + . = ALIGN(4); > + .alternative : { > + __alt_start = .; > + *(.alternative) > + __alt_end = .; > + } > + > .data : { > *(.got.plt) *(.got) > *(.data .data.* .gnu.linkonce.d.*) > -- > 2.38.1 >
On Thu, Jan 12, 2023 at 07:48:29AM +0000, Conor Dooley wrote: > Hey Jisheng, > > On Thu, Jan 12, 2023 at 01:10:24AM +0800, Jisheng Zhang wrote: > > Make it possible to use alternatives in the vDSO, so that better > > implementations can be used if possible. > > > > Signed-off-by: Jisheng Zhang <jszhang@kernel.org> > > Reviewed-by: Guo Ren <guoren@kernel.org> > > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> > > FYI, from this patch onwards the rv32 build is broken. > Should be reproduceable with the in-tree rv32_defconfig. > > Unfortunately no logs for you, I've got a CI bug to fix! Here's the error: ../arch/riscv/kernel/alternative.c:174:21: error: incompatible pointer types passing 'const struct elf64_hdr *' to parameter of type 'const Elf32_Ehdr *' (aka 'const struct elf32_hdr *') [-Werror,-Wincompatible-pointer-types] alt = find_section(hdr, shdr, ".alternative"); ^~~ ../arch/riscv/include/asm/module.h:115:60: note: passing argument to parameter 'hdr' here static inline const Elf_Shdr *find_section(const Elf_Ehdr *hdr, ^ ../arch/riscv/kernel/alternative.c:174:26: error: incompatible pointer types passing 'const struct elf64_shdr *' to parameter of type 'const Elf32_Shdr *' (aka 'const struct elf32_shdr *') [-Werror,-Wincompatible-pointer-types] alt = find_section(hdr, shdr, ".alternative"); ^~~~ ../arch/riscv/include/asm/module.h:116:25: note: passing argument to parameter 'sechdrs' here const Elf_Shdr *sechdrs, ^ ../arch/riscv/kernel/alternative.c:174:6: error: incompatible pointer types assigning to 'const struct elf64_shdr *' from 'const Elf32_Shdr *' (aka 'const struct elf32_shdr *') [-Werror,-Wincompatible-pointer-types] alt = find_section(hdr, shdr, ".alternative"); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 errors generated. Thanks, Conor.
diff --git a/arch/riscv/include/asm/vdso.h b/arch/riscv/include/asm/vdso.h index a7644f46d0e5..f891478829a5 100644 --- a/arch/riscv/include/asm/vdso.h +++ b/arch/riscv/include/asm/vdso.h @@ -28,8 +28,12 @@ #define COMPAT_VDSO_SYMBOL(base, name) \ (void __user *)((unsigned long)(base) + compat__vdso_##name##_offset) +extern char compat_vdso_start[], compat_vdso_end[]; + #endif /* CONFIG_COMPAT */ +extern char vdso_start[], vdso_end[]; + #endif /* !__ASSEMBLY__ */ #endif /* CONFIG_MMU */ diff --git a/arch/riscv/kernel/alternative.c b/arch/riscv/kernel/alternative.c index 3d4f1f32c7f6..a883a309139f 100644 --- a/arch/riscv/kernel/alternative.c +++ b/arch/riscv/kernel/alternative.c @@ -11,7 +11,9 @@ #include <linux/cpu.h> #include <linux/uaccess.h> #include <asm/alternative.h> +#include <asm/module.h> #include <asm/sections.h> +#include <asm/vdso.h> #include <asm/vendorid_list.h> #include <asm/sbi.h> #include <asm/csr.h> @@ -160,6 +162,27 @@ static void __init_or_module _apply_alternatives(struct alt_entry *begin, stage); } +static void __init apply_vdso_alternatives(void) +{ + const struct elf64_hdr *hdr; + const struct elf64_shdr *shdr; + const struct elf64_shdr *alt; + struct alt_entry *begin, *end; + + hdr = (struct elf64_hdr *)vdso_start; + shdr = (void *)hdr + hdr->e_shoff; + alt = find_section(hdr, shdr, ".alternative"); + if (!alt) + return; + + begin = (void *)hdr + alt->sh_offset, + end = (void *)hdr + alt->sh_offset + alt->sh_size, + + _apply_alternatives((struct alt_entry *)begin, + (struct alt_entry *)end, + RISCV_ALTERNATIVES_BOOT); +} + void __init apply_boot_alternatives(void) { /* If called on non-boot cpu things could go wrong */ @@ -168,6 +191,8 @@ void __init apply_boot_alternatives(void) _apply_alternatives((struct alt_entry *)__alt_start, (struct alt_entry *)__alt_end, RISCV_ALTERNATIVES_BOOT); + + apply_vdso_alternatives(); } /* diff --git a/arch/riscv/kernel/vdso.c b/arch/riscv/kernel/vdso.c index e410275918ac..4e631c098f4d 100644 --- a/arch/riscv/kernel/vdso.c +++ b/arch/riscv/kernel/vdso.c @@ -22,11 +22,6 @@ struct vdso_data { }; #endif -extern char vdso_start[], vdso_end[]; -#ifdef CONFIG_COMPAT -extern char compat_vdso_start[], compat_vdso_end[]; -#endif - enum vvar_pages { VVAR_DATA_PAGE_OFFSET, VVAR_TIMENS_PAGE_OFFSET, diff --git a/arch/riscv/kernel/vdso/vdso.lds.S b/arch/riscv/kernel/vdso/vdso.lds.S index 150b1a572e61..4a0606633290 100644 --- a/arch/riscv/kernel/vdso/vdso.lds.S +++ b/arch/riscv/kernel/vdso/vdso.lds.S @@ -40,6 +40,13 @@ SECTIONS . = 0x800; .text : { *(.text .text.*) } :text + . = ALIGN(4); + .alternative : { + __alt_start = .; + *(.alternative) + __alt_end = .; + } + .data : { *(.got.plt) *(.got) *(.data .data.* .gnu.linkonce.d.*)