Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: - some of the rest of MM - various misc things - dynamic-debug updates - checkpatch - some epoll speedups - autofs - rapidio - lib/, lib/lzo/ updates * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (83 commits) samples/mic/mpssd/mpssd.h: remove duplicate header kernel/fork.c: remove duplicated include include/linux/relay.h: fix percpu annotation in struct rchan arch/nios2/mm/fault.c: remove duplicate include unicore32: stop printing the virtual memory layout MAINTAINERS: fix GTA02 entry and mark as orphan mm: create the new vm_fault_t type arm, s390, unicore32: remove oneliner wrappers for memblock_alloc() arch: simplify several early memory allocations openrisc: simplify pte_alloc_one_kernel() sh: prefer memblock APIs returning virtual address microblaze: prefer memblock API returning virtual address powerpc: prefer memblock APIs returning virtual address lib/lzo: separate lzo-rle from lzo lib/lzo: implement run-length encoding lib/lzo: fast 8-byte copy on arm64 lib/lzo: 64-bit CTZ on arm64 lib/lzo: tidy-up ifdefs ipc/sem.c: replace kvmalloc/memset with kvzalloc and use struct_size ipc: annotate implicit fall through ...
This commit is contained in:
2
kernel/.gitignore
vendored
2
kernel/.gitignore
vendored
@@ -1,7 +1,5 @@
|
||||
#
|
||||
# Generated files
|
||||
#
|
||||
config_data.h
|
||||
config_data.gz
|
||||
timeconst.h
|
||||
hz.bc
|
||||
|
@@ -116,17 +116,8 @@ obj-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak.o
|
||||
KASAN_SANITIZE_stackleak.o := n
|
||||
KCOV_INSTRUMENT_stackleak.o := n
|
||||
|
||||
$(obj)/configs.o: $(obj)/config_data.h
|
||||
$(obj)/configs.o: $(obj)/config_data.gz
|
||||
|
||||
targets += config_data.gz
|
||||
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
filechk_ikconfiggz = \
|
||||
echo "static const char kernel_config_data[] __used = MAGIC_START"; \
|
||||
cat $< | scripts/bin2c; \
|
||||
echo "MAGIC_END;"
|
||||
|
||||
targets += config_data.h
|
||||
$(obj)/config_data.h: $(obj)/config_data.gz FORCE
|
||||
$(call filechk,ikconfiggz)
|
||||
|
@@ -30,37 +30,35 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
/**************************************************/
|
||||
/* the actual current config file */
|
||||
|
||||
/*
|
||||
* Define kernel_config_data and kernel_config_data_size, which contains the
|
||||
* wrapped and compressed configuration file. The file is first compressed
|
||||
* with gzip and then bounded by two eight byte magic numbers to allow
|
||||
* extraction from a binary kernel image:
|
||||
*
|
||||
* IKCFG_ST
|
||||
* <image>
|
||||
* IKCFG_ED
|
||||
* "IKCFG_ST" and "IKCFG_ED" are used to extract the config data from
|
||||
* a binary kernel image or a module. See scripts/extract-ikconfig.
|
||||
*/
|
||||
#define MAGIC_START "IKCFG_ST"
|
||||
#define MAGIC_END "IKCFG_ED"
|
||||
#include "config_data.h"
|
||||
|
||||
|
||||
#define MAGIC_SIZE (sizeof(MAGIC_START) - 1)
|
||||
#define kernel_config_data_size \
|
||||
(sizeof(kernel_config_data) - 1 - MAGIC_SIZE * 2)
|
||||
asm (
|
||||
" .pushsection .rodata, \"a\" \n"
|
||||
" .ascii \"IKCFG_ST\" \n"
|
||||
" .global kernel_config_data \n"
|
||||
"kernel_config_data: \n"
|
||||
" .incbin \"kernel/config_data.gz\" \n"
|
||||
" .global kernel_config_data_end \n"
|
||||
"kernel_config_data_end: \n"
|
||||
" .ascii \"IKCFG_ED\" \n"
|
||||
" .popsection \n"
|
||||
);
|
||||
|
||||
#ifdef CONFIG_IKCONFIG_PROC
|
||||
|
||||
extern char kernel_config_data;
|
||||
extern char kernel_config_data_end;
|
||||
|
||||
static ssize_t
|
||||
ikconfig_read_current(struct file *file, char __user *buf,
|
||||
size_t len, loff_t * offset)
|
||||
{
|
||||
return simple_read_from_buffer(buf, len, offset,
|
||||
kernel_config_data + MAGIC_SIZE,
|
||||
kernel_config_data_size);
|
||||
&kernel_config_data,
|
||||
&kernel_config_data_end -
|
||||
&kernel_config_data);
|
||||
}
|
||||
|
||||
static const struct file_operations ikconfig_file_ops = {
|
||||
@@ -79,7 +77,7 @@ static int __init ikconfig_init(void)
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
|
||||
proc_set_size(entry, kernel_config_data_size);
|
||||
proc_set_size(entry, &kernel_config_data_end - &kernel_config_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -77,7 +77,6 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/posix-timers.h>
|
||||
#include <linux/user-return-notifier.h>
|
||||
|
@@ -245,8 +245,7 @@ struct gcov_info *gcov_info_dup(struct gcov_info *info)
|
||||
|
||||
/* Duplicate gcov_info. */
|
||||
active = num_counter_active(info);
|
||||
dup = kzalloc(sizeof(struct gcov_info) +
|
||||
sizeof(struct gcov_ctr_info) * active, GFP_KERNEL);
|
||||
dup = kzalloc(struct_size(dup, counts, active), GFP_KERNEL);
|
||||
if (!dup)
|
||||
return NULL;
|
||||
dup->version = info->version;
|
||||
@@ -364,8 +363,7 @@ struct gcov_iterator *gcov_iter_new(struct gcov_info *info)
|
||||
{
|
||||
struct gcov_iterator *iter;
|
||||
|
||||
iter = kzalloc(sizeof(struct gcov_iterator) +
|
||||
num_counter_active(info) * sizeof(struct type_info),
|
||||
iter = kzalloc(struct_size(iter, type_info, num_counter_active(info)),
|
||||
GFP_KERNEL);
|
||||
if (iter)
|
||||
iter->info = info;
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/sched/debug.h>
|
||||
#include <linux/sched/sysctl.h>
|
||||
|
||||
#include <trace/events/sched.h>
|
||||
|
||||
@@ -126,7 +127,7 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
|
||||
if (sysctl_hung_task_warnings > 0)
|
||||
sysctl_hung_task_warnings--;
|
||||
pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
|
||||
t->comm, t->pid, timeout);
|
||||
t->comm, t->pid, (jiffies - t->last_switch_time) / HZ);
|
||||
pr_err(" %s %s %.*s\n",
|
||||
print_tainted(), init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/kcov.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
/* Number of 64-bit words written per one comparison: */
|
||||
@@ -44,7 +45,7 @@ struct kcov {
|
||||
* - opened file descriptor
|
||||
* - task with enabled coverage (we can't unwire it from another task)
|
||||
*/
|
||||
atomic_t refcount;
|
||||
refcount_t refcount;
|
||||
/* The lock protects mode, size, area and t. */
|
||||
spinlock_t lock;
|
||||
enum kcov_mode mode;
|
||||
@@ -228,12 +229,12 @@ EXPORT_SYMBOL(__sanitizer_cov_trace_switch);
|
||||
|
||||
static void kcov_get(struct kcov *kcov)
|
||||
{
|
||||
atomic_inc(&kcov->refcount);
|
||||
refcount_inc(&kcov->refcount);
|
||||
}
|
||||
|
||||
static void kcov_put(struct kcov *kcov)
|
||||
{
|
||||
if (atomic_dec_and_test(&kcov->refcount)) {
|
||||
if (refcount_dec_and_test(&kcov->refcount)) {
|
||||
vfree(kcov->area);
|
||||
kfree(kcov);
|
||||
}
|
||||
@@ -312,7 +313,7 @@ static int kcov_open(struct inode *inode, struct file *filep)
|
||||
if (!kcov)
|
||||
return -ENOMEM;
|
||||
kcov->mode = KCOV_MODE_DISABLED;
|
||||
atomic_set(&kcov->refcount, 1);
|
||||
refcount_set(&kcov->refcount, 1);
|
||||
spin_lock_init(&kcov->lock);
|
||||
filep->private_data = kcov;
|
||||
return nonseekable_open(inode, filep);
|
||||
@@ -444,10 +445,8 @@ static int __init kcov_init(void)
|
||||
* there is no need to protect it against removal races. The
|
||||
* use of debugfs_create_file_unsafe() is actually safe here.
|
||||
*/
|
||||
if (!debugfs_create_file_unsafe("kcov", 0600, NULL, NULL, &kcov_fops)) {
|
||||
pr_err("failed to create kcov in debugfs\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
debugfs_create_file_unsafe("kcov", 0600, NULL, NULL, &kcov_fops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -2719,11 +2719,7 @@ static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsig
|
||||
{
|
||||
if (!debug)
|
||||
return;
|
||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||
if (ddebug_add_module(debug, num, mod->name))
|
||||
pr_err("dynamic debug error adding module: %s\n",
|
||||
debug->modname);
|
||||
#endif
|
||||
ddebug_add_module(debug, num, mod->name);
|
||||
}
|
||||
|
||||
static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug)
|
||||
|
@@ -642,16 +642,14 @@ static int clear_warn_once_set(void *data, u64 val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(clear_warn_once_fops,
|
||||
NULL,
|
||||
clear_warn_once_set,
|
||||
"%lld\n");
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(clear_warn_once_fops, NULL, clear_warn_once_set,
|
||||
"%lld\n");
|
||||
|
||||
static __init int register_warn_debugfs(void)
|
||||
{
|
||||
/* Don't care about failure */
|
||||
debugfs_create_file("clear_warn_once", 0200, NULL,
|
||||
NULL, &clear_warn_once_fops);
|
||||
debugfs_create_file_unsafe("clear_warn_once", 0200, NULL, NULL,
|
||||
&clear_warn_once_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -1747,6 +1747,7 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
|
||||
|
||||
if (who == RUSAGE_CHILDREN)
|
||||
break;
|
||||
/* fall through */
|
||||
|
||||
case RUSAGE_SELF:
|
||||
thread_group_cputime_adjusted(p, &tgutime, &tgstime);
|
||||
|
@@ -67,6 +67,8 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/mount.h>
|
||||
|
||||
#include "../lib/kstrtox.h"
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
@@ -127,6 +129,7 @@ static int __maybe_unused one = 1;
|
||||
static int __maybe_unused two = 2;
|
||||
static int __maybe_unused four = 4;
|
||||
static unsigned long one_ul = 1;
|
||||
static unsigned long long_max = LONG_MAX;
|
||||
static int one_hundred = 100;
|
||||
static int one_thousand = 1000;
|
||||
#ifdef CONFIG_PRINTK
|
||||
@@ -1747,6 +1750,8 @@ static struct ctl_table fs_table[] = {
|
||||
.maxlen = sizeof(files_stat.max_files),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_doulongvec_minmax,
|
||||
.extra1 = &zero,
|
||||
.extra2 = &long_max,
|
||||
},
|
||||
{
|
||||
.procname = "nr_open",
|
||||
@@ -2117,6 +2122,41 @@ static void proc_skip_char(char **buf, size_t *size, const char v)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* strtoul_lenient - parse an ASCII formatted integer from a buffer and only
|
||||
* fail on overflow
|
||||
*
|
||||
* @cp: kernel buffer containing the string to parse
|
||||
* @endp: pointer to store the trailing characters
|
||||
* @base: the base to use
|
||||
* @res: where the parsed integer will be stored
|
||||
*
|
||||
* In case of success 0 is returned and @res will contain the parsed integer,
|
||||
* @endp will hold any trailing characters.
|
||||
* This function will fail the parse on overflow. If there wasn't an overflow
|
||||
* the function will defer the decision what characters count as invalid to the
|
||||
* caller.
|
||||
*/
|
||||
static int strtoul_lenient(const char *cp, char **endp, unsigned int base,
|
||||
unsigned long *res)
|
||||
{
|
||||
unsigned long long result;
|
||||
unsigned int rv;
|
||||
|
||||
cp = _parse_integer_fixup_radix(cp, &base);
|
||||
rv = _parse_integer(cp, base, &result);
|
||||
if ((rv & KSTRTOX_OVERFLOW) || (result != (unsigned long)result))
|
||||
return -ERANGE;
|
||||
|
||||
cp += rv;
|
||||
|
||||
if (endp)
|
||||
*endp = (char *)cp;
|
||||
|
||||
*res = (unsigned long)result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define TMPBUFLEN 22
|
||||
/**
|
||||
* proc_get_long - reads an ASCII formatted integer from a user buffer
|
||||
@@ -2160,7 +2200,8 @@ static int proc_get_long(char **buf, size_t *size,
|
||||
if (!isdigit(*p))
|
||||
return -EINVAL;
|
||||
|
||||
*val = simple_strtoul(p, &p, 0);
|
||||
if (strtoul_lenient(p, &p, 0, val))
|
||||
return -EINVAL;
|
||||
|
||||
len = p - tmp;
|
||||
|
||||
|
@@ -920,6 +920,16 @@ struct task_struct *wq_worker_sleeping(struct task_struct *task)
|
||||
* CONTEXT:
|
||||
* spin_lock_irq(rq->lock)
|
||||
*
|
||||
* This function is called during schedule() when a kworker is going
|
||||
* to sleep. It's used by psi to identify aggregation workers during
|
||||
* dequeuing, to allow periodic aggregation to shut-off when that
|
||||
* worker is the last task in the system or cgroup to go to sleep.
|
||||
*
|
||||
* As this function doesn't involve any workqueue-related locking, it
|
||||
* only returns stable values when called from inside the scheduler's
|
||||
* queuing and dequeuing paths, when @task, which must be a kworker,
|
||||
* is guaranteed to not be processing any works.
|
||||
*
|
||||
* Return:
|
||||
* The last work function %current executed as a worker, NULL if it
|
||||
* hasn't executed any work yet.
|
||||
|
Reference in New Issue
Block a user