Merge branch 'akpm' (patches from Andrew)
Merge third patch-bomb from Andrew Morton: "I'm pretty much done for -rc1 now: - the rest of MM, basically - lib/ updates - checkpatch, epoll, hfs, fatfs, ptrace, coredump, exit - cpu_mask simplifications - kexec, rapidio, MAINTAINERS etc, etc. - more dma-mapping cleanups/simplifications from hch" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (109 commits) MAINTAINERS: add/fix git URLs for various subsystems mm: memcontrol: add "sock" to cgroup2 memory.stat mm: memcontrol: basic memory statistics in cgroup2 memory controller mm: memcontrol: do not uncharge old page in page cache replacement Documentation: cgroup: add memory.swap.{current,max} description mm: free swap cache aggressively if memcg swap is full mm: vmscan: do not scan anon pages if memcg swap limit is hit swap.h: move memcg related stuff to the end of the file mm: memcontrol: replace mem_cgroup_lruvec_online with mem_cgroup_online mm: vmscan: pass memcg to get_scan_count() mm: memcontrol: charge swap to cgroup2 mm: memcontrol: clean up alloc, online, offline, free functions mm: memcontrol: flatten struct cg_proto mm: memcontrol: rein in the CONFIG space madness net: drop tcp_memcontrol.c mm: memcontrol: introduce CONFIG_MEMCG_LEGACY_KMEM mm: memcontrol: allow to disable kmem accounting for cgroup2 mm: memcontrol: account "kmem" consumers in cgroup2 memory controller mm: memcontrol: move kmem accounting code to CONFIG_MEMCG mm: memcontrol: separate kmem code from legacy tcp accounting code ...
This commit is contained in:
+13
-51
@@ -759,71 +759,33 @@ const DECLARE_BITMAP(cpu_all_bits, NR_CPUS) = CPU_BITS_ALL;
|
||||
EXPORT_SYMBOL(cpu_all_bits);
|
||||
|
||||
#ifdef CONFIG_INIT_ALL_POSSIBLE
|
||||
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly
|
||||
= CPU_BITS_ALL;
|
||||
struct cpumask __cpu_possible_mask __read_mostly
|
||||
= {CPU_BITS_ALL};
|
||||
#else
|
||||
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||
struct cpumask __cpu_possible_mask __read_mostly;
|
||||
#endif
|
||||
const struct cpumask *const cpu_possible_mask = to_cpumask(cpu_possible_bits);
|
||||
EXPORT_SYMBOL(cpu_possible_mask);
|
||||
EXPORT_SYMBOL(__cpu_possible_mask);
|
||||
|
||||
static DECLARE_BITMAP(cpu_online_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||
const struct cpumask *const cpu_online_mask = to_cpumask(cpu_online_bits);
|
||||
EXPORT_SYMBOL(cpu_online_mask);
|
||||
struct cpumask __cpu_online_mask __read_mostly;
|
||||
EXPORT_SYMBOL(__cpu_online_mask);
|
||||
|
||||
static DECLARE_BITMAP(cpu_present_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||
const struct cpumask *const cpu_present_mask = to_cpumask(cpu_present_bits);
|
||||
EXPORT_SYMBOL(cpu_present_mask);
|
||||
struct cpumask __cpu_present_mask __read_mostly;
|
||||
EXPORT_SYMBOL(__cpu_present_mask);
|
||||
|
||||
static DECLARE_BITMAP(cpu_active_bits, CONFIG_NR_CPUS) __read_mostly;
|
||||
const struct cpumask *const cpu_active_mask = to_cpumask(cpu_active_bits);
|
||||
EXPORT_SYMBOL(cpu_active_mask);
|
||||
|
||||
void set_cpu_possible(unsigned int cpu, bool possible)
|
||||
{
|
||||
if (possible)
|
||||
cpumask_set_cpu(cpu, to_cpumask(cpu_possible_bits));
|
||||
else
|
||||
cpumask_clear_cpu(cpu, to_cpumask(cpu_possible_bits));
|
||||
}
|
||||
|
||||
void set_cpu_present(unsigned int cpu, bool present)
|
||||
{
|
||||
if (present)
|
||||
cpumask_set_cpu(cpu, to_cpumask(cpu_present_bits));
|
||||
else
|
||||
cpumask_clear_cpu(cpu, to_cpumask(cpu_present_bits));
|
||||
}
|
||||
|
||||
void set_cpu_online(unsigned int cpu, bool online)
|
||||
{
|
||||
if (online) {
|
||||
cpumask_set_cpu(cpu, to_cpumask(cpu_online_bits));
|
||||
cpumask_set_cpu(cpu, to_cpumask(cpu_active_bits));
|
||||
} else {
|
||||
cpumask_clear_cpu(cpu, to_cpumask(cpu_online_bits));
|
||||
}
|
||||
}
|
||||
|
||||
void set_cpu_active(unsigned int cpu, bool active)
|
||||
{
|
||||
if (active)
|
||||
cpumask_set_cpu(cpu, to_cpumask(cpu_active_bits));
|
||||
else
|
||||
cpumask_clear_cpu(cpu, to_cpumask(cpu_active_bits));
|
||||
}
|
||||
struct cpumask __cpu_active_mask __read_mostly;
|
||||
EXPORT_SYMBOL(__cpu_active_mask);
|
||||
|
||||
void init_cpu_present(const struct cpumask *src)
|
||||
{
|
||||
cpumask_copy(to_cpumask(cpu_present_bits), src);
|
||||
cpumask_copy(&__cpu_present_mask, src);
|
||||
}
|
||||
|
||||
void init_cpu_possible(const struct cpumask *src)
|
||||
{
|
||||
cpumask_copy(to_cpumask(cpu_possible_bits), src);
|
||||
cpumask_copy(&__cpu_possible_mask, src);
|
||||
}
|
||||
|
||||
void init_cpu_online(const struct cpumask *src)
|
||||
{
|
||||
cpumask_copy(to_cpumask(cpu_online_bits), src);
|
||||
cpumask_copy(&__cpu_online_mask, src);
|
||||
}
|
||||
|
||||
@@ -3376,7 +3376,7 @@ find_lively_task_by_vpid(pid_t vpid)
|
||||
|
||||
/* Reuse ptrace permission checks for now. */
|
||||
err = -EACCES;
|
||||
if (!ptrace_may_access(task, PTRACE_MODE_READ))
|
||||
if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS))
|
||||
goto errout;
|
||||
|
||||
return task;
|
||||
|
||||
+1
-4
@@ -59,8 +59,6 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
static void exit_mm(struct task_struct *tsk);
|
||||
|
||||
static void __unhash_process(struct task_struct *p, bool group_dead)
|
||||
{
|
||||
nr_threads--;
|
||||
@@ -1120,8 +1118,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
|
||||
static int *task_stopped_code(struct task_struct *p, bool ptrace)
|
||||
{
|
||||
if (ptrace) {
|
||||
if (task_is_stopped_or_traced(p) &&
|
||||
!(p->jobctl & JOBCTL_LISTENING))
|
||||
if (task_is_traced(p) && !(p->jobctl & JOBCTL_LISTENING))
|
||||
return &p->exit_code;
|
||||
} else {
|
||||
if (p->signal->flags & SIGNAL_STOP_STOPPED)
|
||||
|
||||
+1
-1
@@ -2884,7 +2884,7 @@ SYSCALL_DEFINE3(get_robust_list, int, pid,
|
||||
}
|
||||
|
||||
ret = -EPERM;
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ))
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS))
|
||||
goto err_unlock;
|
||||
|
||||
head = p->robust_list;
|
||||
|
||||
@@ -155,7 +155,7 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
|
||||
}
|
||||
|
||||
ret = -EPERM;
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ))
|
||||
if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS))
|
||||
goto err_unlock;
|
||||
|
||||
head = p->compat_robust_list;
|
||||
|
||||
+2
-2
@@ -122,8 +122,8 @@ SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type,
|
||||
&task2->signal->cred_guard_mutex);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (!ptrace_may_access(task1, PTRACE_MODE_READ) ||
|
||||
!ptrace_may_access(task2, PTRACE_MODE_READ)) {
|
||||
if (!ptrace_may_access(task1, PTRACE_MODE_READ_REALCREDS) ||
|
||||
!ptrace_may_access(task2, PTRACE_MODE_READ_REALCREDS)) {
|
||||
ret = -EPERM;
|
||||
goto err_unlock;
|
||||
}
|
||||
|
||||
+5
-5
@@ -63,16 +63,16 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
|
||||
if (ret)
|
||||
goto out_free_image;
|
||||
|
||||
ret = sanity_check_segment_list(image);
|
||||
if (ret)
|
||||
goto out_free_image;
|
||||
|
||||
/* Enable the special crash kernel control page allocation policy. */
|
||||
if (kexec_on_panic) {
|
||||
/* Enable special crash kernel control page alloc policy. */
|
||||
image->control_page = crashk_res.start;
|
||||
image->type = KEXEC_TYPE_CRASH;
|
||||
}
|
||||
|
||||
ret = sanity_check_segment_list(image);
|
||||
if (ret)
|
||||
goto out_free_image;
|
||||
|
||||
/*
|
||||
* Find a location for the control code buffer, and add it
|
||||
* the vector of segments so that it's pages will also be
|
||||
|
||||
+2
-5
@@ -310,12 +310,9 @@ static void kimage_free_pages(struct page *page)
|
||||
|
||||
void kimage_free_page_list(struct list_head *list)
|
||||
{
|
||||
struct list_head *pos, *next;
|
||||
struct page *page, *next;
|
||||
|
||||
list_for_each_safe(pos, next, list) {
|
||||
struct page *page;
|
||||
|
||||
page = list_entry(pos, struct page, lru);
|
||||
list_for_each_entry_safe(page, next, list, lru) {
|
||||
list_del(&page->lru);
|
||||
kimage_free_pages(page);
|
||||
}
|
||||
|
||||
@@ -109,11 +109,13 @@ int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_VERIFY_SIG
|
||||
int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
return -EKEYREJECTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Apply relocations of type RELA */
|
||||
int __weak
|
||||
|
||||
@@ -15,6 +15,27 @@ int kimage_is_destination_range(struct kimage *image,
|
||||
extern struct mutex kexec_mutex;
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
struct kexec_sha_region {
|
||||
unsigned long start;
|
||||
unsigned long len;
|
||||
};
|
||||
|
||||
/*
|
||||
* Keeps track of buffer parameters as provided by caller for requesting
|
||||
* memory placement of buffer.
|
||||
*/
|
||||
struct kexec_buf {
|
||||
struct kimage *image;
|
||||
char *buffer;
|
||||
unsigned long bufsz;
|
||||
unsigned long mem;
|
||||
unsigned long memsz;
|
||||
unsigned long buf_align;
|
||||
unsigned long buf_min;
|
||||
unsigned long buf_max;
|
||||
bool top_down; /* allocate from top of memory hole */
|
||||
};
|
||||
|
||||
void kimage_file_post_load_cleanup(struct kimage *image);
|
||||
#else /* CONFIG_KEXEC_FILE */
|
||||
static inline void kimage_file_post_load_cleanup(struct kimage *image) { }
|
||||
|
||||
@@ -233,7 +233,11 @@ struct printk_log {
|
||||
u8 facility; /* syslog facility */
|
||||
u8 flags:5; /* internal record flags */
|
||||
u8 level:3; /* syslog level */
|
||||
};
|
||||
}
|
||||
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
__packed __aligned(4)
|
||||
#endif
|
||||
;
|
||||
|
||||
/*
|
||||
* The logbuf_lock protects kmsg buffer, indices, counters. This can be taken
|
||||
@@ -274,11 +278,7 @@ static u32 clear_idx;
|
||||
#define LOG_FACILITY(v) ((v) >> 3 & 0xff)
|
||||
|
||||
/* record buffer */
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
#define LOG_ALIGN 4
|
||||
#else
|
||||
#define LOG_ALIGN __alignof__(struct printk_log)
|
||||
#endif
|
||||
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
|
||||
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
|
||||
static char *log_buf = __log_buf;
|
||||
|
||||
+39
-10
@@ -219,6 +219,14 @@ static int ptrace_has_cap(struct user_namespace *ns, unsigned int mode)
|
||||
static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
|
||||
{
|
||||
const struct cred *cred = current_cred(), *tcred;
|
||||
int dumpable = 0;
|
||||
kuid_t caller_uid;
|
||||
kgid_t caller_gid;
|
||||
|
||||
if (!(mode & PTRACE_MODE_FSCREDS) == !(mode & PTRACE_MODE_REALCREDS)) {
|
||||
WARN(1, "denying ptrace access check without PTRACE_MODE_*CREDS\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
/* May we inspect the given task?
|
||||
* This check is used both for attaching with ptrace
|
||||
@@ -228,18 +236,33 @@ static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
|
||||
* because setting up the necessary parent/child relationship
|
||||
* or halting the specified task is impossible.
|
||||
*/
|
||||
int dumpable = 0;
|
||||
|
||||
/* Don't let security modules deny introspection */
|
||||
if (same_thread_group(task, current))
|
||||
return 0;
|
||||
rcu_read_lock();
|
||||
if (mode & PTRACE_MODE_FSCREDS) {
|
||||
caller_uid = cred->fsuid;
|
||||
caller_gid = cred->fsgid;
|
||||
} else {
|
||||
/*
|
||||
* Using the euid would make more sense here, but something
|
||||
* in userland might rely on the old behavior, and this
|
||||
* shouldn't be a security problem since
|
||||
* PTRACE_MODE_REALCREDS implies that the caller explicitly
|
||||
* used a syscall that requests access to another process
|
||||
* (and not a filesystem syscall to procfs).
|
||||
*/
|
||||
caller_uid = cred->uid;
|
||||
caller_gid = cred->gid;
|
||||
}
|
||||
tcred = __task_cred(task);
|
||||
if (uid_eq(cred->uid, tcred->euid) &&
|
||||
uid_eq(cred->uid, tcred->suid) &&
|
||||
uid_eq(cred->uid, tcred->uid) &&
|
||||
gid_eq(cred->gid, tcred->egid) &&
|
||||
gid_eq(cred->gid, tcred->sgid) &&
|
||||
gid_eq(cred->gid, tcred->gid))
|
||||
if (uid_eq(caller_uid, tcred->euid) &&
|
||||
uid_eq(caller_uid, tcred->suid) &&
|
||||
uid_eq(caller_uid, tcred->uid) &&
|
||||
gid_eq(caller_gid, tcred->egid) &&
|
||||
gid_eq(caller_gid, tcred->sgid) &&
|
||||
gid_eq(caller_gid, tcred->gid))
|
||||
goto ok;
|
||||
if (ptrace_has_cap(tcred->user_ns, mode))
|
||||
goto ok;
|
||||
@@ -306,7 +329,7 @@ static int ptrace_attach(struct task_struct *task, long request,
|
||||
goto out;
|
||||
|
||||
task_lock(task);
|
||||
retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH);
|
||||
retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH_REALCREDS);
|
||||
task_unlock(task);
|
||||
if (retval)
|
||||
goto unlock_creds;
|
||||
@@ -364,8 +387,14 @@ unlock_creds:
|
||||
mutex_unlock(&task->signal->cred_guard_mutex);
|
||||
out:
|
||||
if (!retval) {
|
||||
wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT,
|
||||
TASK_UNINTERRUPTIBLE);
|
||||
/*
|
||||
* We do not bother to change retval or clear JOBCTL_TRAPPING
|
||||
* if wait_on_bit() was interrupted by SIGKILL. The tracer will
|
||||
* not return to user-mode, it will exit and clear this bit in
|
||||
* __ptrace_unlink() if it wasn't already cleared by the tracee;
|
||||
* and until then nobody can ptrace this task.
|
||||
*/
|
||||
wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT, TASK_KILLABLE);
|
||||
proc_ptrace_connector(task, PTRACE_ATTACH);
|
||||
}
|
||||
|
||||
|
||||
+10
-10
@@ -1853,11 +1853,13 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
|
||||
user_auxv[AT_VECTOR_SIZE - 1] = AT_NULL;
|
||||
}
|
||||
|
||||
if (prctl_map.exe_fd != (u32)-1)
|
||||
if (prctl_map.exe_fd != (u32)-1) {
|
||||
error = prctl_set_mm_exe_file(mm, prctl_map.exe_fd);
|
||||
down_read(&mm->mmap_sem);
|
||||
if (error)
|
||||
goto out;
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
|
||||
/*
|
||||
* We don't validate if these members are pointing to
|
||||
@@ -1894,10 +1896,8 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
|
||||
if (prctl_map.auxv_size)
|
||||
memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv));
|
||||
|
||||
error = 0;
|
||||
out:
|
||||
up_read(&mm->mmap_sem);
|
||||
return error;
|
||||
up_write(&mm->mmap_sem);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_CHECKPOINT_RESTORE */
|
||||
|
||||
@@ -1963,7 +1963,7 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
||||
|
||||
error = -EINVAL;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
down_write(&mm->mmap_sem);
|
||||
vma = find_vma(mm, addr);
|
||||
|
||||
prctl_map.start_code = mm->start_code;
|
||||
@@ -2056,7 +2056,7 @@ static int prctl_set_mm(int opt, unsigned long addr,
|
||||
|
||||
error = 0;
|
||||
out:
|
||||
up_read(&mm->mmap_sem);
|
||||
up_write(&mm->mmap_sem);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -173,7 +173,7 @@ extern int no_unaligned_warning;
|
||||
#define SYSCTL_WRITES_WARN 0
|
||||
#define SYSCTL_WRITES_STRICT 1
|
||||
|
||||
static int sysctl_writes_strict = SYSCTL_WRITES_WARN;
|
||||
static int sysctl_writes_strict = SYSCTL_WRITES_STRICT;
|
||||
|
||||
static int proc_do_cad_pid(struct ctl_table *table, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos);
|
||||
|
||||
Reference in New Issue
Block a user