Merge branch 'akpm' (patches from Andrew Morton)
Merge second patch-bomb from Andrew Morton: - a few hotfixes - drivers/dma updates - MAINTAINERS updates - Quite a lot of lib/ updates - checkpatch updates - binfmt updates - autofs4 - drivers/rtc/ - various small tweaks to less used filesystems - ipc/ updates - kernel/watchdog.c changes * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (135 commits) mm: softdirty: enable write notifications on VMAs after VM_SOFTDIRTY cleared kernel/param: consolidate __{start,stop}___param[] in <linux/moduleparam.h> ia64: remove duplicate declarations of __per_cpu_start[] and __per_cpu_end[] frv: remove unused declarations of __start___ex_table and __stop___ex_table kvm: ensure hard lockup detection is disabled by default kernel/watchdog.c: control hard lockup detection default staging: rtl8192u: use %*pEn to escape buffer staging: rtl8192e: use %*pEn to escape buffer staging: wlan-ng: use %*pEhp to print SN lib80211: remove unused print_ssid() wireless: hostap: proc: print properly escaped SSID wireless: ipw2x00: print SSID via %*pE wireless: libertas: print esaped string via %*pE lib/vsprintf: add %*pE[achnops] format specifier lib / string_helpers: introduce string_escape_mem() lib / string_helpers: refactoring the test suite lib / string_helpers: move documentation to c-file include/linux: remove strict_strto* definitions arch/x86/mm/numa.c: fix boot failure when all nodes are hotpluggable fs: check bh blocknr earlier when searching lru ...
Esse commit está contido em:
@@ -52,11 +52,11 @@ static int kdb_parsebp(int argc, const char **argv, int *nextargp, kdb_bp_t *bp)
|
||||
|
||||
bp->bph_length = 1;
|
||||
if ((argc + 1) != nextarg) {
|
||||
if (strnicmp(argv[nextarg], "datar", sizeof("datar")) == 0)
|
||||
if (strncasecmp(argv[nextarg], "datar", sizeof("datar")) == 0)
|
||||
bp->bp_type = BP_ACCESS_WATCHPOINT;
|
||||
else if (strnicmp(argv[nextarg], "dataw", sizeof("dataw")) == 0)
|
||||
else if (strncasecmp(argv[nextarg], "dataw", sizeof("dataw")) == 0)
|
||||
bp->bp_type = BP_WRITE_WATCHPOINT;
|
||||
else if (strnicmp(argv[nextarg], "inst", sizeof("inst")) == 0)
|
||||
else if (strncasecmp(argv[nextarg], "inst", sizeof("inst")) == 0)
|
||||
bp->bp_type = BP_HARDWARE_BREAKPOINT;
|
||||
else
|
||||
return KDB_ARGCOUNT;
|
||||
|
@@ -565,19 +565,12 @@ static int kallsyms_open(struct inode *inode, struct file *file)
|
||||
* using get_symbol_offset for every symbol.
|
||||
*/
|
||||
struct kallsym_iter *iter;
|
||||
int ret;
|
||||
|
||||
iter = kmalloc(sizeof(*iter), GFP_KERNEL);
|
||||
iter = __seq_open_private(file, &kallsyms_op, sizeof(*iter));
|
||||
if (!iter)
|
||||
return -ENOMEM;
|
||||
reset_iter(iter, 0);
|
||||
|
||||
ret = seq_open(file, &kallsyms_op);
|
||||
if (ret == 0)
|
||||
((struct seq_file *)file->private_data)->private = iter;
|
||||
else
|
||||
kfree(iter);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KGDB_KDB
|
||||
|
@@ -1759,7 +1759,6 @@ static __initdata char *suffix_tbl[] = {
|
||||
*/
|
||||
static int __init parse_crashkernel_suffix(char *cmdline,
|
||||
unsigned long long *crash_size,
|
||||
unsigned long long *crash_base,
|
||||
const char *suffix)
|
||||
{
|
||||
char *cur = cmdline;
|
||||
@@ -1848,7 +1847,7 @@ static int __init __parse_crashkernel(char *cmdline,
|
||||
|
||||
if (suffix)
|
||||
return parse_crashkernel_suffix(ck_cmdline, crash_size,
|
||||
crash_base, suffix);
|
||||
suffix);
|
||||
/*
|
||||
* if the commandline contains a ':', then that's the extended
|
||||
* syntax -- if not, it must be the classic syntax
|
||||
@@ -2016,22 +2015,6 @@ static int __init crash_save_vmcoreinfo_init(void)
|
||||
subsys_initcall(crash_save_vmcoreinfo_init);
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
static int __kexec_add_segment(struct kimage *image, char *buf,
|
||||
unsigned long bufsz, unsigned long mem,
|
||||
unsigned long memsz)
|
||||
{
|
||||
struct kexec_segment *ksegment;
|
||||
|
||||
ksegment = &image->segment[image->nr_segments];
|
||||
ksegment->kbuf = buf;
|
||||
ksegment->bufsz = bufsz;
|
||||
ksegment->mem = mem;
|
||||
ksegment->memsz = memsz;
|
||||
image->nr_segments++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int locate_mem_hole_top_down(unsigned long start, unsigned long end,
|
||||
struct kexec_buf *kbuf)
|
||||
{
|
||||
@@ -2064,8 +2047,7 @@ static int locate_mem_hole_top_down(unsigned long start, unsigned long end,
|
||||
} while (1);
|
||||
|
||||
/* If we are here, we found a suitable memory range */
|
||||
__kexec_add_segment(image, kbuf->buffer, kbuf->bufsz, temp_start,
|
||||
kbuf->memsz);
|
||||
kbuf->mem = temp_start;
|
||||
|
||||
/* Success, stop navigating through remaining System RAM ranges */
|
||||
return 1;
|
||||
@@ -2099,8 +2081,7 @@ static int locate_mem_hole_bottom_up(unsigned long start, unsigned long end,
|
||||
} while (1);
|
||||
|
||||
/* If we are here, we found a suitable memory range */
|
||||
__kexec_add_segment(image, kbuf->buffer, kbuf->bufsz, temp_start,
|
||||
kbuf->memsz);
|
||||
kbuf->mem = temp_start;
|
||||
|
||||
/* Success, stop navigating through remaining System RAM ranges */
|
||||
return 1;
|
||||
@@ -2187,7 +2168,12 @@ int kexec_add_buffer(struct kimage *image, char *buffer, unsigned long bufsz,
|
||||
}
|
||||
|
||||
/* Found a suitable memory range */
|
||||
ksegment = &image->segment[image->nr_segments - 1];
|
||||
ksegment = &image->segment[image->nr_segments];
|
||||
ksegment->kbuf = kbuf->buffer;
|
||||
ksegment->bufsz = kbuf->bufsz;
|
||||
ksegment->mem = kbuf->mem;
|
||||
ksegment->memsz = kbuf->memsz;
|
||||
image->nr_segments++;
|
||||
*load_addr = ksegment->mem;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -513,8 +514,6 @@ EXPORT_SYMBOL(param_ops_string);
|
||||
#define to_module_attr(n) container_of(n, struct module_attribute, attr)
|
||||
#define to_module_kobject(n) container_of(n, struct module_kobject, kobj)
|
||||
|
||||
extern struct kernel_param __start___param[], __stop___param[];
|
||||
|
||||
struct param_attribute
|
||||
{
|
||||
struct module_attribute mattr;
|
||||
@@ -774,7 +773,7 @@ static struct module_kobject * __init locate_module_kobject(const char *name)
|
||||
}
|
||||
|
||||
static void __init kernel_add_sysfs_param(const char *name,
|
||||
struct kernel_param *kparam,
|
||||
const struct kernel_param *kparam,
|
||||
unsigned int name_skip)
|
||||
{
|
||||
struct module_kobject *mk;
|
||||
@@ -809,7 +808,7 @@ static void __init kernel_add_sysfs_param(const char *name,
|
||||
*/
|
||||
static void __init param_sysfs_builtin(void)
|
||||
{
|
||||
struct kernel_param *kp;
|
||||
const struct kernel_param *kp;
|
||||
unsigned int name_len;
|
||||
char modname[MODULE_NAME_LEN];
|
||||
|
||||
|
@@ -267,7 +267,6 @@ static u32 clear_idx;
|
||||
#define LOG_ALIGN __alignof__(struct printk_log)
|
||||
#endif
|
||||
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
|
||||
#define __LOG_CPU_MAX_BUF_LEN (1 << CONFIG_LOG_CPU_MAX_BUF_SHIFT)
|
||||
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
|
||||
static char *log_buf = __log_buf;
|
||||
static u32 log_buf_len = __LOG_BUF_LEN;
|
||||
@@ -852,6 +851,9 @@ static int __init log_buf_len_setup(char *str)
|
||||
}
|
||||
early_param("log_buf_len", log_buf_len_setup);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define __LOG_CPU_MAX_BUF_LEN (1 << CONFIG_LOG_CPU_MAX_BUF_SHIFT)
|
||||
|
||||
static void __init log_buf_add_cpu(void)
|
||||
{
|
||||
unsigned int cpu_extra;
|
||||
@@ -878,6 +880,9 @@ static void __init log_buf_add_cpu(void)
|
||||
|
||||
log_buf_len_update(cpu_extra + __LOG_BUF_LEN);
|
||||
}
|
||||
#else /* !CONFIG_SMP */
|
||||
static inline void log_buf_add_cpu(void) {}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
void __init setup_log_buf(int early)
|
||||
{
|
||||
@@ -1674,12 +1679,7 @@ asmlinkage int vprintk_emit(int facility, int level,
|
||||
* The printf needs to come first; we need the syslog
|
||||
* prefix which might be passed-in as a parameter.
|
||||
*/
|
||||
if (in_sched)
|
||||
text_len = scnprintf(text, sizeof(textbuf),
|
||||
KERN_WARNING "[sched_delayed] ");
|
||||
|
||||
text_len += vscnprintf(text + text_len,
|
||||
sizeof(textbuf) - text_len, fmt, args);
|
||||
text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
|
||||
|
||||
/* mark and strip a trailing newline */
|
||||
if (text_len && text[text_len-1] == '\n') {
|
||||
|
@@ -491,6 +491,42 @@ int __weak page_is_ram(unsigned long pfn)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(page_is_ram);
|
||||
|
||||
/*
|
||||
* Search for a resouce entry that fully contains the specified region.
|
||||
* If found, return 1 if it is RAM, 0 if not.
|
||||
* If not found, or region is not fully contained, return -1
|
||||
*
|
||||
* Used by the ioremap functions to ensure the user is not remapping RAM and is
|
||||
* a vast speed up over walking through the resource table page by page.
|
||||
*/
|
||||
int region_is_ram(resource_size_t start, unsigned long size)
|
||||
{
|
||||
struct resource *p;
|
||||
resource_size_t end = start + size - 1;
|
||||
int flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
const char *name = "System RAM";
|
||||
int ret = -1;
|
||||
|
||||
read_lock(&resource_lock);
|
||||
for (p = iomem_resource.child; p ; p = p->sibling) {
|
||||
if (end < p->start)
|
||||
continue;
|
||||
|
||||
if (p->start <= start && end <= p->end) {
|
||||
/* resource fully contains region */
|
||||
if ((p->flags != flags) || strcmp(p->name, name))
|
||||
ret = 0;
|
||||
else
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
if (p->end < start)
|
||||
break; /* not found */
|
||||
}
|
||||
read_unlock(&resource_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void __weak arch_remove_reservations(struct resource *avail)
|
||||
{
|
||||
}
|
||||
|
@@ -59,6 +59,25 @@ static unsigned long soft_lockup_nmi_warn;
|
||||
static int hardlockup_panic =
|
||||
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE;
|
||||
|
||||
static bool hardlockup_detector_enabled = true;
|
||||
/*
|
||||
* We may not want to enable hard lockup detection by default in all cases,
|
||||
* for example when running the kernel as a guest on a hypervisor. In these
|
||||
* cases this function can be called to disable hard lockup detection. This
|
||||
* function should only be executed once by the boot processor before the
|
||||
* kernel command line parameters are parsed, because otherwise it is not
|
||||
* possible to override this in hardlockup_panic_setup().
|
||||
*/
|
||||
void watchdog_enable_hardlockup_detector(bool val)
|
||||
{
|
||||
hardlockup_detector_enabled = val;
|
||||
}
|
||||
|
||||
bool watchdog_hardlockup_detector_is_enabled(void)
|
||||
{
|
||||
return hardlockup_detector_enabled;
|
||||
}
|
||||
|
||||
static int __init hardlockup_panic_setup(char *str)
|
||||
{
|
||||
if (!strncmp(str, "panic", 5))
|
||||
@@ -67,6 +86,14 @@ static int __init hardlockup_panic_setup(char *str)
|
||||
hardlockup_panic = 0;
|
||||
else if (!strncmp(str, "0", 1))
|
||||
watchdog_user_enabled = 0;
|
||||
else if (!strncmp(str, "1", 1) || !strncmp(str, "2", 1)) {
|
||||
/*
|
||||
* Setting 'nmi_watchdog=1' or 'nmi_watchdog=2' (legacy option)
|
||||
* has the same effect.
|
||||
*/
|
||||
watchdog_user_enabled = 1;
|
||||
watchdog_enable_hardlockup_detector(true);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
__setup("nmi_watchdog=", hardlockup_panic_setup);
|
||||
@@ -465,6 +492,15 @@ static int watchdog_nmi_enable(unsigned int cpu)
|
||||
struct perf_event_attr *wd_attr;
|
||||
struct perf_event *event = per_cpu(watchdog_ev, cpu);
|
||||
|
||||
/*
|
||||
* Some kernels need to default hard lockup detection to
|
||||
* 'disabled', for example a guest on a hypervisor.
|
||||
*/
|
||||
if (!watchdog_hardlockup_detector_is_enabled()) {
|
||||
event = ERR_PTR(-ENOENT);
|
||||
goto handle_err;
|
||||
}
|
||||
|
||||
/* is it already setup and enabled? */
|
||||
if (event && event->state > PERF_EVENT_STATE_OFF)
|
||||
goto out;
|
||||
@@ -479,6 +515,7 @@ static int watchdog_nmi_enable(unsigned int cpu)
|
||||
/* Try to register using hardware perf events */
|
||||
event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback, NULL);
|
||||
|
||||
handle_err:
|
||||
/* save cpu0 error for future comparision */
|
||||
if (cpu == 0 && IS_ERR(event))
|
||||
cpu0_err = PTR_ERR(event);
|
||||
@@ -624,11 +661,13 @@ int proc_dowatchdog(struct ctl_table *table, int write,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
int err, old_thresh, old_enabled;
|
||||
bool old_hardlockup;
|
||||
static DEFINE_MUTEX(watchdog_proc_mutex);
|
||||
|
||||
mutex_lock(&watchdog_proc_mutex);
|
||||
old_thresh = ACCESS_ONCE(watchdog_thresh);
|
||||
old_enabled = ACCESS_ONCE(watchdog_user_enabled);
|
||||
old_hardlockup = watchdog_hardlockup_detector_is_enabled();
|
||||
|
||||
err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
if (err || !write)
|
||||
@@ -640,15 +679,22 @@ int proc_dowatchdog(struct ctl_table *table, int write,
|
||||
* disabled. The 'watchdog_running' variable check in
|
||||
* watchdog_*_all_cpus() function takes care of this.
|
||||
*/
|
||||
if (watchdog_user_enabled && watchdog_thresh)
|
||||
if (watchdog_user_enabled && watchdog_thresh) {
|
||||
/*
|
||||
* Prevent a change in watchdog_thresh accidentally overriding
|
||||
* the enablement of the hardlockup detector.
|
||||
*/
|
||||
if (watchdog_user_enabled != old_enabled)
|
||||
watchdog_enable_hardlockup_detector(true);
|
||||
err = watchdog_enable_all_cpus(old_thresh != watchdog_thresh);
|
||||
else
|
||||
} else
|
||||
watchdog_disable_all_cpus();
|
||||
|
||||
/* Restore old values on failure */
|
||||
if (err) {
|
||||
watchdog_thresh = old_thresh;
|
||||
watchdog_user_enabled = old_enabled;
|
||||
watchdog_enable_hardlockup_detector(old_hardlockup);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&watchdog_proc_mutex);
|
||||
|
Referência em uma nova issue
Block a user