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 22:07:57 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2009-11-06 06:06:50 +08:00
|
|
|
#ifndef _LINUX_HW_BREAKPOINT_H
|
|
|
|
#define _LINUX_HW_BREAKPOINT_H
|
2009-06-02 02:13:10 +08:00
|
|
|
|
2009-11-23 22:42:32 +08:00
|
|
|
#include <linux/perf_event.h>
|
2012-11-20 06:21:03 +08:00
|
|
|
#include <uapi/linux/hw_breakpoint.h>
|
2009-11-23 22:42:32 +08:00
|
|
|
|
2009-11-24 05:30:12 +08:00
|
|
|
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
|
|
|
|
2010-11-05 06:33:01 +08:00
|
|
|
extern int __init init_hw_breakpoint(void);
|
|
|
|
|
2009-11-27 11:55:54 +08:00
|
|
|
static inline void hw_breakpoint_init(struct perf_event_attr *attr)
|
|
|
|
{
|
2009-12-07 10:14:17 +08:00
|
|
|
memset(attr, 0, sizeof(*attr));
|
|
|
|
|
2009-11-27 11:55:54 +08:00
|
|
|
attr->type = PERF_TYPE_BREAKPOINT;
|
|
|
|
attr->size = sizeof(*attr);
|
2009-12-05 16:44:31 +08:00
|
|
|
/*
|
|
|
|
* As it's for in-kernel or ptrace use, we want it to be pinned
|
|
|
|
* and to call its callback every hits.
|
|
|
|
*/
|
2009-11-27 11:55:54 +08:00
|
|
|
attr->pinned = 1;
|
2009-12-05 16:44:31 +08:00
|
|
|
attr->sample_period = 1;
|
2010-04-22 11:05:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void ptrace_breakpoint_init(struct perf_event_attr *attr)
|
|
|
|
{
|
|
|
|
hw_breakpoint_init(attr);
|
|
|
|
attr->exclude_kernel = 1;
|
2009-11-27 11:55:54 +08:00
|
|
|
}
|
|
|
|
|
2009-09-10 01:22:48 +08:00
|
|
|
static inline unsigned long hw_breakpoint_addr(struct perf_event *bp)
|
|
|
|
{
|
|
|
|
return bp->attr.bp_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int hw_breakpoint_type(struct perf_event *bp)
|
|
|
|
{
|
|
|
|
return bp->attr.bp_type;
|
|
|
|
}
|
|
|
|
|
2010-01-30 12:55:18 +08:00
|
|
|
static inline unsigned long hw_breakpoint_len(struct perf_event *bp)
|
2009-09-10 01:22:48 +08:00
|
|
|
{
|
|
|
|
return bp->attr.bp_len;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern struct perf_event *
|
2009-11-27 11:55:53 +08:00
|
|
|
register_user_hw_breakpoint(struct perf_event_attr *attr,
|
2009-12-05 16:44:31 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
2011-06-29 23:42:35 +08:00
|
|
|
void *context,
|
2009-11-27 11:55:53 +08:00
|
|
|
struct task_struct *tsk);
|
2009-09-10 01:22:48 +08:00
|
|
|
|
|
|
|
/* FIXME: only change from the attr, and don't unregister */
|
2009-12-09 16:25:48 +08:00
|
|
|
extern int
|
2009-12-05 14:06:10 +08:00
|
|
|
modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr);
|
perf/core: Implement fast breakpoint modification via _IOC_MODIFY_ATTRIBUTES
Problem and motivation: Once a breakpoint perf event (PERF_TYPE_BREAKPOINT)
is created, there is no flexibility to change the breakpoint type
(bp_type), breakpoint address (bp_addr), or breakpoint length (bp_len). The
only option is to close the perf event and configure a new breakpoint
event. This inflexibility has a significant performance overhead. For
example, sampling-based, lightweight performance profilers (and also
concurrency bug detection tools), monitor different addresses for a short
duration using PERF_TYPE_BREAKPOINT and change the address (bp_addr) to
another address or change the kind of breakpoint (bp_type) from "write" to
a "read" or vice-versa or change the length (bp_len) of the address being
monitored. The cost of these modifications is prohibitive since it involves
unmapping the circular buffer associated with the perf event, closing the
perf event, opening another perf event and mmaping another circular buffer.
Solution: The new ioctl flag for perf events,
PERF_EVENT_IOC_MODIFY_ATTRIBUTES, introduced in this patch takes a pointer
to a struct perf_event_attr as an argument to update an old breakpoint
event with new address, type, and size. This facility allows retaining a
previous mmaped perf events ring buffer and avoids having to close and
reopen another perf event.
This patch supports only changing PERF_TYPE_BREAKPOINT event type; future
implementations can extend this feature. The patch replicates some of its
functionality of modify_user_hw_breakpoint() in
kernel/events/hw_breakpoint.c. modify_user_hw_breakpoint cannot be called
directly since perf_event_ctx_lock() is already held in _perf_ioctl().
Evidence: Experiments show that the baseline (not able to modify an already
created breakpoint) costs an order of magnitude (~10x) more than the
suggested optimization (having the ability to dynamically modifying a
configured breakpoint via ioctl). When the breakpoints typically do not
trap, the speedup due to the suggested optimization is ~10x; even when the
breakpoints always trap, the speedup is ~4x due to the suggested
optimization.
Testing: tests posted at
https://github.com/linux-contrib/perf_event_modify_bp demonstrate the
performance significance of this patch. Tests also check the functional
correctness of the patch.
Signed-off-by: Milind Chabbi <chabbi.milind@gmail.com>
[ Using modify_user_hw_breakpoint_check function. ]
[ Reformated PERF_EVENT_IOC_*, so the values are all in one column. ]
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Hari Bathini <hbathini@linux.vnet.ibm.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Oleg Nesterov <onestero@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/20180312134548.31532-8-jolsa@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2018-03-12 21:45:47 +08:00
|
|
|
extern int
|
|
|
|
modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *attr,
|
|
|
|
bool check);
|
2009-06-02 02:13:10 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Kernel breakpoints are not associated with any particular thread.
|
|
|
|
*/
|
2009-09-10 01:22:48 +08:00
|
|
|
extern struct perf_event *
|
2009-11-27 11:55:54 +08:00
|
|
|
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,
|
2009-12-05 16:44:31 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
2011-06-29 23:42:35 +08:00
|
|
|
void *context,
|
2009-11-27 11:55:54 +08:00
|
|
|
int cpu);
|
2009-09-10 01:22:48 +08:00
|
|
|
|
2010-02-17 09:50:50 +08:00
|
|
|
extern struct perf_event * __percpu *
|
2009-11-27 11:55:54 +08:00
|
|
|
register_wide_hw_breakpoint(struct perf_event_attr *attr,
|
2011-06-29 23:42:35 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
|
|
|
void *context);
|
2009-09-10 01:22:48 +08:00
|
|
|
|
|
|
|
extern int register_perf_hw_breakpoint(struct perf_event *bp);
|
|
|
|
extern void unregister_hw_breakpoint(struct perf_event *bp);
|
2010-02-17 09:50:50 +08:00
|
|
|
extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events);
|
2009-09-10 01:22:48 +08:00
|
|
|
|
2010-01-29 07:04:43 +08:00
|
|
|
extern int dbg_reserve_bp_slot(struct perf_event *bp);
|
|
|
|
extern int dbg_release_bp_slot(struct perf_event *bp);
|
2009-09-10 01:22:48 +08:00
|
|
|
extern int reserve_bp_slot(struct perf_event *bp);
|
|
|
|
extern void release_bp_slot(struct perf_event *bp);
|
2020-06-02 12:12:08 +08:00
|
|
|
int hw_breakpoint_weight(struct perf_event *bp);
|
|
|
|
int arch_reserve_bp_slot(struct perf_event *bp);
|
|
|
|
void arch_release_bp_slot(struct perf_event *bp);
|
|
|
|
void arch_unregister_hw_breakpoint(struct perf_event *bp);
|
2009-09-10 01:22:48 +08:00
|
|
|
|
|
|
|
extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
|
|
|
|
|
2009-11-13 20:16:15 +08:00
|
|
|
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
|
|
|
|
{
|
|
|
|
return &bp->hw.info;
|
|
|
|
}
|
|
|
|
|
2009-09-10 01:22:48 +08:00
|
|
|
#else /* !CONFIG_HAVE_HW_BREAKPOINT */
|
|
|
|
|
2010-11-05 06:33:01 +08:00
|
|
|
static inline int __init init_hw_breakpoint(void) { return 0; }
|
|
|
|
|
2009-09-10 01:22:48 +08:00
|
|
|
static inline struct perf_event *
|
2009-11-27 11:55:53 +08:00
|
|
|
register_user_hw_breakpoint(struct perf_event_attr *attr,
|
2009-12-05 16:44:31 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
2011-06-29 23:42:35 +08:00
|
|
|
void *context,
|
2009-11-27 11:55:53 +08:00
|
|
|
struct task_struct *tsk) { return NULL; }
|
2009-12-09 16:25:48 +08:00
|
|
|
static inline int
|
2009-09-10 01:22:48 +08:00
|
|
|
modify_user_hw_breakpoint(struct perf_event *bp,
|
2009-12-11 18:58:42 +08:00
|
|
|
struct perf_event_attr *attr) { return -ENOSYS; }
|
perf/core: Implement fast breakpoint modification via _IOC_MODIFY_ATTRIBUTES
Problem and motivation: Once a breakpoint perf event (PERF_TYPE_BREAKPOINT)
is created, there is no flexibility to change the breakpoint type
(bp_type), breakpoint address (bp_addr), or breakpoint length (bp_len). The
only option is to close the perf event and configure a new breakpoint
event. This inflexibility has a significant performance overhead. For
example, sampling-based, lightweight performance profilers (and also
concurrency bug detection tools), monitor different addresses for a short
duration using PERF_TYPE_BREAKPOINT and change the address (bp_addr) to
another address or change the kind of breakpoint (bp_type) from "write" to
a "read" or vice-versa or change the length (bp_len) of the address being
monitored. The cost of these modifications is prohibitive since it involves
unmapping the circular buffer associated with the perf event, closing the
perf event, opening another perf event and mmaping another circular buffer.
Solution: The new ioctl flag for perf events,
PERF_EVENT_IOC_MODIFY_ATTRIBUTES, introduced in this patch takes a pointer
to a struct perf_event_attr as an argument to update an old breakpoint
event with new address, type, and size. This facility allows retaining a
previous mmaped perf events ring buffer and avoids having to close and
reopen another perf event.
This patch supports only changing PERF_TYPE_BREAKPOINT event type; future
implementations can extend this feature. The patch replicates some of its
functionality of modify_user_hw_breakpoint() in
kernel/events/hw_breakpoint.c. modify_user_hw_breakpoint cannot be called
directly since perf_event_ctx_lock() is already held in _perf_ioctl().
Evidence: Experiments show that the baseline (not able to modify an already
created breakpoint) costs an order of magnitude (~10x) more than the
suggested optimization (having the ability to dynamically modifying a
configured breakpoint via ioctl). When the breakpoints typically do not
trap, the speedup due to the suggested optimization is ~10x; even when the
breakpoints always trap, the speedup is ~4x due to the suggested
optimization.
Testing: tests posted at
https://github.com/linux-contrib/perf_event_modify_bp demonstrate the
performance significance of this patch. Tests also check the functional
correctness of the patch.
Signed-off-by: Milind Chabbi <chabbi.milind@gmail.com>
[ Using modify_user_hw_breakpoint_check function. ]
[ Reformated PERF_EVENT_IOC_*, so the values are all in one column. ]
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Hari Bathini <hbathini@linux.vnet.ibm.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Oleg Nesterov <onestero@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Link: http://lkml.kernel.org/r/20180312134548.31532-8-jolsa@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2018-03-12 21:45:47 +08:00
|
|
|
static inline int
|
|
|
|
modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *attr,
|
|
|
|
bool check) { return -ENOSYS; }
|
|
|
|
|
2009-09-10 01:22:48 +08:00
|
|
|
static inline struct perf_event *
|
2009-11-27 11:55:54 +08:00
|
|
|
register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr,
|
2009-12-05 16:44:31 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
2011-06-29 23:42:35 +08:00
|
|
|
void *context,
|
2009-11-27 11:55:54 +08:00
|
|
|
int cpu) { return NULL; }
|
2010-02-17 09:50:50 +08:00
|
|
|
static inline struct perf_event * __percpu *
|
2009-11-27 11:55:54 +08:00
|
|
|
register_wide_hw_breakpoint(struct perf_event_attr *attr,
|
2011-06-29 23:42:35 +08:00
|
|
|
perf_overflow_handler_t triggered,
|
|
|
|
void *context) { return NULL; }
|
2009-09-10 01:22:48 +08:00
|
|
|
static inline int
|
|
|
|
register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; }
|
|
|
|
static inline void unregister_hw_breakpoint(struct perf_event *bp) { }
|
|
|
|
static inline void
|
2010-02-17 09:50:50 +08:00
|
|
|
unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events) { }
|
2009-09-10 01:22:48 +08:00
|
|
|
static inline int
|
|
|
|
reserve_bp_slot(struct perf_event *bp) {return -ENOSYS; }
|
|
|
|
static inline void release_bp_slot(struct perf_event *bp) { }
|
|
|
|
|
|
|
|
static inline void flush_ptrace_hw_breakpoint(struct task_struct *tsk) { }
|
2009-06-02 02:13:10 +08:00
|
|
|
|
2009-11-13 20:16:15 +08:00
|
|
|
static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2009-09-10 01:22:48 +08:00
|
|
|
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
|
|
|
#endif /* _LINUX_HW_BREAKPOINT_H */
|