Merge branch 'akpm' (patches from Andrew)
Merge patch-bomb from Andrew Morton: - a few misc things - Andy's "ambient capabilities" - fs/nofity updates - the ocfs2 queue - kernel/watchdog.c updates and feature work. - some of MM. Includes Andrea's userfaultfd feature. [ Hadn't noticed that userfaultfd was 'default y' when applying the patches, so that got fixed in this merge instead. We do _not_ mark new features that nobody uses yet 'default y' - Linus ] * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (118 commits) mm/hugetlb.c: make vma_has_reserves() return bool mm/madvise.c: make madvise_behaviour_valid() return bool mm/memory.c: make tlb_next_batch() return bool mm/dmapool.c: change is_page_busy() return from int to bool mm: remove struct node_active_region mremap: simplify the "overlap" check in mremap_to() mremap: don't do uneccesary checks if new_len == old_len mremap: don't do mm_populate(new_addr) on failure mm: move ->mremap() from file_operations to vm_operations_struct mremap: don't leak new_vma if f_op->mremap() fails mm/hugetlb.c: make vma_shareable() return bool mm: make GUP handle pfn mapping unless FOLL_GET is requested mm: fix status code which move_pages() returns for zero page mm: memcontrol: bring back the VM_BUG_ON() in mem_cgroup_swapout() genalloc: add support of multiple gen_pools per device genalloc: add name arg to gen_pool_get() and devm_gen_pool_create() mm/memblock: WARN_ON when nid differs from overlap region Documentation/features/vm: add feature description and arch support status for batched TLB flush after unmap mm: defer flush of writable TLB entries mm: send one IPI per CPU to TLB flush all entries after unmapping pages ...
This commit is contained in:
@@ -1342,7 +1342,7 @@ static int cgroup_show_options(struct seq_file *seq,
|
||||
if (root != &cgrp_dfl_root)
|
||||
for_each_subsys(ss, ssid)
|
||||
if (root->subsys_mask & (1 << ssid))
|
||||
seq_printf(seq, ",%s", ss->legacy_name);
|
||||
seq_show_option(seq, ss->name, NULL);
|
||||
if (root->flags & CGRP_ROOT_NOPREFIX)
|
||||
seq_puts(seq, ",noprefix");
|
||||
if (root->flags & CGRP_ROOT_XATTR)
|
||||
@@ -1350,13 +1350,14 @@ static int cgroup_show_options(struct seq_file *seq,
|
||||
|
||||
spin_lock(&release_agent_path_lock);
|
||||
if (strlen(root->release_agent_path))
|
||||
seq_printf(seq, ",release_agent=%s", root->release_agent_path);
|
||||
seq_show_option(seq, "release_agent",
|
||||
root->release_agent_path);
|
||||
spin_unlock(&release_agent_path_lock);
|
||||
|
||||
if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags))
|
||||
seq_puts(seq, ",clone_children");
|
||||
if (strlen(root->name))
|
||||
seq_printf(seq, ",name=%s", root->name);
|
||||
seq_show_option(seq, "name", root->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -454,8 +454,9 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||
tmp->vm_mm = mm;
|
||||
if (anon_vma_fork(tmp, mpnt))
|
||||
goto fail_nomem_anon_vma_fork;
|
||||
tmp->vm_flags &= ~VM_LOCKED;
|
||||
tmp->vm_flags &= ~(VM_LOCKED|VM_UFFD_MISSING|VM_UFFD_WP);
|
||||
tmp->vm_next = tmp->vm_prev = NULL;
|
||||
tmp->vm_userfaultfd_ctx = NULL_VM_UFFD_CTX;
|
||||
file = tmp->vm_file;
|
||||
if (file) {
|
||||
struct inode *inode = file_inode(file);
|
||||
|
@@ -248,15 +248,16 @@ static void create_kthread(struct kthread_create_info *create)
|
||||
* kthread_create_on_node - create a kthread.
|
||||
* @threadfn: the function to run until signal_pending(current).
|
||||
* @data: data ptr for @threadfn.
|
||||
* @node: memory node number.
|
||||
* @node: task and thread structures for the thread are allocated on this node
|
||||
* @namefmt: printf-style name for the thread.
|
||||
*
|
||||
* Description: This helper function creates and names a kernel
|
||||
* thread. The thread will be stopped: use wake_up_process() to start
|
||||
* it. See also kthread_run().
|
||||
* it. See also kthread_run(). The new thread has SCHED_NORMAL policy and
|
||||
* is affine to all CPUs.
|
||||
*
|
||||
* If thread is going to be bound on a particular cpu, give its node
|
||||
* in @node, to get NUMA affinity for kthread stack, or else give -1.
|
||||
* in @node, to get NUMA affinity for kthread stack, or else give NUMA_NO_NODE.
|
||||
* When woken, the thread will run @threadfn() with @data as its
|
||||
* argument. @threadfn() can either call do_exit() directly if it is a
|
||||
* standalone thread for which no one will call kthread_stop(), or
|
||||
|
@@ -106,9 +106,10 @@ void __wake_up_locked(wait_queue_head_t *q, unsigned int mode, int nr)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__wake_up_locked);
|
||||
|
||||
void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key)
|
||||
void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, int nr,
|
||||
void *key)
|
||||
{
|
||||
__wake_up_common(q, mode, 1, 0, key);
|
||||
__wake_up_common(q, mode, nr, 0, key);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__wake_up_locked_key);
|
||||
|
||||
@@ -283,7 +284,7 @@ void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
|
||||
if (!list_empty(&wait->task_list))
|
||||
list_del_init(&wait->task_list);
|
||||
else if (waitqueue_active(q))
|
||||
__wake_up_locked_key(q, mode, key);
|
||||
__wake_up_locked_key(q, mode, 1, key);
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(abort_exclusive_wait);
|
||||
|
@@ -113,7 +113,8 @@ static int smpboot_thread_fn(void *data)
|
||||
if (kthread_should_stop()) {
|
||||
__set_current_state(TASK_RUNNING);
|
||||
preempt_enable();
|
||||
if (ht->cleanup)
|
||||
/* cleanup must mirror setup */
|
||||
if (ht->cleanup && td->status != HP_THREAD_NONE)
|
||||
ht->cleanup(td->cpu, cpu_online(td->cpu));
|
||||
kfree(td);
|
||||
return 0;
|
||||
@@ -259,15 +260,6 @@ static void smpboot_destroy_threads(struct smp_hotplug_thread *ht)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
/* Unpark any threads that were voluntarily parked. */
|
||||
for_each_cpu_not(cpu, ht->cpumask) {
|
||||
if (cpu_online(cpu)) {
|
||||
struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu);
|
||||
if (tsk)
|
||||
kthread_unpark(tsk);
|
||||
}
|
||||
}
|
||||
|
||||
/* We need to destroy also the parked threads of offline cpus */
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu);
|
||||
@@ -281,19 +273,22 @@ static void smpboot_destroy_threads(struct smp_hotplug_thread *ht)
|
||||
}
|
||||
|
||||
/**
|
||||
* smpboot_register_percpu_thread - Register a per_cpu thread related to hotplug
|
||||
* smpboot_register_percpu_thread_cpumask - Register a per_cpu thread related
|
||||
* to hotplug
|
||||
* @plug_thread: Hotplug thread descriptor
|
||||
* @cpumask: The cpumask where threads run
|
||||
*
|
||||
* Creates and starts the threads on all online cpus.
|
||||
*/
|
||||
int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
||||
int smpboot_register_percpu_thread_cpumask(struct smp_hotplug_thread *plug_thread,
|
||||
const struct cpumask *cpumask)
|
||||
{
|
||||
unsigned int cpu;
|
||||
int ret = 0;
|
||||
|
||||
if (!alloc_cpumask_var(&plug_thread->cpumask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
cpumask_copy(plug_thread->cpumask, cpu_possible_mask);
|
||||
cpumask_copy(plug_thread->cpumask, cpumask);
|
||||
|
||||
get_online_cpus();
|
||||
mutex_lock(&smpboot_threads_lock);
|
||||
@@ -301,9 +296,11 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
||||
ret = __smpboot_create_thread(plug_thread, cpu);
|
||||
if (ret) {
|
||||
smpboot_destroy_threads(plug_thread);
|
||||
free_cpumask_var(plug_thread->cpumask);
|
||||
goto out;
|
||||
}
|
||||
smpboot_unpark_thread(plug_thread, cpu);
|
||||
if (cpumask_test_cpu(cpu, cpumask))
|
||||
smpboot_unpark_thread(plug_thread, cpu);
|
||||
}
|
||||
list_add(&plug_thread->list, &hotplug_threads);
|
||||
out:
|
||||
@@ -311,7 +308,7 @@ out:
|
||||
put_online_cpus();
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread);
|
||||
EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread_cpumask);
|
||||
|
||||
/**
|
||||
* smpboot_unregister_percpu_thread - Unregister a per_cpu thread related to hotplug
|
||||
|
@@ -219,6 +219,7 @@ cond_syscall(compat_sys_timerfd_gettime);
|
||||
cond_syscall(sys_eventfd);
|
||||
cond_syscall(sys_eventfd2);
|
||||
cond_syscall(sys_memfd_create);
|
||||
cond_syscall(sys_userfaultfd);
|
||||
|
||||
/* performance counters: */
|
||||
cond_syscall(sys_perf_event_open);
|
||||
|
@@ -39,6 +39,7 @@ static void set_cred_user_ns(struct cred *cred, struct user_namespace *user_ns)
|
||||
cred->cap_inheritable = CAP_EMPTY_SET;
|
||||
cred->cap_permitted = CAP_FULL_SET;
|
||||
cred->cap_effective = CAP_FULL_SET;
|
||||
cred->cap_ambient = CAP_EMPTY_SET;
|
||||
cred->cap_bset = CAP_FULL_SET;
|
||||
#ifdef CONFIG_KEYS
|
||||
key_put(cred->request_key_auth);
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include <asm/irq_regs.h>
|
||||
#include <linux/kvm_para.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/kthread.h>
|
||||
|
||||
/*
|
||||
* The run state of the lockup detectors is controlled by the content of the
|
||||
@@ -66,7 +67,26 @@ unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
|
||||
#define for_each_watchdog_cpu(cpu) \
|
||||
for_each_cpu_and((cpu), cpu_online_mask, &watchdog_cpumask)
|
||||
|
||||
/*
|
||||
* The 'watchdog_running' variable is set to 1 when the watchdog threads
|
||||
* are registered/started and is set to 0 when the watchdog threads are
|
||||
* unregistered/stopped, so it is an indicator whether the threads exist.
|
||||
*/
|
||||
static int __read_mostly watchdog_running;
|
||||
/*
|
||||
* If a subsystem has a need to deactivate the watchdog temporarily, it
|
||||
* can use the suspend/resume interface to achieve this. The content of
|
||||
* the 'watchdog_suspended' variable reflects this state. Existing threads
|
||||
* are parked/unparked by the lockup_detector_{suspend|resume} functions
|
||||
* (see comment blocks pertaining to those functions for further details).
|
||||
*
|
||||
* 'watchdog_suspended' also prevents threads from being registered/started
|
||||
* or unregistered/stopped via parameters in /proc/sys/kernel, so the state
|
||||
* of 'watchdog_running' cannot change while the watchdog is deactivated
|
||||
* temporarily (see related code in 'proc' handlers).
|
||||
*/
|
||||
static int __read_mostly watchdog_suspended;
|
||||
|
||||
static u64 __read_mostly sample_period;
|
||||
|
||||
static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts);
|
||||
@@ -613,46 +633,9 @@ static void watchdog_nmi_disable(unsigned int cpu)
|
||||
}
|
||||
}
|
||||
|
||||
void watchdog_nmi_enable_all(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED))
|
||||
goto unlock;
|
||||
|
||||
get_online_cpus();
|
||||
for_each_watchdog_cpu(cpu)
|
||||
watchdog_nmi_enable(cpu);
|
||||
put_online_cpus();
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
}
|
||||
|
||||
void watchdog_nmi_disable_all(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
if (!watchdog_running)
|
||||
goto unlock;
|
||||
|
||||
get_online_cpus();
|
||||
for_each_watchdog_cpu(cpu)
|
||||
watchdog_nmi_disable(cpu);
|
||||
put_online_cpus();
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
}
|
||||
#else
|
||||
static int watchdog_nmi_enable(unsigned int cpu) { return 0; }
|
||||
static void watchdog_nmi_disable(unsigned int cpu) { return; }
|
||||
void watchdog_nmi_enable_all(void) {}
|
||||
void watchdog_nmi_disable_all(void) {}
|
||||
#endif /* CONFIG_HARDLOCKUP_DETECTOR */
|
||||
|
||||
static struct smp_hotplug_thread watchdog_threads = {
|
||||
@@ -666,62 +649,102 @@ static struct smp_hotplug_thread watchdog_threads = {
|
||||
.unpark = watchdog_enable,
|
||||
};
|
||||
|
||||
static void restart_watchdog_hrtimer(void *info)
|
||||
/*
|
||||
* park all watchdog threads that are specified in 'watchdog_cpumask'
|
||||
*/
|
||||
static int watchdog_park_threads(void)
|
||||
{
|
||||
struct hrtimer *hrtimer = raw_cpu_ptr(&watchdog_hrtimer);
|
||||
int ret;
|
||||
int cpu, ret = 0;
|
||||
|
||||
/*
|
||||
* No need to cancel and restart hrtimer if it is currently executing
|
||||
* because it will reprogram itself with the new period now.
|
||||
* We should never see it unqueued here because we are running per-cpu
|
||||
* with interrupts disabled.
|
||||
*/
|
||||
ret = hrtimer_try_to_cancel(hrtimer);
|
||||
if (ret == 1)
|
||||
hrtimer_start(hrtimer, ns_to_ktime(sample_period),
|
||||
HRTIMER_MODE_REL_PINNED);
|
||||
get_online_cpus();
|
||||
for_each_watchdog_cpu(cpu) {
|
||||
ret = kthread_park(per_cpu(softlockup_watchdog, cpu));
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
if (ret) {
|
||||
for_each_watchdog_cpu(cpu)
|
||||
kthread_unpark(per_cpu(softlockup_watchdog, cpu));
|
||||
}
|
||||
put_online_cpus();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void update_watchdog(int cpu)
|
||||
{
|
||||
/*
|
||||
* Make sure that perf event counter will adopt to a new
|
||||
* sampling period. Updating the sampling period directly would
|
||||
* be much nicer but we do not have an API for that now so
|
||||
* let's use a big hammer.
|
||||
* Hrtimer will adopt the new period on the next tick but this
|
||||
* might be late already so we have to restart the timer as well.
|
||||
*/
|
||||
watchdog_nmi_disable(cpu);
|
||||
smp_call_function_single(cpu, restart_watchdog_hrtimer, NULL, 1);
|
||||
watchdog_nmi_enable(cpu);
|
||||
}
|
||||
|
||||
static void update_watchdog_all_cpus(void)
|
||||
/*
|
||||
* unpark all watchdog threads that are specified in 'watchdog_cpumask'
|
||||
*/
|
||||
static void watchdog_unpark_threads(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
get_online_cpus();
|
||||
for_each_watchdog_cpu(cpu)
|
||||
update_watchdog(cpu);
|
||||
kthread_unpark(per_cpu(softlockup_watchdog, cpu));
|
||||
put_online_cpus();
|
||||
}
|
||||
|
||||
/*
|
||||
* Suspend the hard and soft lockup detector by parking the watchdog threads.
|
||||
*/
|
||||
int lockup_detector_suspend(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
/*
|
||||
* Multiple suspend requests can be active in parallel (counted by
|
||||
* the 'watchdog_suspended' variable). If the watchdog threads are
|
||||
* running, the first caller takes care that they will be parked.
|
||||
* The state of 'watchdog_running' cannot change while a suspend
|
||||
* request is active (see related code in 'proc' handlers).
|
||||
*/
|
||||
if (watchdog_running && !watchdog_suspended)
|
||||
ret = watchdog_park_threads();
|
||||
|
||||
if (ret == 0)
|
||||
watchdog_suspended++;
|
||||
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Resume the hard and soft lockup detector by unparking the watchdog threads.
|
||||
*/
|
||||
void lockup_detector_resume(void)
|
||||
{
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
watchdog_suspended--;
|
||||
/*
|
||||
* The watchdog threads are unparked if they were previously running
|
||||
* and if there is no more active suspend request.
|
||||
*/
|
||||
if (watchdog_running && !watchdog_suspended)
|
||||
watchdog_unpark_threads();
|
||||
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
}
|
||||
|
||||
static void update_watchdog_all_cpus(void)
|
||||
{
|
||||
watchdog_park_threads();
|
||||
watchdog_unpark_threads();
|
||||
}
|
||||
|
||||
static int watchdog_enable_all_cpus(void)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (!watchdog_running) {
|
||||
err = smpboot_register_percpu_thread(&watchdog_threads);
|
||||
err = smpboot_register_percpu_thread_cpumask(&watchdog_threads,
|
||||
&watchdog_cpumask);
|
||||
if (err)
|
||||
pr_err("Failed to create watchdog threads, disabled\n");
|
||||
else {
|
||||
if (smpboot_update_cpumask_percpu_thread(
|
||||
&watchdog_threads, &watchdog_cpumask))
|
||||
pr_err("Failed to set cpumask for watchdog threads\n");
|
||||
else
|
||||
watchdog_running = 1;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Enable/disable the lockup detectors or
|
||||
@@ -787,6 +810,12 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
if (watchdog_suspended) {
|
||||
/* no parameter changes allowed while watchdog is suspended */
|
||||
err = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the parameter is being read return the state of the corresponding
|
||||
* bit(s) in 'watchdog_enabled', else update 'watchdog_enabled' and the
|
||||
@@ -872,6 +901,12 @@ int proc_watchdog_thresh(struct ctl_table *table, int write,
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
if (watchdog_suspended) {
|
||||
/* no parameter changes allowed while watchdog is suspended */
|
||||
err = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
old = ACCESS_ONCE(watchdog_thresh);
|
||||
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
|
||||
@@ -903,6 +938,13 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
|
||||
int err;
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
|
||||
if (watchdog_suspended) {
|
||||
/* no parameter changes allowed while watchdog is suspended */
|
||||
err = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = proc_do_large_bitmap(table, write, buffer, lenp, ppos);
|
||||
if (!err && write) {
|
||||
/* Remove impossible cpus to keep sysctl output cleaner. */
|
||||
@@ -920,6 +962,7 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,
|
||||
pr_err("cpumask update failed\n");
|
||||
}
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
return err;
|
||||
}
|
||||
@@ -932,10 +975,8 @@ void __init lockup_detector_init(void)
|
||||
|
||||
#ifdef CONFIG_NO_HZ_FULL
|
||||
if (tick_nohz_full_enabled()) {
|
||||
if (!cpumask_empty(tick_nohz_full_mask))
|
||||
pr_info("Disabling watchdog on nohz_full cores by default\n");
|
||||
cpumask_andnot(&watchdog_cpumask, cpu_possible_mask,
|
||||
tick_nohz_full_mask);
|
||||
pr_info("Disabling watchdog on nohz_full cores by default\n");
|
||||
cpumask_copy(&watchdog_cpumask, housekeeping_mask);
|
||||
} else
|
||||
cpumask_copy(&watchdog_cpumask, cpu_possible_mask);
|
||||
#else
|
||||
|
Reference in New Issue
Block a user