mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 15:49:17 -04:00
Merge branch 'akpm' (patches from Andrew)
Merge third patch-bomb from Andrew Morton:
- even more of the rest of MM
- lib/ updates
- checkpatch updates
- small changes to a few scruffy filesystems
- kmod fixes/cleanups
- kexec updates
- a dma-mapping cleanup series from hch
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (81 commits)
dma-mapping: consolidate dma_set_mask
dma-mapping: consolidate dma_supported
dma-mapping: cosolidate dma_mapping_error
dma-mapping: consolidate dma_{alloc,free}_noncoherent
dma-mapping: consolidate dma_{alloc,free}_{attrs,coherent}
mm: use vma_is_anonymous() in create_huge_pmd() and wp_huge_pmd()
mm: make sure all file VMAs have ->vm_ops set
mm, mpx: add "vm_flags_t vm_flags" arg to do_mmap_pgoff()
mm: mark most vm_operations_struct const
namei: fix warning while make xmldocs caused by namei.c
ipc: convert invalid scenarios to use WARN_ON
zlib_deflate/deftree: remove bi_reverse()
lib/decompress_unlzma: Do a NULL check for pointer
lib/decompressors: use real out buf size for gunzip with kernel
fs/affs: make root lookup from blkdev logical size
sysctl: fix int -> unsigned long assignments in INT_MIN case
kexec: export KERNEL_IMAGE_SIZE to vmcoreinfo
kexec: align crash_notes allocation to make it be inside one physical page
kexec: remove unnecessary test in kimage_alloc_crash_control_pages()
kexec: split kexec_load syscall from kexec core code
...
This commit is contained in:
commit
33e247c7e5
165 changed files with 4886 additions and 4471 deletions
|
|
@ -49,7 +49,9 @@ obj-$(CONFIG_MODULES) += module.o
|
|||
obj-$(CONFIG_MODULE_SIG) += module_signing.o
|
||||
obj-$(CONFIG_KALLSYMS) += kallsyms.o
|
||||
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
|
||||
obj-$(CONFIG_KEXEC_CORE) += kexec_core.o
|
||||
obj-$(CONFIG_KEXEC) += kexec.o
|
||||
obj-$(CONFIG_KEXEC_FILE) += kexec_file.o
|
||||
obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o
|
||||
obj-$(CONFIG_COMPAT) += compat.o
|
||||
obj-$(CONFIG_CGROUPS) += cgroup.o
|
||||
|
|
|
|||
|
|
@ -20,11 +20,16 @@
|
|||
#include <linux/cn_proc.h>
|
||||
|
||||
#if 0
|
||||
#define kdebug(FMT, ...) \
|
||||
printk("[%-5.5s%5u] "FMT"\n", current->comm, current->pid ,##__VA_ARGS__)
|
||||
#define kdebug(FMT, ...) \
|
||||
printk("[%-5.5s%5u] " FMT "\n", \
|
||||
current->comm, current->pid, ##__VA_ARGS__)
|
||||
#else
|
||||
#define kdebug(FMT, ...) \
|
||||
no_printk("[%-5.5s%5u] "FMT"\n", current->comm, current->pid ,##__VA_ARGS__)
|
||||
#define kdebug(FMT, ...) \
|
||||
do { \
|
||||
if (0) \
|
||||
no_printk("[%-5.5s%5u] " FMT "\n", \
|
||||
current->comm, current->pid, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static struct kmem_cache *cred_jar;
|
||||
|
|
|
|||
|
|
@ -9094,7 +9094,7 @@ static void perf_event_init_cpu(int cpu)
|
|||
mutex_unlock(&swhash->hlist_mutex);
|
||||
}
|
||||
|
||||
#if defined CONFIG_HOTPLUG_CPU || defined CONFIG_KEXEC
|
||||
#if defined CONFIG_HOTPLUG_CPU || defined CONFIG_KEXEC_CORE
|
||||
static void __perf_event_exit_context(void *__info)
|
||||
{
|
||||
struct remove_event re = { .detach_group = true };
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
#include <linux/ftrace.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
|
|
|
|||
2531
kernel/kexec.c
2531
kernel/kexec.c
File diff suppressed because it is too large
Load diff
1534
kernel/kexec_core.c
Normal file
1534
kernel/kexec_core.c
Normal file
File diff suppressed because it is too large
Load diff
1045
kernel/kexec_file.c
Normal file
1045
kernel/kexec_file.c
Normal file
File diff suppressed because it is too large
Load diff
22
kernel/kexec_internal.h
Normal file
22
kernel/kexec_internal.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef LINUX_KEXEC_INTERNAL_H
|
||||
#define LINUX_KEXEC_INTERNAL_H
|
||||
|
||||
#include <linux/kexec.h>
|
||||
|
||||
struct kimage *do_kimage_alloc_init(void);
|
||||
int sanity_check_segment_list(struct kimage *image);
|
||||
void kimage_free_page_list(struct list_head *list);
|
||||
void kimage_free(struct kimage *image);
|
||||
int kimage_load_segment(struct kimage *image, struct kexec_segment *segment);
|
||||
void kimage_terminate(struct kimage *image);
|
||||
int kimage_is_destination_range(struct kimage *image,
|
||||
unsigned long start, unsigned long end);
|
||||
|
||||
extern struct mutex kexec_mutex;
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
void kimage_file_post_load_cleanup(struct kimage *image);
|
||||
#else /* CONFIG_KEXEC_FILE */
|
||||
static inline void kimage_file_post_load_cleanup(struct kimage *image) { }
|
||||
#endif /* CONFIG_KEXEC_FILE */
|
||||
#endif /* LINUX_KEXEC_INTERNAL_H */
|
||||
100
kernel/kmod.c
100
kernel/kmod.c
|
|
@ -45,8 +45,6 @@
|
|||
|
||||
extern int max_threads;
|
||||
|
||||
static struct workqueue_struct *khelper_wq;
|
||||
|
||||
#define CAP_BSET (void *)1
|
||||
#define CAP_PI (void *)2
|
||||
|
||||
|
|
@ -114,10 +112,11 @@ out:
|
|||
* @...: arguments as specified in the format string
|
||||
*
|
||||
* Load a module using the user mode module loader. The function returns
|
||||
* zero on success or a negative errno code on failure. Note that a
|
||||
* successful module load does not mean the module did not then unload
|
||||
* and exit on an error of its own. Callers must check that the service
|
||||
* they requested is now available not blindly invoke it.
|
||||
* zero on success or a negative errno code or positive exit code from
|
||||
* "modprobe" on failure. Note that a successful module load does not mean
|
||||
* the module did not then unload and exit on an error of its own. Callers
|
||||
* must check that the service they requested is now available not blindly
|
||||
* invoke it.
|
||||
*
|
||||
* If module auto-loading support is disabled then this function
|
||||
* becomes a no-operation.
|
||||
|
|
@ -213,7 +212,7 @@ static void umh_complete(struct subprocess_info *sub_info)
|
|||
/*
|
||||
* This is the task which runs the usermode application
|
||||
*/
|
||||
static int ____call_usermodehelper(void *data)
|
||||
static int call_usermodehelper_exec_async(void *data)
|
||||
{
|
||||
struct subprocess_info *sub_info = data;
|
||||
struct cred *new;
|
||||
|
|
@ -223,12 +222,9 @@ static int ____call_usermodehelper(void *data)
|
|||
flush_signal_handlers(current, 1);
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
||||
/* We can run anywhere, unlike our parent keventd(). */
|
||||
set_cpus_allowed_ptr(current, cpu_all_mask);
|
||||
|
||||
/*
|
||||
* Our parent is keventd, which runs with elevated scheduling priority.
|
||||
* Avoid propagating that into the userspace child.
|
||||
* Our parent (unbound workqueue) runs with elevated scheduling
|
||||
* priority. Avoid propagating that into the userspace child.
|
||||
*/
|
||||
set_user_nice(current, 0);
|
||||
|
||||
|
|
@ -258,7 +254,10 @@ static int ____call_usermodehelper(void *data)
|
|||
(const char __user *const __user *)sub_info->envp);
|
||||
out:
|
||||
sub_info->retval = retval;
|
||||
/* wait_for_helper() will call umh_complete if UHM_WAIT_PROC. */
|
||||
/*
|
||||
* call_usermodehelper_exec_sync() will call umh_complete
|
||||
* if UHM_WAIT_PROC.
|
||||
*/
|
||||
if (!(sub_info->wait & UMH_WAIT_PROC))
|
||||
umh_complete(sub_info);
|
||||
if (!retval)
|
||||
|
|
@ -266,15 +265,14 @@ out:
|
|||
do_exit(0);
|
||||
}
|
||||
|
||||
/* Keventd can't block, but this (a child) can. */
|
||||
static int wait_for_helper(void *data)
|
||||
/* Handles UMH_WAIT_PROC. */
|
||||
static void call_usermodehelper_exec_sync(struct subprocess_info *sub_info)
|
||||
{
|
||||
struct subprocess_info *sub_info = data;
|
||||
pid_t pid;
|
||||
|
||||
/* If SIGCLD is ignored sys_wait4 won't populate the status. */
|
||||
kernel_sigaction(SIGCHLD, SIG_DFL);
|
||||
pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
|
||||
pid = kernel_thread(call_usermodehelper_exec_async, sub_info, SIGCHLD);
|
||||
if (pid < 0) {
|
||||
sub_info->retval = pid;
|
||||
} else {
|
||||
|
|
@ -282,44 +280,60 @@ static int wait_for_helper(void *data)
|
|||
/*
|
||||
* Normally it is bogus to call wait4() from in-kernel because
|
||||
* wait4() wants to write the exit code to a userspace address.
|
||||
* But wait_for_helper() always runs as keventd, and put_user()
|
||||
* to a kernel address works OK for kernel threads, due to their
|
||||
* having an mm_segment_t which spans the entire address space.
|
||||
* But call_usermodehelper_exec_sync() always runs as kernel
|
||||
* thread (workqueue) and put_user() to a kernel address works
|
||||
* OK for kernel threads, due to their having an mm_segment_t
|
||||
* which spans the entire address space.
|
||||
*
|
||||
* Thus the __user pointer cast is valid here.
|
||||
*/
|
||||
sys_wait4(pid, (int __user *)&ret, 0, NULL);
|
||||
|
||||
/*
|
||||
* If ret is 0, either ____call_usermodehelper failed and the
|
||||
* real error code is already in sub_info->retval or
|
||||
* If ret is 0, either call_usermodehelper_exec_async failed and
|
||||
* the real error code is already in sub_info->retval or
|
||||
* sub_info->retval is 0 anyway, so don't mess with it then.
|
||||
*/
|
||||
if (ret)
|
||||
sub_info->retval = ret;
|
||||
}
|
||||
|
||||
/* Restore default kernel sig handler */
|
||||
kernel_sigaction(SIGCHLD, SIG_IGN);
|
||||
|
||||
umh_complete(sub_info);
|
||||
do_exit(0);
|
||||
}
|
||||
|
||||
/* This is run by khelper thread */
|
||||
static void __call_usermodehelper(struct work_struct *work)
|
||||
/*
|
||||
* We need to create the usermodehelper kernel thread from a task that is affine
|
||||
* to an optimized set of CPUs (or nohz housekeeping ones) such that they
|
||||
* inherit a widest affinity irrespective of call_usermodehelper() callers with
|
||||
* possibly reduced affinity (eg: per-cpu workqueues). We don't want
|
||||
* usermodehelper targets to contend a busy CPU.
|
||||
*
|
||||
* Unbound workqueues provide such wide affinity and allow to block on
|
||||
* UMH_WAIT_PROC requests without blocking pending request (up to some limit).
|
||||
*
|
||||
* Besides, workqueues provide the privilege level that caller might not have
|
||||
* to perform the usermodehelper request.
|
||||
*
|
||||
*/
|
||||
static void call_usermodehelper_exec_work(struct work_struct *work)
|
||||
{
|
||||
struct subprocess_info *sub_info =
|
||||
container_of(work, struct subprocess_info, work);
|
||||
pid_t pid;
|
||||
|
||||
if (sub_info->wait & UMH_WAIT_PROC)
|
||||
pid = kernel_thread(wait_for_helper, sub_info,
|
||||
CLONE_FS | CLONE_FILES | SIGCHLD);
|
||||
else
|
||||
pid = kernel_thread(____call_usermodehelper, sub_info,
|
||||
if (sub_info->wait & UMH_WAIT_PROC) {
|
||||
call_usermodehelper_exec_sync(sub_info);
|
||||
} else {
|
||||
pid_t pid;
|
||||
|
||||
pid = kernel_thread(call_usermodehelper_exec_async, sub_info,
|
||||
SIGCHLD);
|
||||
|
||||
if (pid < 0) {
|
||||
sub_info->retval = pid;
|
||||
umh_complete(sub_info);
|
||||
if (pid < 0) {
|
||||
sub_info->retval = pid;
|
||||
umh_complete(sub_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -509,7 +523,7 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv,
|
|||
if (!sub_info)
|
||||
goto out;
|
||||
|
||||
INIT_WORK(&sub_info->work, __call_usermodehelper);
|
||||
INIT_WORK(&sub_info->work, call_usermodehelper_exec_work);
|
||||
sub_info->path = path;
|
||||
sub_info->argv = argv;
|
||||
sub_info->envp = envp;
|
||||
|
|
@ -531,8 +545,8 @@ EXPORT_SYMBOL(call_usermodehelper_setup);
|
|||
* from interrupt context.
|
||||
*
|
||||
* Runs a user-space application. The application is started
|
||||
* asynchronously if wait is not set, and runs as a child of keventd.
|
||||
* (ie. it runs with full root capabilities).
|
||||
* asynchronously if wait is not set, and runs as a child of system workqueues.
|
||||
* (ie. it runs with full root capabilities and optimized affinity).
|
||||
*/
|
||||
int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
|
||||
{
|
||||
|
|
@ -544,7 +558,7 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
|
|||
return -EINVAL;
|
||||
}
|
||||
helper_lock();
|
||||
if (!khelper_wq || usermodehelper_disabled) {
|
||||
if (usermodehelper_disabled) {
|
||||
retval = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -556,7 +570,7 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
|
|||
sub_info->complete = (wait == UMH_NO_WAIT) ? NULL : &done;
|
||||
sub_info->wait = wait;
|
||||
|
||||
queue_work(khelper_wq, &sub_info->work);
|
||||
queue_work(system_unbound_wq, &sub_info->work);
|
||||
if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
||||
goto unlock;
|
||||
|
||||
|
|
@ -686,9 +700,3 @@ struct ctl_table usermodehelper_table[] = {
|
|||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
void __init usermodehelper_init(void)
|
||||
{
|
||||
khelper_wq = create_singlethread_workqueue("khelper");
|
||||
BUG_ON(!khelper_wq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ static ssize_t profiling_store(struct kobject *kobj,
|
|||
KERNEL_ATTR_RW(profiling);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
static ssize_t kexec_loaded_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
|
|
@ -134,7 +134,7 @@ static ssize_t vmcoreinfo_show(struct kobject *kobj,
|
|||
}
|
||||
KERNEL_ATTR_RO(vmcoreinfo);
|
||||
|
||||
#endif /* CONFIG_KEXEC */
|
||||
#endif /* CONFIG_KEXEC_CORE */
|
||||
|
||||
/* whether file capabilities are enabled */
|
||||
static ssize_t fscaps_show(struct kobject *kobj,
|
||||
|
|
@ -196,7 +196,7 @@ static struct attribute * kernel_attrs[] = {
|
|||
#ifdef CONFIG_PROFILING
|
||||
&profiling_attr.attr,
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
&kexec_loaded_attr.attr,
|
||||
&kexec_crash_loaded_attr.attr,
|
||||
&kexec_crash_size_attr.attr,
|
||||
|
|
|
|||
|
|
@ -835,7 +835,7 @@ const struct file_operations kmsg_fops = {
|
|||
.release = devkmsg_release,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
/*
|
||||
* This appends the listed symbols to /proc/vmcore
|
||||
*
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
|
|||
kernel_restart(buffer);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
case LINUX_REBOOT_CMD_KEXEC:
|
||||
ret = kernel_kexec();
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -621,7 +621,7 @@ static struct ctl_table kern_table[] = {
|
|||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
{
|
||||
.procname = "kexec_load_disabled",
|
||||
.data = &kexec_load_disabled,
|
||||
|
|
@ -1995,7 +1995,7 @@ static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
|
|||
int val = *valp;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
*lvalp = (unsigned long)-val;
|
||||
*lvalp = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
*lvalp = (unsigned long)val;
|
||||
|
|
@ -2201,7 +2201,7 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
|
|||
int val = *valp;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
*lvalp = (unsigned long)-val;
|
||||
*lvalp = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
*lvalp = (unsigned long)val;
|
||||
|
|
@ -2436,7 +2436,7 @@ static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|||
unsigned long lval;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
lval = (unsigned long)-val;
|
||||
lval = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
lval = (unsigned long)val;
|
||||
|
|
@ -2459,7 +2459,7 @@ static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp
|
|||
unsigned long lval;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
lval = (unsigned long)-val;
|
||||
lval = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
lval = (unsigned long)val;
|
||||
|
|
@ -2484,7 +2484,7 @@ static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|||
unsigned long lval;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
lval = (unsigned long)-val;
|
||||
lval = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
lval = (unsigned long)val;
|
||||
|
|
|
|||
Loading…
Reference in a new issue