Message ID | 20200313154345.56760-1-vincenzo.frascino@arm.com (mailing list archive) |
---|---|
Headers | show |
Series | Introduce common headers for vDSO | expand |
Hi Vincenzo, all I like the idea, but I'm wondering if we could have less-grained headers? Like, AFAICS the patches create headers < 10 lines and even mostly < 5 lines.. I like that header's names perfectly describe what's inside, but I'm not sure how effective to have a lot of extra-small includes. Or maybe there's a plan to grow the code in them? On 3/13/20 3:43 PM, Vincenzo Frascino wrote: [..] > create mode 100644 arch/arm/include/asm/vdso/clocksource.h > create mode 100644 arch/arm/include/asm/vdso/cp15.h > create mode 100644 arch/arm/include/asm/vdso/processor.h > create mode 100644 arch/arm64/include/asm/vdso/arch_timer.h > create mode 100644 arch/arm64/include/asm/vdso/clocksource.h > create mode 100644 arch/arm64/include/asm/vdso/processor.h > create mode 100644 arch/mips/include/asm/vdso/clocksource.h > create mode 100644 arch/mips/include/asm/vdso/processor.h > create mode 100644 arch/x86/include/asm/vdso/clocksource.h > create mode 100644 arch/x86/include/asm/vdso/processor.h > create mode 100644 include/vdso/bits.h > create mode 100644 include/vdso/clocksource.h > create mode 100644 include/vdso/const.h > create mode 100644 include/vdso/jiffies.h > create mode 100644 include/vdso/ktime.h > create mode 100644 include/vdso/limits.h > create mode 100644 include/vdso/math64.h > create mode 100644 include/vdso/processor.h > create mode 100644 include/vdso/time.h > create mode 100644 include/vdso/time32.h > create mode 100644 include/vdso/time64.h Maybe we could made them less-grained? I.e, time32 + time64 + time.h => time.h? Thanks for Cc, Dmitry
Dmitry Safonov <0x7f454c46@gmail.com> writes: > I like the idea, but I'm wondering if we could have less-grained > headers? Like, AFAICS the patches create headers < 10 lines and even > mostly < 5 lines.. I like that header's names perfectly describe what's > inside, but I'm not sure how effective to have a lot of extra-small > includes. If that goes all into a big header then the headers from where the bits and pieces are split out would have all to include this big header which might result in other include dependency nightmares. >> create mode 100644 include/vdso/time.h >> create mode 100644 include/vdso/time32.h >> create mode 100644 include/vdso/time64.h > > Maybe we could made them less-grained? > > I.e, time32 + time64 + time.h => time.h? Then you end up with ifdeffery. I like the clear separation. Thanks, tglx
Back in July last year we started having a problem in building compat vDSOs on arm64 [1] [2] that was not present when the arm64 porting to the Unified vDSO was done. In particular when the compat vDSO on such architecture is built with gcc it generates the warning below: In file included from ./arch/arm64/include/asm/thread_info.h:17:0, from ./include/linux/thread_info.h:38, from ./arch/arm64/include/asm/preempt.h:5, from ./include/linux/preempt.h:78, from ./include/linux/spinlock.h:51, from ./include/linux/seqlock.h:36, from ./include/linux/time.h:6, from ./lib/vdso/gettimeofday.c:7, from <command-line>:0: ./arch/arm64/include/asm/memory.h: In function ‘__tag_set’: ./arch/arm64/include/asm/memory.h:233:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] u64 __addr = (u64)addr & ~__tag_shifted(0xff); ^ In file included from ./arch/arm64/include/asm/pgtable-hwdef.h:8:0, from ./arch/arm64/include/asm/processor.h:34, from ./arch/arm64/include/asm/elf.h:118, from ./include/linux/elf.h:5, from ./include/linux/elfnote.h:62, from arch/arm64/kernel/vdso32/note.c:11: ./arch/arm64/include/asm/memory.h: In function ‘__tag_set’: ./arch/arm64/include/asm/memory.h:233:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] u64 __addr = (u64)addr & ~__tag_shifted(0xff); The same porting does not build at all when the selected compiler is clang. I started an investigation to try to understand better the problem and after various discussions at Plumbers and Recipes last year the conclusion was that the vDSO library as it stands it is including more headers that it needs. In particular, being a user-space library, it should require only the UAPI and a minimal vDSO kernel interface instead of all the kernel-related inline functions which are not directly used and in some cases can have side effects. To solve the problem, I decided to use the approach below: * Extract from include/linux/ the vDSO required kernel interface and place it in include/vdso/ * Make sure that where meaningful the kernel includes "vdso" headers. * Limit the vDSO library to include headers coming only from UAPI and "vdso" (with 2 exceptions compiler.h for barriers and param.h for HZ). * Adapt all the architectures that support the unified vDSO library to use "vdso" headers. According to me this approach allows up to exercise a better control on what the vDSO library can include and to prevent potential issues in future. This patch series contains the implementation of the described approach. The "vdso" headers have been verified on all the architectures that support unified vDSO using the vdsotest [3] testsuite for what concerns the vDSO part and randconfig to verify that they are included in the correct places. To simplify the testing, a copy of the patchset on top of a recent linux tree can be found at [4]. [1] https://github.com/ClangBuiltLinux/linux/issues/595 [2] https://lore.kernel.org/lkml/20190926151704.GH9689@arrakis.emea.arm.com [3] https://github.com/nathanlynch/vdsotest [4] git://linux-arm.org/linux-vf.git common-headers/v3 Changes: -------- v3: - Changed the namespace from common to vdso. - Addressed an issue involving parisc modules compilation. - Added vdso header for clocksource.h. - Addressed review comments. - Rebased on tip/timers/core. v2: - Addressed review comments for clang support. - Rebased on 5.6-rc4. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Russell King <linux@armlinux.org.uk> Cc: Paul Burton <paul.burton@mips.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Stephen Boyd <sboyd@kernel.org> Cc: Mark Salyzyn <salyzyn@android.com> Cc: Kees Cook <keescook@chromium.org> Cc: Peter Collingbourne <pcc@google.com> Cc: Dmitry Safonov <0x7f454c46@gmail.com> Cc: Andrei Vagin <avagin@openvz.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Mark Rutland <Mark.Rutland@arm.com> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Vincenzo Frascino (26): linux/const.h: Extract common header for vDSO linux/bits.h: Extract common header for vDSO linux/limits.h: Extract common header for vDSO x86:Introduce asm/vdso/clocksource.h arm: Introduce asm/vdso/clocksource.h arm64: Introduce asm/vdso/clocksource.h mips: Introduce asm/vdso/clocksource.h linux/clocksource.h: Extract common header for vDSO linux/math64.h: Extract common header for vDSO linux/time.h: Extract common header for vDSO linux/time32.h: Extract common header for vDSO linux/time64.h: Extract common header for vDSO linux/jiffies.h: Extract common header for vDSO linux/ktime.h: Extract common header for vDSO common: Introduce processor.h scripts: Fix the inclusion order in modpost linux/elfnote.h: Replace elf.h with UAPI equivalent arm64: Introduce asm/vdso/processor.h arm64: vdso: Include common headers in the vdso library arm64: vdso32: Include common headers in the vdso library arm64: Introduce asm/vdso/arch_timer.h mips: vdso: Enable mips to use common headers x86: vdso: Enable x86 to use common headers arm: vdso: Enable arm to use common headers lib: vdso: Enable common headers arm64: vdso32: Enable Clang Compilation arch/arm/include/asm/clocksource.h | 6 +-- arch/arm/include/asm/cp15.h | 20 +--------- arch/arm/include/asm/processor.h | 11 +----- arch/arm/include/asm/vdso/clocksource.h | 8 ++++ arch/arm/include/asm/vdso/cp15.h | 38 +++++++++++++++++++ arch/arm/include/asm/vdso/gettimeofday.h | 4 +- arch/arm/include/asm/vdso/processor.h | 22 +++++++++++ arch/arm64/include/asm/arch_timer.h | 29 +++----------- arch/arm64/include/asm/clocksource.h | 3 +- arch/arm64/include/asm/processor.h | 16 +------- arch/arm64/include/asm/vdso/arch_timer.h | 33 ++++++++++++++++ arch/arm64/include/asm/vdso/clocksource.h | 8 ++++ .../include/asm/vdso/compat_gettimeofday.h | 2 +- arch/arm64/include/asm/vdso/gettimeofday.h | 8 ++-- arch/arm64/include/asm/vdso/processor.h | 31 +++++++++++++++ arch/arm64/kernel/vdso/vgettimeofday.c | 2 - arch/arm64/kernel/vdso32/Makefile | 11 ++++++ arch/arm64/kernel/vdso32/vgettimeofday.c | 3 -- arch/mips/include/asm/clocksource.h | 4 +- arch/mips/include/asm/processor.h | 16 +------- arch/mips/include/asm/vdso/clocksource.h | 9 +++++ arch/mips/include/asm/vdso/gettimeofday.h | 4 -- arch/mips/include/asm/vdso/processor.h | 27 +++++++++++++ arch/x86/include/asm/clocksource.h | 5 +-- arch/x86/include/asm/processor.h | 12 +----- arch/x86/include/asm/vdso/clocksource.h | 10 +++++ arch/x86/include/asm/vdso/processor.h | 23 +++++++++++ include/linux/bits.h | 2 +- include/linux/clocksource.h | 11 +----- include/linux/const.h | 5 +-- include/linux/elfnote.h | 2 +- include/linux/jiffies.h | 4 +- include/linux/ktime.h | 9 +---- include/linux/limits.h | 13 +------ include/linux/math64.h | 20 +--------- include/linux/time.h | 5 +-- include/linux/time32.h | 14 +------ include/linux/time64.h | 10 +---- include/vdso/bits.h | 9 +++++ include/vdso/clocksource.h | 23 +++++++++++ include/vdso/const.h | 10 +++++ include/vdso/datapage.h | 33 ++++++++++++++-- include/vdso/jiffies.h | 11 ++++++ include/vdso/ktime.h | 16 ++++++++ include/vdso/limits.h | 18 +++++++++ include/vdso/math64.h | 24 ++++++++++++ include/vdso/processor.h | 14 +++++++ include/vdso/time.h | 12 ++++++ include/vdso/time32.h | 17 +++++++++ include/vdso/time64.h | 14 +++++++ lib/vdso/gettimeofday.c | 22 ----------- scripts/mod/modpost.c | 6 ++- 52 files changed, 459 insertions(+), 230 deletions(-) create mode 100644 arch/arm/include/asm/vdso/clocksource.h create mode 100644 arch/arm/include/asm/vdso/cp15.h create mode 100644 arch/arm/include/asm/vdso/processor.h create mode 100644 arch/arm64/include/asm/vdso/arch_timer.h create mode 100644 arch/arm64/include/asm/vdso/clocksource.h create mode 100644 arch/arm64/include/asm/vdso/processor.h create mode 100644 arch/mips/include/asm/vdso/clocksource.h create mode 100644 arch/mips/include/asm/vdso/processor.h create mode 100644 arch/x86/include/asm/vdso/clocksource.h create mode 100644 arch/x86/include/asm/vdso/processor.h create mode 100644 include/vdso/bits.h create mode 100644 include/vdso/clocksource.h create mode 100644 include/vdso/const.h create mode 100644 include/vdso/jiffies.h create mode 100644 include/vdso/ktime.h create mode 100644 include/vdso/limits.h create mode 100644 include/vdso/math64.h create mode 100644 include/vdso/processor.h create mode 100644 include/vdso/time.h create mode 100644 include/vdso/time32.h create mode 100644 include/vdso/time64.h