License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 14:07:57 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2005-04-16 22:20:36 +00:00
|
|
|
#ifndef _LINUX_INIT_H
|
|
|
|
#define _LINUX_INIT_H
|
|
|
|
|
2022-11-13 11:08:02 +00:00
|
|
|
#include <linux/build_bug.h>
|
2005-04-16 22:20:36 +00:00
|
|
|
#include <linux/compiler.h>
|
2022-11-13 11:08:02 +00:00
|
|
|
#include <linux/stringify.h>
|
2012-01-12 23:02:18 +00:00
|
|
|
#include <linux/types.h>
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2018-02-01 11:27:20 +00:00
|
|
|
/* Built-in __init functions needn't be compiled with retpoline */
|
2018-02-19 10:50:57 +00:00
|
|
|
#if defined(__noretpoline) && !defined(MODULE)
|
|
|
|
#define __noinitretpoline __noretpoline
|
2018-02-01 11:27:20 +00:00
|
|
|
#else
|
2018-02-19 10:50:57 +00:00
|
|
|
#define __noinitretpoline
|
2018-02-01 11:27:20 +00:00
|
|
|
#endif
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/* These macros are used to mark some functions or
|
|
|
|
* initialized data (doesn't apply to uninitialized data)
|
|
|
|
* as `initialization' functions. The kernel can take this
|
|
|
|
* as hint that the function is used only during the initialization
|
|
|
|
* phase and free up used memory resources after
|
|
|
|
*
|
|
|
|
* Usage:
|
|
|
|
* For functions:
|
|
|
|
*
|
|
|
|
* You should add __init immediately before the function name, like:
|
|
|
|
*
|
|
|
|
* static void __init initme(int x, int y)
|
|
|
|
* {
|
|
|
|
* extern int z; z = x * y;
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* If the function has a prototype somewhere, you can also add
|
|
|
|
* __init between closing brace of the prototype and semicolon:
|
|
|
|
*
|
|
|
|
* extern int initialize_foobar_device(int, int, int) __init;
|
|
|
|
*
|
|
|
|
* For initialized data:
|
2013-11-12 23:10:19 +00:00
|
|
|
* You should insert __initdata or __initconst between the variable name
|
|
|
|
* and equal sign followed by value, e.g.:
|
2005-04-16 22:20:36 +00:00
|
|
|
*
|
|
|
|
* static int init_variable __initdata = 0;
|
2009-06-16 22:34:19 +00:00
|
|
|
* static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
|
2005-04-16 22:20:36 +00:00
|
|
|
*
|
|
|
|
* Don't forget to initialize data not at file scope, i.e. within a function,
|
|
|
|
* as gcc otherwise puts the data into the bss section and not into the init
|
|
|
|
* section.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* These are for everybody (although not all archs will actually
|
|
|
|
discard it in modules) */
|
2022-09-08 21:54:54 +00:00
|
|
|
#define __init __section(".init.text") __cold __latent_entropy __noinitretpoline
|
2020-10-22 02:36:07 +00:00
|
|
|
#define __initdata __section(".init.data")
|
|
|
|
#define __initconst __section(".init.rodata")
|
|
|
|
#define __exitdata __section(".exit.data")
|
|
|
|
#define __exit_call __used __section(".exitcall.exit")
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2010-08-12 15:43:56 +00:00
|
|
|
/*
|
|
|
|
* modpost check for section mismatches during the kernel build.
|
2007-05-17 18:14:48 +00:00
|
|
|
* A section mismatch happens when there are references from a
|
|
|
|
* code or data section to an init section (both code or data).
|
|
|
|
* The init sections are (for most archs) discarded by the kernel
|
|
|
|
* when early init has completed so all such references are potential bugs.
|
|
|
|
* For exit sections the same issue exists.
|
2010-08-12 15:43:56 +00:00
|
|
|
*
|
2007-05-17 18:14:48 +00:00
|
|
|
* The following markers are used for the cases where the reference to
|
2008-01-28 19:21:15 +00:00
|
|
|
* the *init / *exit section (code or data) is valid and will teach
|
2010-08-12 15:43:56 +00:00
|
|
|
* modpost not to issue a warning. Intended semantics is that a code or
|
|
|
|
* data tagged __ref* can reference code or data from init section without
|
|
|
|
* producing a warning (of course, no warning does not mean code is
|
|
|
|
* correct, so optimally document why the __ref is needed and why it's OK).
|
|
|
|
*
|
|
|
|
* The markers follow same syntax rules as __init / __initdata.
|
|
|
|
*/
|
2020-10-22 02:36:07 +00:00
|
|
|
#define __ref __section(".ref.text") noinline
|
|
|
|
#define __refdata __section(".ref.data")
|
|
|
|
#define __refconst __section(".ref.rodata")
|
2008-01-28 19:21:15 +00:00
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
#ifdef MODULE
|
2008-01-20 19:07:28 +00:00
|
|
|
#define __exitused
|
2005-04-16 22:20:36 +00:00
|
|
|
#else
|
2008-01-20 19:07:28 +00:00
|
|
|
#define __exitused __used
|
2005-04-16 22:20:36 +00:00
|
|
|
#endif
|
|
|
|
|
2020-10-22 02:36:07 +00:00
|
|
|
#define __exit __section(".exit.text") __exitused __cold notrace
|
2008-01-20 19:07:28 +00:00
|
|
|
|
2024-07-06 16:05:06 +00:00
|
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
|
|
#define __meminit
|
|
|
|
#define __meminitdata
|
|
|
|
#define __meminitconst
|
|
|
|
#else
|
|
|
|
#define __meminit __init
|
|
|
|
#define __meminitdata __initdata
|
|
|
|
#define __meminitconst __initconst
|
|
|
|
#endif
|
2008-01-20 19:07:28 +00:00
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/* For assembly routines */
|
2009-06-14 20:10:41 +00:00
|
|
|
#define __HEAD .section ".head.text","ax"
|
2005-04-16 22:20:36 +00:00
|
|
|
#define __INIT .section ".init.text","ax"
|
2007-05-02 17:27:05 +00:00
|
|
|
#define __FINIT .previous
|
2008-01-20 19:07:28 +00:00
|
|
|
|
2009-08-19 07:40:48 +00:00
|
|
|
#define __INITDATA .section ".init.data","aw",%progbits
|
|
|
|
#define __INITRODATA .section ".init.rodata","a",%progbits
|
2008-02-06 21:39:45 +00:00
|
|
|
#define __FINITDATA .previous
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2008-01-28 19:21:15 +00:00
|
|
|
/* silence warnings when references are OK */
|
|
|
|
#define __REF .section ".ref.text", "ax"
|
|
|
|
#define __REFDATA .section ".ref.data", "aw"
|
2008-10-25 22:02:51 +00:00
|
|
|
#define __REFCONST .section ".ref.rodata", "a"
|
2008-01-28 19:21:15 +00:00
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/*
|
|
|
|
* Used for initialization calls..
|
|
|
|
*/
|
|
|
|
typedef int (*initcall_t)(void);
|
|
|
|
typedef void (*exitcall_t)(void);
|
|
|
|
|
2018-08-22 04:56:13 +00:00
|
|
|
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
|
|
|
typedef int initcall_entry_t;
|
|
|
|
|
|
|
|
static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
|
|
|
|
{
|
|
|
|
return offset_to_ptr(entry);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
typedef initcall_t initcall_entry_t;
|
|
|
|
|
|
|
|
static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
|
|
|
|
{
|
|
|
|
return *entry;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2022-09-05 02:10:34 +00:00
|
|
|
/* Used for constructor calls. */
|
2009-06-17 23:28:03 +00:00
|
|
|
typedef void (*ctor_fn_t)(void);
|
|
|
|
|
2019-05-30 21:48:35 +00:00
|
|
|
struct file_system_type;
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/* Defined in init/main.c */
|
2008-07-30 19:49:02 +00:00
|
|
|
extern int do_one_initcall(initcall_t fn);
|
[PATCH] Dynamic kernel command-line: common
Current implementation stores a static command-line buffer allocated to
COMMAND_LINE_SIZE size. Most architectures stores two copies of this buffer,
one for future reference and one for parameter parsing.
Current kernel command-line size for most architecture is much too small for
module parameters, video settings, initramfs paramters and much more. The
problem is that setting COMMAND_LINE_SIZE to a grater value, allocates static
buffers.
In order to allow a greater command-line size, these buffers should be
dynamically allocated or marked as init disposable buffers, so unused memory
can be released.
This patch renames the static saved_command_line variable into
boot_command_line adding __initdata attribute, so that it can be disposed
after initialization. This rename is required so applications that use
saved_command_line will not be affected by this change.
It reintroduces saved_command_line as dynamically allocated buffer to match
the data in boot_command_line.
It also mark secondary command-line buffer as __initdata, and copies it to
dynamically allocated static_command_line buffer components may hold reference
to it after initialization.
This patch is for linux-2.6.20-rc4-mm1 and is divided to target each
architecture. I could not check this in any architecture so please forgive me
if I got it wrong.
The per-architecture modification is very simple, use boot_command_line in
place of saved_command_line. The common code is the change into dynamic
command-line.
This patch:
1. Rename saved_command_line into boot_command_line, mark as init
disposable.
2. Add dynamic allocated saved_command_line.
3. Add dynamic allocated static_command_line.
4. During startup copy: boot_command_line into saved_command_line. arch
command_line into static_command_line.
5. Parse static_command_line and not arch command_line, so arch
command_line may be freed.
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Ian Molton <spyro@f2s.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Cc: Richard Curnow <rc@rc0.org.uk>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
Cc: Chris Zankel <chris@zankel.net>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Greg Ungerer <gerg@uclinux.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-12 08:53:52 +00:00
|
|
|
extern char __initdata boot_command_line[];
|
|
|
|
extern char *saved_command_line;
|
proc: give /proc/cmdline size
Most /proc files don't have length (in fstat sense). This leads to
inefficiencies when reading such files with APIs commonly found in modern
programming languages. They open file, then fstat descriptor, get st_size
== 0 and either assume file is empty or start reading without knowing
target size.
cat(1) does OK because it uses large enough buffer by default. But naive
programs copy-pasted from SO aren't:
let mut f = std::fs::File::open("/proc/cmdline").unwrap();
let mut buf: Vec<u8> = Vec::new();
f.read_to_end(&mut buf).unwrap();
will result in
openat(AT_FDCWD, "/proc/cmdline", O_RDONLY|O_CLOEXEC) = 3
statx(0, NULL, AT_STATX_SYNC_AS_STAT, STATX_ALL, NULL) = -1 EFAULT (Bad address)
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_EMPTY_PATH, STATX_ALL, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0444, stx_size=0, ...}) = 0
lseek(3, 0, SEEK_CUR) = 0
read(3, "BOOT_IMAGE=(hd3,gpt2)/vmlinuz-5.", 32) = 32
read(3, "19.6-100.fc35.x86_64 root=/dev/m", 32) = 32
read(3, "apper/fedora_localhost--live-roo"..., 64) = 64
read(3, "ocalhost--live-swap rd.lvm.lv=fe"..., 128) = 116
read(3, "", 12)
open/stat is OK, lseek looks silly but there are 3 unnecessary reads
because Rust starts with 32 bytes per Vec<u8> and grows from there.
In case of /proc/cmdline, the length is known precisely.
Make variables readonly while I'm at it.
P.S.: I tried to scp /proc/cpuinfo today and got empty file
but this is separate story.
Link: https://lkml.kernel.org/r/YxoywlbM73JJN3r+@localhost.localdomain
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2022-09-08 18:21:54 +00:00
|
|
|
extern unsigned int saved_command_line_len;
|
2006-09-27 08:50:44 +00:00
|
|
|
extern unsigned int reset_devices;
|
2006-03-25 11:07:39 +00:00
|
|
|
|
|
|
|
/* used by init/main.c */
|
2007-05-08 07:24:47 +00:00
|
|
|
void setup_arch(char **);
|
|
|
|
void prepare_namespace(void);
|
2019-06-01 22:09:44 +00:00
|
|
|
void __init init_rootfs(void);
|
2023-05-17 13:10:59 +00:00
|
|
|
|
|
|
|
void init_IRQ(void);
|
|
|
|
void time_init(void);
|
|
|
|
void poking_init(void);
|
|
|
|
void pgtable_cache_init(void);
|
|
|
|
|
|
|
|
extern initcall_entry_t __initcall_start[];
|
|
|
|
extern initcall_entry_t __initcall0_start[];
|
|
|
|
extern initcall_entry_t __initcall1_start[];
|
|
|
|
extern initcall_entry_t __initcall2_start[];
|
|
|
|
extern initcall_entry_t __initcall3_start[];
|
|
|
|
extern initcall_entry_t __initcall4_start[];
|
|
|
|
extern initcall_entry_t __initcall5_start[];
|
|
|
|
extern initcall_entry_t __initcall6_start[];
|
|
|
|
extern initcall_entry_t __initcall7_start[];
|
|
|
|
extern initcall_entry_t __initcall_end[];
|
|
|
|
|
2019-05-30 21:48:35 +00:00
|
|
|
extern struct file_system_type rootfs_fs_type;
|
2006-03-25 11:07:39 +00:00
|
|
|
|
2016-11-14 06:15:05 +00:00
|
|
|
extern bool rodata_enabled;
|
2016-02-17 22:41:12 +00:00
|
|
|
void mark_rodata_ro(void);
|
|
|
|
|
2008-04-29 07:59:18 +00:00
|
|
|
extern void (*late_time_init)(void);
|
|
|
|
|
2012-01-12 23:02:18 +00:00
|
|
|
extern bool initcall_debug;
|
2009-12-13 19:29:01 +00:00
|
|
|
|
2023-11-26 07:19:14 +00:00
|
|
|
#ifdef MODULE
|
|
|
|
extern struct module __this_module;
|
|
|
|
#define THIS_MODULE (&__this_module)
|
|
|
|
#else
|
|
|
|
#define THIS_MODULE ((struct module *)0)
|
|
|
|
#endif
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef MODULE
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
kbuild: allow archs to select link dead code/data elimination
Introduce LD_DEAD_CODE_DATA_ELIMINATION option for architectures to
select to build with -ffunction-sections, -fdata-sections, and link
with --gc-sections. It requires some work (documented) to ensure all
unreferenced entrypoints are live, and requires toolchain and build
verification, so it is made a per-arch option for now.
On a random powerpc64le build, this yelds a significant size saving,
it boots and runs fine, but there is a lot I haven't tested as yet, so
these savings may be reduced if there are bugs in the link.
text data bss dec filename
11169741 1180744 1923176 14273661 vmlinux
10445269 1004127 1919707 13369103 vmlinux.dce
~700K text, ~170K data, 6% removed from kernel image size.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michal Marek <mmarek@suse.com>
2016-08-24 12:29:20 +00:00
|
|
|
/*
|
|
|
|
* initcalls are now grouped by functionality into separate
|
2005-04-16 22:20:36 +00:00
|
|
|
* subsections. Ordering inside the subsections is determined
|
|
|
|
* by link order.
|
|
|
|
* For backwards compatibility, initcall() puts the call in
|
|
|
|
* the device init subsection.
|
2006-10-27 18:42:37 +00:00
|
|
|
*
|
|
|
|
* The `id' arg to __define_initcall() is needed so that multiple initcalls
|
|
|
|
* can point at the same handler without causing duplicate-symbol build errors.
|
kbuild: allow archs to select link dead code/data elimination
Introduce LD_DEAD_CODE_DATA_ELIMINATION option for architectures to
select to build with -ffunction-sections, -fdata-sections, and link
with --gc-sections. It requires some work (documented) to ensure all
unreferenced entrypoints are live, and requires toolchain and build
verification, so it is made a per-arch option for now.
On a random powerpc64le build, this yelds a significant size saving,
it boots and runs fine, but there is a lot I haven't tested as yet, so
these savings may be reduced if there are bugs in the link.
text data bss dec filename
11169741 1180744 1923176 14273661 vmlinux
10445269 1004127 1919707 13369103 vmlinux.dce
~700K text, ~170K data, 6% removed from kernel image size.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michal Marek <mmarek@suse.com>
2016-08-24 12:29:20 +00:00
|
|
|
*
|
|
|
|
* Initcalls are run by placing pointers in initcall sections that the
|
|
|
|
* kernel iterates at runtime. The linker can do dead code / data elimination
|
|
|
|
* and remove that completely, so the initcall sections have to be marked
|
|
|
|
* as KEEP() in the linker script.
|
2005-04-16 22:20:36 +00:00
|
|
|
*/
|
|
|
|
|
2020-12-11 18:46:24 +00:00
|
|
|
/* Format: <modname>__<counter>_<line>_<fn> */
|
|
|
|
#define __initcall_id(fn) \
|
|
|
|
__PASTE(__KBUILD_MODNAME, \
|
|
|
|
__PASTE(__, \
|
|
|
|
__PASTE(__COUNTER__, \
|
|
|
|
__PASTE(_, \
|
|
|
|
__PASTE(__LINE__, \
|
|
|
|
__PASTE(_, fn))))))
|
|
|
|
|
|
|
|
/* Format: __<prefix>__<iid><id> */
|
|
|
|
#define __initcall_name(prefix, __iid, id) \
|
|
|
|
__PASTE(__, \
|
|
|
|
__PASTE(prefix, \
|
|
|
|
__PASTE(__, \
|
|
|
|
__PASTE(__iid, id))))
|
|
|
|
|
|
|
|
#ifdef CONFIG_LTO_CLANG
|
|
|
|
/*
|
|
|
|
* With LTO, the compiler doesn't necessarily obey link order for
|
|
|
|
* initcalls. In order to preserve the correct order, we add each
|
|
|
|
* variable into its own section and generate a linker script (in
|
|
|
|
* scripts/link-vmlinux.sh) to specify the order of the sections.
|
|
|
|
*/
|
|
|
|
#define __initcall_section(__sec, __iid) \
|
|
|
|
#__sec ".init.." #__iid
|
2020-12-11 18:46:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* With LTO, the compiler can rename static functions to avoid
|
|
|
|
* global naming collisions. We use a global stub function for
|
|
|
|
* initcalls to create a stable symbol name whose address can be
|
|
|
|
* taken in inline assembly when PREL32 relocations are used.
|
|
|
|
*/
|
|
|
|
#define __initcall_stub(fn, __iid, id) \
|
|
|
|
__initcall_name(initstub, __iid, id)
|
|
|
|
|
|
|
|
#define __define_initcall_stub(__stub, fn) \
|
2022-09-08 21:54:57 +00:00
|
|
|
int __init __stub(void); \
|
|
|
|
int __init __stub(void) \
|
2020-12-11 18:46:25 +00:00
|
|
|
{ \
|
|
|
|
return fn(); \
|
|
|
|
} \
|
|
|
|
__ADDRESSABLE(__stub)
|
2020-12-11 18:46:24 +00:00
|
|
|
#else
|
|
|
|
#define __initcall_section(__sec, __iid) \
|
|
|
|
#__sec ".init"
|
2020-12-11 18:46:25 +00:00
|
|
|
|
|
|
|
#define __initcall_stub(fn, __iid, id) fn
|
|
|
|
|
|
|
|
#define __define_initcall_stub(__stub, fn) \
|
|
|
|
__ADDRESSABLE(fn)
|
2020-12-11 18:46:24 +00:00
|
|
|
#endif
|
|
|
|
|
2018-08-22 04:56:13 +00:00
|
|
|
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
2020-12-11 18:46:25 +00:00
|
|
|
#define ____define_initcall(fn, __stub, __name, __sec) \
|
|
|
|
__define_initcall_stub(__stub, fn) \
|
2020-12-11 18:46:24 +00:00
|
|
|
asm(".section \"" __sec "\", \"a\" \n" \
|
|
|
|
__stringify(__name) ": \n" \
|
2020-12-11 18:46:25 +00:00
|
|
|
".long " __stringify(__stub) " - . \n" \
|
2021-05-21 07:26:10 +00:00
|
|
|
".previous \n"); \
|
|
|
|
static_assert(__same_type(initcall_t, &fn));
|
2018-08-22 04:56:13 +00:00
|
|
|
#else
|
2020-12-11 18:46:25 +00:00
|
|
|
#define ____define_initcall(fn, __unused, __name, __sec) \
|
2020-12-11 18:46:24 +00:00
|
|
|
static initcall_t __name __used \
|
|
|
|
__attribute__((__section__(__sec))) = fn;
|
2018-08-22 04:56:13 +00:00
|
|
|
#endif
|
|
|
|
|
2020-12-11 18:46:24 +00:00
|
|
|
#define __unique_initcall(fn, id, __sec, __iid) \
|
|
|
|
____define_initcall(fn, \
|
2020-12-11 18:46:25 +00:00
|
|
|
__initcall_stub(fn, __iid, id), \
|
2020-12-11 18:46:24 +00:00
|
|
|
__initcall_name(initcall, __iid, id), \
|
|
|
|
__initcall_section(__sec, __iid))
|
|
|
|
|
|
|
|
#define ___define_initcall(fn, id, __sec) \
|
|
|
|
__unique_initcall(fn, id, __sec, __initcall_id(fn))
|
|
|
|
|
2018-08-22 04:56:13 +00:00
|
|
|
#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2008-07-26 02:45:11 +00:00
|
|
|
/*
|
|
|
|
* Early initcalls run before initializing SMP.
|
|
|
|
*
|
|
|
|
* Only for built-in code, not modules.
|
|
|
|
*/
|
2012-12-17 23:59:32 +00:00
|
|
|
#define early_initcall(fn) __define_initcall(fn, early)
|
2008-07-26 02:45:11 +00:00
|
|
|
|
2006-11-20 19:47:18 +00:00
|
|
|
/*
|
|
|
|
* A "pure" initcall has no dependencies on anything else, and purely
|
|
|
|
* initializes variables that couldn't be statically initialized.
|
|
|
|
*
|
|
|
|
* This only exists for built-in code, not for modules.
|
2012-06-14 22:00:59 +00:00
|
|
|
* Keep main.c:initcall_level_names[] in sync.
|
2006-11-20 19:47:18 +00:00
|
|
|
*/
|
2012-12-17 23:59:32 +00:00
|
|
|
#define pure_initcall(fn) __define_initcall(fn, 0)
|
|
|
|
|
|
|
|
#define core_initcall(fn) __define_initcall(fn, 1)
|
|
|
|
#define core_initcall_sync(fn) __define_initcall(fn, 1s)
|
|
|
|
#define postcore_initcall(fn) __define_initcall(fn, 2)
|
|
|
|
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
|
|
|
|
#define arch_initcall(fn) __define_initcall(fn, 3)
|
|
|
|
#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
|
|
|
|
#define subsys_initcall(fn) __define_initcall(fn, 4)
|
|
|
|
#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
|
|
|
|
#define fs_initcall(fn) __define_initcall(fn, 5)
|
|
|
|
#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
|
|
|
|
#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
|
|
|
|
#define device_initcall(fn) __define_initcall(fn, 6)
|
|
|
|
#define device_initcall_sync(fn) __define_initcall(fn, 6s)
|
|
|
|
#define late_initcall(fn) __define_initcall(fn, 7)
|
|
|
|
#define late_initcall_sync(fn) __define_initcall(fn, 7s)
|
2005-04-16 22:20:36 +00:00
|
|
|
|
|
|
|
#define __initcall(fn) device_initcall(fn)
|
|
|
|
|
kbuild: allow archs to select link dead code/data elimination
Introduce LD_DEAD_CODE_DATA_ELIMINATION option for architectures to
select to build with -ffunction-sections, -fdata-sections, and link
with --gc-sections. It requires some work (documented) to ensure all
unreferenced entrypoints are live, and requires toolchain and build
verification, so it is made a per-arch option for now.
On a random powerpc64le build, this yelds a significant size saving,
it boots and runs fine, but there is a lot I haven't tested as yet, so
these savings may be reduced if there are bugs in the link.
text data bss dec filename
11169741 1180744 1923176 14273661 vmlinux
10445269 1004127 1919707 13369103 vmlinux.dce
~700K text, ~170K data, 6% removed from kernel image size.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michal Marek <mmarek@suse.com>
2016-08-24 12:29:20 +00:00
|
|
|
#define __exitcall(fn) \
|
2005-04-16 22:20:36 +00:00
|
|
|
static exitcall_t __exitcall_##fn __exit_call = fn
|
|
|
|
|
2020-12-11 18:46:24 +00:00
|
|
|
#define console_initcall(fn) ___define_initcall(fn, con, .con_initcall)
|
2005-04-16 22:20:36 +00:00
|
|
|
|
|
|
|
struct obs_kernel_param {
|
|
|
|
const char *str;
|
|
|
|
int (*setup_func)(char *);
|
|
|
|
int early;
|
|
|
|
};
|
|
|
|
|
2023-05-17 13:10:59 +00:00
|
|
|
extern const struct obs_kernel_param __setup_start[], __setup_end[];
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/*
|
|
|
|
* Only for really core code. See moduleparam.h for the normal way.
|
|
|
|
*
|
|
|
|
* Force the alignment so the compiler doesn't space elements of the
|
|
|
|
* obs_kernel_param "array" too far apart in .init.setup.
|
|
|
|
*/
|
|
|
|
#define __setup_param(str, unique_id, fn, early) \
|
2015-03-05 07:28:48 +00:00
|
|
|
static const char __setup_str_##unique_id[] __initconst \
|
|
|
|
__aligned(1) = str; \
|
|
|
|
static struct obs_kernel_param __setup_##unique_id \
|
2020-10-22 02:36:07 +00:00
|
|
|
__used __section(".init.setup") \
|
2020-11-23 10:23:16 +00:00
|
|
|
__aligned(__alignof__(struct obs_kernel_param)) \
|
2005-04-16 22:20:36 +00:00
|
|
|
= { __setup_str_##unique_id, fn, early }
|
|
|
|
|
2022-03-23 23:06:11 +00:00
|
|
|
/*
|
|
|
|
* NOTE: __setup functions return values:
|
|
|
|
* @fn returns 1 (or non-zero) if the option argument is "handled"
|
|
|
|
* and returns 0 if the option argument is "not handled".
|
|
|
|
*/
|
2015-03-05 07:28:48 +00:00
|
|
|
#define __setup(str, fn) \
|
2005-04-16 22:20:36 +00:00
|
|
|
__setup_param(str, fn, fn, 0)
|
|
|
|
|
2015-03-05 07:28:48 +00:00
|
|
|
/*
|
2022-03-23 23:06:11 +00:00
|
|
|
* NOTE: @fn is as per module_param, not __setup!
|
|
|
|
* I.e., @fn returns 0 for no error or non-zero for error
|
|
|
|
* (possibly @fn returns a -errno value, but it does not matter).
|
|
|
|
* Emits warning if @fn returns non-zero.
|
2015-03-05 07:28:48 +00:00
|
|
|
*/
|
|
|
|
#define early_param(str, fn) \
|
2005-04-16 22:20:36 +00:00
|
|
|
__setup_param(str, fn, fn, 1)
|
|
|
|
|
2015-03-05 07:28:48 +00:00
|
|
|
#define early_param_on_off(str_on, str_off, var, config) \
|
|
|
|
\
|
|
|
|
int var = IS_ENABLED(config); \
|
|
|
|
\
|
|
|
|
static int __init parse_##var##_on(char *arg) \
|
|
|
|
{ \
|
|
|
|
var = 1; \
|
|
|
|
return 0; \
|
|
|
|
} \
|
2021-02-26 01:22:15 +00:00
|
|
|
early_param(str_on, parse_##var##_on); \
|
2015-03-05 07:28:48 +00:00
|
|
|
\
|
|
|
|
static int __init parse_##var##_off(char *arg) \
|
|
|
|
{ \
|
|
|
|
var = 0; \
|
|
|
|
return 0; \
|
|
|
|
} \
|
2021-02-26 01:22:15 +00:00
|
|
|
early_param(str_off, parse_##var##_off)
|
2015-03-05 01:24:13 +00:00
|
|
|
|
[PATCH] Dynamic kernel command-line: common
Current implementation stores a static command-line buffer allocated to
COMMAND_LINE_SIZE size. Most architectures stores two copies of this buffer,
one for future reference and one for parameter parsing.
Current kernel command-line size for most architecture is much too small for
module parameters, video settings, initramfs paramters and much more. The
problem is that setting COMMAND_LINE_SIZE to a grater value, allocates static
buffers.
In order to allow a greater command-line size, these buffers should be
dynamically allocated or marked as init disposable buffers, so unused memory
can be released.
This patch renames the static saved_command_line variable into
boot_command_line adding __initdata attribute, so that it can be disposed
after initialization. This rename is required so applications that use
saved_command_line will not be affected by this change.
It reintroduces saved_command_line as dynamically allocated buffer to match
the data in boot_command_line.
It also mark secondary command-line buffer as __initdata, and copies it to
dynamically allocated static_command_line buffer components may hold reference
to it after initialization.
This patch is for linux-2.6.20-rc4-mm1 and is divided to target each
architecture. I could not check this in any architecture so please forgive me
if I got it wrong.
The per-architecture modification is very simple, use boot_command_line in
place of saved_command_line. The common code is the change into dynamic
command-line.
This patch:
1. Rename saved_command_line into boot_command_line, mark as init
disposable.
2. Add dynamic allocated saved_command_line.
3. Add dynamic allocated static_command_line.
4. During startup copy: boot_command_line into saved_command_line. arch
command_line into static_command_line.
5. Parse static_command_line and not arch command_line, so arch
command_line may be freed.
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Ian Molton <spyro@f2s.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Cc: Richard Curnow <rc@rc0.org.uk>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
Cc: Chris Zankel <chris@zankel.net>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Greg Ungerer <gerg@uclinux.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-12 08:53:52 +00:00
|
|
|
/* Relies on boot_command_line being set */
|
2005-04-16 22:20:36 +00:00
|
|
|
void __init parse_early_param(void);
|
2009-03-30 21:37:25 +00:00
|
|
|
void __init parse_early_options(char *cmdline);
|
2005-04-16 22:20:36 +00:00
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
|
|
|
|
#else /* MODULE */
|
|
|
|
|
|
|
|
#define __setup_param(str, unique_id, fn) /* nothing */
|
|
|
|
#define __setup(str, func) /* nothing */
|
|
|
|
#endif
|
|
|
|
|
2007-05-06 21:50:49 +00:00
|
|
|
/* Data marked not to be saved by software suspend */
|
2020-10-22 02:36:07 +00:00
|
|
|
#define __nosavedata __section(".data..nosave")
|
2005-04-16 22:20:36 +00:00
|
|
|
|
|
|
|
#ifdef MODULE
|
|
|
|
#define __exit_p(x) x
|
|
|
|
#else
|
|
|
|
#define __exit_p(x) NULL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* _LINUX_INIT_H */
|