Re: [RFC v3 00/13] linux: generalize sections, ranges and linker tables

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Luis,

On Fri, 22 Jul 2016 14:24:34 -0700
"Luis R. Rodriguez" <mcgrof@xxxxxxxxxx> wrote:

> This RFC v3 builds off the last RFC v2 series [0] for adding linker tables.
> The largest amount of work here was to take Russell King's feedback on
> using linker table for kprobes text not being appropriate -- and providing
> another lightweight API for simple section ranges: read-only stitched pieces
> of executable code. This required also generalizing common building blocks
> for both linker tables and section ranges, these building blocks are defined
> now in include/linux/sections.h and asm-generic/section.h. The other last thing
> decided was to not support sub-sections. In the hunt for this I could think of
> anything that really required this, and if it was needed it did not seem
> impossible to port over to avoid its use. Please let me know if there are valid
> uses cases for sub-sections.
> 
> Other significant effort here was to provide a set of common assembly helpers
> which could be used across architectures, this starts off some of this work
> for generic helpers which carve out and define custom Linux sections.
> 
> Lastly, this now also goes with two ports which required module support when
> using linker tables: jump labels, and dynamic debug support. A few
> extensions have been made to the original series in order to provide
> support for that.
> 
> Since kprobes actually had both a linker table and a section range the
> patch that dealt with kprobes is now split off in two patches, one
> that deals with its linker table and another for its section ranges.
> 
> More elaborate uses for linker tables are possible, I'll hold off on any
> of this type of work until at least the basic building blocks are fleshed
> out. To review how this work came about, and more elaborate uses being
> evaluated check out the userspace linker-tables mockup solution [1].
> Hopefully most of the possible bikeshedding was already dealt with through
> that tree. Thanks to hpa for tons of feedback.

Great! so table and ranges completely replace the old-style(add-hoc)
_kprobe and NOKPROBE_SYMBOL() implementation, good job! :)

> 
> Should you need it, the code here is also available on my linux-next
> 20160722-linker-table-v3-try2 branch on kernel.org [2]. Lastly, ranges and
> table development go under copyleft-next, Rusty recently asked for code
> to go in prior to the license tag being added denoting this license as
> GPL-compatible [3] -- I had noted in the patch submission which annotated
> copyleft-next's compatibility to GPLv2 that copyleft-next is the license
> of choice for ongoing kernel development on my end [4]. If this is
> objectionable I'm happy to change it to GPLv2 however I'd like a reason
> provided as I've gone through all possible channels to ensure this is kosher,
> including vetting by 3 attorneys now, 2 at SUSE.

I'm not a lawyer, so I don't know really it is compatible with GPLv2,
and if it is, I'm not sure the reason why we need another license.
AFAICS the license terms, most of parts looks reasonable. I just concern
clause 8, after fifteen years, is that still GPLv2 compatible?
(I'd like see FAQ about this license...)

Thank you!

> 
> This all goes tested by 0-day... however since I found an issue with linker
> tables and blackfin this series remains as RFC -- I'll try to debug the
> issue with Steven Miao. The issue with blackfin is using a config that
> enables CONFIG_FW_LOADER=y and CONFIG_DYNAMIC_DEBUG=y [5] we end up with
> the following at final link time:
> 
>   LD      init/built-in.o
> lib/built-in.o: In function `dynamic_debug_init':
> lib/dynamic_debug.c:(.init.text+0x156): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x15a): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x160): undefined reference to `__verbose'
> lib/dynamic_debug.c:(.init.text+0x164): undefined reference to `__verbose'
> lib/dynamic_debug.c:(.init.text+0x214): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x218): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x252): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x258): undefined reference to `__verbose'
> lib/dynamic_debug.c:(.init.text+0x25c): undefined reference to `__verbose__end'
> lib/dynamic_debug.c:(.init.text+0x260): undefined reference to `__verbose'
> drivers/built-in.o: In function `release_firmware':
> (.text+0x22dc2): undefined reference to `builtin_fw'
> drivers/built-in.o: In function `release_firmware':
> (.text+0x22dc6): undefined reference to `builtin_fw__end'
> drivers/built-in.o: In function `release_firmware':
> (.text+0x22dca): undefined reference to `builtin_fw'
> drivers/built-in.o: In function `release_firmware':
> (.text+0x22dce): undefined reference to `builtin_fw__end'
> drivers/built-in.o: In function `fw_get_builtin_firmware':
> drivers/base/firmware_class.c:(.text+0x23008): undefined reference to `builtin_fw'
> drivers/base/firmware_class.c:(.text+0x2300c): undefined reference to `builtin_fw__end'
> drivers/base/firmware_class.c:(.text+0x23010): undefined reference to `builtin_fw'
> drivers/base/firmware_class.c:(.text+0x23014): undefined reference to `builtin_fw__end'
> Makefile:957: recipe for target 'vmlinux' failed
> make: *** [vmlinux] Error 1
> 
> To reproduce then:
> 
> wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> wget http://drvbp1.linux-foundation.org/~mcgrof/2016/07/22/blackfin-fw-dyndbg.config -o .config
> make.cross ARCH=blackfin
> 
> [0] https://lkml.kernel.org/r/1455889559-9428-1-git-send-email-mcgrof@xxxxxxxxxx
> [1] https://git.kernel.org/cgit/linux/kernel/git/mcgrof/linker-tables.git/
> [2] https://git.kernel.org/cgit/linux/kernel/git/mcgrof/linux-next.git/log/?h=20160722-linker-table-v3-try2
> [3] https://lkml.kernel.org/r/87y44zhbiu.fsf@xxxxxxxxxxxxxxx
> [4] https://lkml.kernel.org/r/1467327207-14916-1-git-send-email-mcgrof@xxxxxxxxxx
> [5] http://drvbp1.linux-foundation.org/~mcgrof/2016/07/22/blackfin-fw-dyndbg.config
> 
> 
> Luis R. Rodriguez (13):
>   x86: remove LTO_REFERENCE_INITCALL()
>   dell-smo8800: include uaccess.h
>   scripts/module-common.lds: enable generation
>   sections.h: guard against asm and linker script
>   sections.h: add sections header to collect all section info
>   ranges.h: add helpers to build and identify Linux section ranges
>   tables.h: add linker table support
>   firmware/Makefile: force recompilation if makefile changes
>   firmware: port built-in section to linker table
>   jump_label: port __jump_table to linker tables
>   dynamic_debug: port to use linker tables
>   kprobes: port .kprobes.text to section range
>   kprobes: port blacklist kprobes to linker table
> 
>  .gitignore                                         |   2 +
>  Documentation/DocBook/Makefile                     |   3 +-
>  Documentation/DocBook/linker-tables.tmpl           | 166 ++++++
>  Documentation/DocBook/sections.tmpl                | 112 ++++
>  Documentation/kbuild/makefiles.txt                 |  19 +
>  Makefile                                           |   6 +-
>  arch/alpha/include/asm/ranges.h                    |   6 +
>  arch/alpha/include/asm/sections.h                  |   6 +
>  arch/alpha/include/asm/tables.h                    |   6 +
>  arch/arc/include/asm/ranges.h                      |   6 +
>  arch/arc/include/asm/tables.h                      |   6 +
>  arch/arc/kernel/vmlinux.lds.S                      |   1 -
>  arch/arm/include/asm/jump_label.h                  |   6 +-
>  arch/arm/include/asm/ranges.h                      |   6 +
>  arch/arm/include/asm/sections.h                    |   2 +
>  arch/arm/include/asm/tables.h                      |   6 +
>  arch/arm/kernel/entry-armv.S                       |   3 +-
>  arch/arm/kernel/vmlinux-xip.lds.S                  |   1 -
>  arch/arm/kernel/vmlinux.lds.S                      |   1 -
>  arch/arm64/include/asm/jump_label.h                |   6 +-
>  arch/arm64/include/asm/ranges.h                    |   6 +
>  arch/arm64/include/asm/sections.h                  |   6 +
>  arch/arm64/include/asm/tables.h                    |   6 +
>  arch/avr32/include/asm/ranges.h                    |   6 +
>  arch/avr32/include/asm/sections.h                  |   6 +
>  arch/avr32/include/asm/tables.h                    |   6 +
>  arch/avr32/kernel/entry-avr32b.S                   |   5 +-
>  arch/avr32/kernel/vmlinux.lds.S                    |   1 -
>  arch/blackfin/include/asm/ranges.h                 |   6 +
>  arch/blackfin/include/asm/sections.h               |   4 +
>  arch/blackfin/include/asm/tables.h                 |   6 +
>  arch/blackfin/kernel/vmlinux.lds.S                 |   1 -
>  arch/c6x/include/asm/ranges.h                      |   6 +
>  arch/c6x/include/asm/tables.h                      |   6 +
>  arch/c6x/kernel/vmlinux.lds.S                      |   1 -
>  arch/cris/include/asm/ranges.h                     |   6 +
>  arch/cris/include/asm/sections.h                   |   6 +
>  arch/cris/include/asm/tables.h                     |   6 +
>  arch/frv/include/asm/ranges.h                      |   6 +
>  arch/frv/include/asm/tables.h                      |   6 +
>  arch/h8300/include/asm/ranges.h                    |   6 +
>  arch/h8300/include/asm/sections.h                  |   6 +
>  arch/h8300/include/asm/tables.h                    |   6 +
>  arch/hexagon/include/asm/ranges.h                  |   6 +
>  arch/hexagon/include/asm/sections.h                |   6 +
>  arch/hexagon/include/asm/tables.h                  |   6 +
>  arch/hexagon/kernel/vmlinux.lds.S                  |   1 -
>  arch/ia64/include/asm/ranges.h                     |   6 +
>  arch/ia64/include/asm/sections.h                   |   7 +-
>  arch/ia64/include/asm/tables.h                     |   6 +
>  arch/ia64/kernel/jprobes.S                         |   3 +-
>  arch/ia64/kernel/vmlinux.lds.S                     |   1 -
>  arch/ia64/lib/flush.S                              |   5 +-
>  arch/m32r/include/asm/ranges.h                     |   6 +
>  arch/m32r/include/asm/sections.h                   |   6 +
>  arch/m32r/include/asm/tables.h                     |   6 +
>  arch/m68k/include/asm/ranges.h                     |   6 +
>  arch/m68k/include/asm/sections.h                   |   6 +
>  arch/m68k/include/asm/tables.h                     |   6 +
>  arch/metag/include/asm/ranges.h                    |   6 +
>  arch/metag/include/asm/sections.h                  |   6 +
>  arch/metag/include/asm/tables.h                    |   6 +
>  arch/metag/kernel/vmlinux.lds.S                    |   1 -
>  arch/microblaze/include/asm/ranges.h               |   6 +
>  arch/microblaze/include/asm/tables.h               |   6 +
>  arch/microblaze/kernel/vmlinux.lds.S               |   1 -
>  arch/mips/include/asm/jump_label.h                 |   6 +-
>  arch/mips/include/asm/ranges.h                     |   6 +
>  arch/mips/include/asm/sections.h                   |   6 +
>  arch/mips/include/asm/tables.h                     |   6 +
>  arch/mips/kernel/vmlinux.lds.S                     |   1 -
>  arch/mn10300/include/asm/ranges.h                  |   6 +
>  arch/mn10300/include/asm/sections.h                |   6 +
>  arch/mn10300/include/asm/tables.h                  |   6 +
>  arch/mn10300/kernel/vmlinux.lds.S                  |   1 -
>  arch/nios2/include/asm/ranges.h                    |   6 +
>  arch/nios2/include/asm/sections.h                  |   6 +
>  arch/nios2/include/asm/tables.h                    |   6 +
>  arch/nios2/kernel/vmlinux.lds.S                    |   1 -
>  arch/openrisc/include/asm/ranges.h                 |   6 +
>  arch/openrisc/include/asm/sections.h               |   6 +
>  arch/openrisc/include/asm/tables.h                 |   6 +
>  arch/openrisc/kernel/vmlinux.lds.S                 |   1 -
>  arch/parisc/include/asm/ranges.h                   |   6 +
>  arch/parisc/include/asm/tables.h                   |   6 +
>  arch/parisc/kernel/vmlinux.lds.S                   |   1 -
>  arch/powerpc/include/asm/jump_label.h              |   8 +-
>  arch/powerpc/include/asm/ppc_asm.h                 |   7 +-
>  arch/powerpc/include/asm/ranges.h                  |   6 +
>  arch/powerpc/include/asm/sections.h                |  11 +-
>  arch/powerpc/include/asm/tables.h                  |   6 +
>  arch/powerpc/kernel/vmlinux.lds.S                  |   1 -
>  arch/s390/include/asm/jump_label.h                 |   6 +-
>  arch/s390/include/asm/ranges.h                     |   6 +
>  arch/s390/include/asm/tables.h                     |   6 +
>  arch/s390/kernel/entry.S                           |   5 +-
>  arch/s390/kernel/kprobes.c                         |   6 +-
>  arch/s390/kernel/mcount.S                          |   2 +-
>  arch/s390/kernel/vmlinux.lds.S                     |   1 -
>  arch/score/include/asm/ranges.h                    |   6 +
>  arch/score/include/asm/sections.h                  |   6 +
>  arch/score/include/asm/tables.h                    |   6 +
>  arch/score/kernel/vmlinux.lds.S                    |   1 -
>  arch/sh/include/asm/ranges.h                       |   6 +
>  arch/sh/include/asm/sections.h                     |   2 +
>  arch/sh/include/asm/tables.h                       |   6 +
>  arch/sh/kernel/vmlinux.lds.S                       |   1 -
>  arch/sparc/include/asm/jump_label.h                |   6 +-
>  arch/sparc/include/asm/ranges.h                    |   6 +
>  arch/sparc/include/asm/sections.h                  |   4 +
>  arch/sparc/include/asm/tables.h                    |   6 +
>  arch/sparc/kernel/vmlinux.lds.S                    |   1 -
>  arch/sparc/mm/ultra.S                              |   3 +-
>  arch/tile/include/asm/ranges.h                     |   6 +
>  arch/tile/include/asm/sections.h                   |   4 +
>  arch/tile/include/asm/tables.h                     |   6 +
>  arch/tile/kernel/vmlinux.lds.S                     |   1 -
>  arch/um/include/asm/ranges.h                       |   6 +
>  arch/um/include/asm/tables.h                       |   6 +
>  arch/unicore32/include/asm/ranges.h                |   6 +
>  arch/unicore32/include/asm/sections.h              |   6 +
>  arch/unicore32/include/asm/tables.h                |   6 +
>  arch/x86/include/asm/jump_label.h                  |  10 +-
>  arch/x86/include/asm/ranges.h                      |   6 +
>  arch/x86/include/asm/sections.h                    |  23 +-
>  arch/x86/include/asm/tables.h                      |   6 +
>  arch/x86/include/asm/uaccess.h                     |  18 +-
>  arch/x86/kernel/cpu/microcode/core.c               |   8 +-
>  arch/x86/kernel/kprobes/core.c                     |  11 +-
>  arch/x86/kernel/vmlinux.lds.S                      |   1 -
>  arch/x86/tools/relocs.c                            |   3 +
>  arch/xtensa/include/asm/ranges.h                   |   6 +
>  arch/xtensa/include/asm/sections.h                 |   6 +
>  arch/xtensa/include/asm/tables.h                   |   6 +
>  drivers/base/firmware_class.c                      |  12 +-
>  drivers/platform/x86/dell-smo8800.c                |   1 +
>  firmware/Makefile                                  |   7 +-
>  include/asm-generic/ranges.h                       |  70 +++
>  include/asm-generic/sections.h                     | 306 ++++++++++-
>  include/asm-generic/tables.h                       |  70 +++
>  include/asm-generic/vmlinux.lds.h                  |  66 +--
>  include/linux/compiler.h                           |   2 +-
>  include/linux/dynamic_debug.h                      |   5 +-
>  include/linux/init.h                               |  20 +-
>  include/linux/jump_label.h                         |  10 +-
>  include/linux/kprobes.h                            |   8 +-
>  include/linux/ranges.h                             |  54 ++
>  include/linux/sections.h                           | 123 +++++
>  include/linux/tables.h                             | 597 +++++++++++++++++++++
>  kernel/jump_label.c                                |  17 +-
>  kernel/kprobes.c                                   |  17 +-
>  lib/dynamic_debug.c                                |  13 +-
>  scripts/Makefile                                   |   1 +
>  scripts/Makefile.build                             |   4 +-
>  scripts/Makefile.clean                             |   1 +
>  scripts/Makefile.lib                               |  12 +
>  scripts/Makefile.modpost                           |   2 +-
>  scripts/mod/Makefile                               |   2 +
>  scripts/mod/modpost.c                              |   8 +-
>  scripts/{module-common.lds => module-common.lds.S} |   6 +
>  scripts/recordmcount.c                             |   7 +-
>  scripts/recordmcount.pl                            |   2 +-
>  tools/include/linux/sections.h                     |  13 +
>  tools/objtool/special.c                            |   8 +-
>  164 files changed, 2241 insertions(+), 205 deletions(-)
>  create mode 100644 Documentation/DocBook/linker-tables.tmpl
>  create mode 100644 Documentation/DocBook/sections.tmpl
>  create mode 100644 arch/alpha/include/asm/ranges.h
>  create mode 100644 arch/alpha/include/asm/sections.h
>  create mode 100644 arch/alpha/include/asm/tables.h
>  create mode 100644 arch/arc/include/asm/ranges.h
>  create mode 100644 arch/arc/include/asm/tables.h
>  create mode 100644 arch/arm/include/asm/ranges.h
>  create mode 100644 arch/arm/include/asm/tables.h
>  create mode 100644 arch/arm64/include/asm/ranges.h
>  create mode 100644 arch/arm64/include/asm/sections.h
>  create mode 100644 arch/arm64/include/asm/tables.h
>  create mode 100644 arch/avr32/include/asm/ranges.h
>  create mode 100644 arch/avr32/include/asm/sections.h
>  create mode 100644 arch/avr32/include/asm/tables.h
>  create mode 100644 arch/blackfin/include/asm/ranges.h
>  create mode 100644 arch/blackfin/include/asm/tables.h
>  create mode 100644 arch/c6x/include/asm/ranges.h
>  create mode 100644 arch/c6x/include/asm/tables.h
>  create mode 100644 arch/cris/include/asm/ranges.h
>  create mode 100644 arch/cris/include/asm/sections.h
>  create mode 100644 arch/cris/include/asm/tables.h
>  create mode 100644 arch/frv/include/asm/ranges.h
>  create mode 100644 arch/frv/include/asm/tables.h
>  create mode 100644 arch/h8300/include/asm/ranges.h
>  create mode 100644 arch/h8300/include/asm/sections.h
>  create mode 100644 arch/h8300/include/asm/tables.h
>  create mode 100644 arch/hexagon/include/asm/ranges.h
>  create mode 100644 arch/hexagon/include/asm/sections.h
>  create mode 100644 arch/hexagon/include/asm/tables.h
>  create mode 100644 arch/ia64/include/asm/ranges.h
>  create mode 100644 arch/ia64/include/asm/tables.h
>  create mode 100644 arch/m32r/include/asm/ranges.h
>  create mode 100644 arch/m32r/include/asm/sections.h
>  create mode 100644 arch/m32r/include/asm/tables.h
>  create mode 100644 arch/m68k/include/asm/ranges.h
>  create mode 100644 arch/m68k/include/asm/sections.h
>  create mode 100644 arch/m68k/include/asm/tables.h
>  create mode 100644 arch/metag/include/asm/ranges.h
>  create mode 100644 arch/metag/include/asm/sections.h
>  create mode 100644 arch/metag/include/asm/tables.h
>  create mode 100644 arch/microblaze/include/asm/ranges.h
>  create mode 100644 arch/microblaze/include/asm/tables.h
>  create mode 100644 arch/mips/include/asm/ranges.h
>  create mode 100644 arch/mips/include/asm/sections.h
>  create mode 100644 arch/mips/include/asm/tables.h
>  create mode 100644 arch/mn10300/include/asm/ranges.h
>  create mode 100644 arch/mn10300/include/asm/sections.h
>  create mode 100644 arch/mn10300/include/asm/tables.h
>  create mode 100644 arch/nios2/include/asm/ranges.h
>  create mode 100644 arch/nios2/include/asm/sections.h
>  create mode 100644 arch/nios2/include/asm/tables.h
>  create mode 100644 arch/openrisc/include/asm/ranges.h
>  create mode 100644 arch/openrisc/include/asm/sections.h
>  create mode 100644 arch/openrisc/include/asm/tables.h
>  create mode 100644 arch/parisc/include/asm/ranges.h
>  create mode 100644 arch/parisc/include/asm/tables.h
>  create mode 100644 arch/powerpc/include/asm/ranges.h
>  create mode 100644 arch/powerpc/include/asm/tables.h
>  create mode 100644 arch/s390/include/asm/ranges.h
>  create mode 100644 arch/s390/include/asm/tables.h
>  create mode 100644 arch/score/include/asm/ranges.h
>  create mode 100644 arch/score/include/asm/sections.h
>  create mode 100644 arch/score/include/asm/tables.h
>  create mode 100644 arch/sh/include/asm/ranges.h
>  create mode 100644 arch/sh/include/asm/tables.h
>  create mode 100644 arch/sparc/include/asm/ranges.h
>  create mode 100644 arch/sparc/include/asm/tables.h
>  create mode 100644 arch/tile/include/asm/ranges.h
>  create mode 100644 arch/tile/include/asm/tables.h
>  create mode 100644 arch/um/include/asm/ranges.h
>  create mode 100644 arch/um/include/asm/tables.h
>  create mode 100644 arch/unicore32/include/asm/ranges.h
>  create mode 100644 arch/unicore32/include/asm/sections.h
>  create mode 100644 arch/unicore32/include/asm/tables.h
>  create mode 100644 arch/x86/include/asm/ranges.h
>  create mode 100644 arch/x86/include/asm/tables.h
>  create mode 100644 arch/xtensa/include/asm/ranges.h
>  create mode 100644 arch/xtensa/include/asm/sections.h
>  create mode 100644 arch/xtensa/include/asm/tables.h
>  create mode 100644 include/asm-generic/ranges.h
>  create mode 100644 include/asm-generic/tables.h
>  create mode 100644 include/linux/ranges.h
>  create mode 100644 include/linux/sections.h
>  create mode 100644 include/linux/tables.h
>  rename scripts/{module-common.lds => module-common.lds.S} (80%)
>  create mode 100644 tools/include/linux/sections.h
> 
> -- 
> 2.8.4
> 


-- 
Masami Hiramatsu <mhiramat@xxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux