mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 00:51:35 +00:00
Merge branch 'akpm' (Andrew's patch-bomb)
Merge third batch of patches from Andrew Morton: - Some MM stragglers - core SMP library cleanups (on_each_cpu_mask) - Some IPI optimisations - kexec - kdump - IPMI - the radix-tree iterator work - various other misc bits. "That'll do for -rc1. I still have ~10 patches for 3.4, will send those along when they've baked a little more." * emailed from Andrew Morton <akpm@linux-foundation.org>: (35 commits) backlight: fix typo in tosa_lcd.c crc32: add help text for the algorithm select option mm: move hugepage test examples to tools/testing/selftests/vm mm: move slabinfo.c to tools/vm mm: move page-types.c from Documentation to tools/vm selftests/Makefile: make `run_tests' depend on `all' selftests: launch individual selftests from the main Makefile radix-tree: use iterators in find_get_pages* functions radix-tree: rewrite gang lookup using iterator radix-tree: introduce bit-optimized iterator fs/proc/namespaces.c: prevent crash when ns_entries[] is empty nbd: rename the nbd_device variable from lo to nbd pidns: add reboot_pid_ns() to handle the reboot syscall sysctl: use bitmap library functions ipmi: use locks on watchdog timeout set on reboot ipmi: simplify locking ipmi: fix message handling during panics ipmi: use a tasklet for handling received messages ipmi: increase KCS timeouts ipmi: decrease the IPMI message transaction time in interrupt mode ...
This commit is contained in:
commit
532bfc851a
55 changed files with 1225 additions and 768 deletions
|
@ -1358,6 +1358,10 @@ static int __init parse_crashkernel_simple(char *cmdline,
|
|||
|
||||
if (*cur == '@')
|
||||
*crash_base = memparse(cur+1, &cur);
|
||||
else if (*cur != ' ' && *cur != '\0') {
|
||||
pr_warning("crashkernel: unrecognized char\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1461,7 +1465,9 @@ static int __init crash_save_vmcoreinfo_init(void)
|
|||
|
||||
VMCOREINFO_SYMBOL(init_uts_ns);
|
||||
VMCOREINFO_SYMBOL(node_online_map);
|
||||
#ifdef CONFIG_MMU
|
||||
VMCOREINFO_SYMBOL(swapper_pg_dir);
|
||||
#endif
|
||||
VMCOREINFO_SYMBOL(_stext);
|
||||
VMCOREINFO_SYMBOL(vmlist);
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/acct.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#define BITS_PER_PAGE (PAGE_SIZE*8)
|
||||
|
||||
|
@ -183,6 +184,9 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
|
|||
rc = sys_wait4(-1, NULL, __WALL, NULL);
|
||||
} while (rc != -ECHILD);
|
||||
|
||||
if (pid_ns->reboot)
|
||||
current->signal->group_exit_code = pid_ns->reboot;
|
||||
|
||||
acct_exit_ns(pid_ns);
|
||||
return;
|
||||
}
|
||||
|
@ -217,6 +221,35 @@ static struct ctl_table pid_ns_ctl_table[] = {
|
|||
|
||||
static struct ctl_path kern_path[] = { { .procname = "kernel", }, { } };
|
||||
|
||||
int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd)
|
||||
{
|
||||
if (pid_ns == &init_pid_ns)
|
||||
return 0;
|
||||
|
||||
switch (cmd) {
|
||||
case LINUX_REBOOT_CMD_RESTART2:
|
||||
case LINUX_REBOOT_CMD_RESTART:
|
||||
pid_ns->reboot = SIGHUP;
|
||||
break;
|
||||
|
||||
case LINUX_REBOOT_CMD_POWER_OFF:
|
||||
case LINUX_REBOOT_CMD_HALT:
|
||||
pid_ns->reboot = SIGINT;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
force_sig(SIGKILL, pid_ns->child_reaper);
|
||||
read_unlock(&tasklist_lock);
|
||||
|
||||
do_exit(0);
|
||||
|
||||
/* Not reached */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int pid_namespaces_init(void)
|
||||
{
|
||||
pid_ns_cachep = KMEM_CACHE(pid_namespace, SLAB_PANIC);
|
||||
|
|
90
kernel/smp.c
90
kernel/smp.c
|
@ -701,3 +701,93 @@ int on_each_cpu(void (*func) (void *info), void *info, int wait)
|
|||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(on_each_cpu);
|
||||
|
||||
/**
|
||||
* on_each_cpu_mask(): Run a function on processors specified by
|
||||
* cpumask, which may include the local processor.
|
||||
* @mask: The set of cpus to run on (only runs on online subset).
|
||||
* @func: The function to run. This must be fast and non-blocking.
|
||||
* @info: An arbitrary pointer to pass to the function.
|
||||
* @wait: If true, wait (atomically) until function has completed
|
||||
* on other CPUs.
|
||||
*
|
||||
* If @wait is true, then returns once @func has returned.
|
||||
*
|
||||
* You must not call this function with disabled interrupts or
|
||||
* from a hardware interrupt handler or from a bottom half handler.
|
||||
*/
|
||||
void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func,
|
||||
void *info, bool wait)
|
||||
{
|
||||
int cpu = get_cpu();
|
||||
|
||||
smp_call_function_many(mask, func, info, wait);
|
||||
if (cpumask_test_cpu(cpu, mask)) {
|
||||
local_irq_disable();
|
||||
func(info);
|
||||
local_irq_enable();
|
||||
}
|
||||
put_cpu();
|
||||
}
|
||||
EXPORT_SYMBOL(on_each_cpu_mask);
|
||||
|
||||
/*
|
||||
* on_each_cpu_cond(): Call a function on each processor for which
|
||||
* the supplied function cond_func returns true, optionally waiting
|
||||
* for all the required CPUs to finish. This may include the local
|
||||
* processor.
|
||||
* @cond_func: A callback function that is passed a cpu id and
|
||||
* the the info parameter. The function is called
|
||||
* with preemption disabled. The function should
|
||||
* return a blooean value indicating whether to IPI
|
||||
* the specified CPU.
|
||||
* @func: The function to run on all applicable CPUs.
|
||||
* This must be fast and non-blocking.
|
||||
* @info: An arbitrary pointer to pass to both functions.
|
||||
* @wait: If true, wait (atomically) until function has
|
||||
* completed on other CPUs.
|
||||
* @gfp_flags: GFP flags to use when allocating the cpumask
|
||||
* used internally by the function.
|
||||
*
|
||||
* The function might sleep if the GFP flags indicates a non
|
||||
* atomic allocation is allowed.
|
||||
*
|
||||
* Preemption is disabled to protect against CPUs going offline but not online.
|
||||
* CPUs going online during the call will not be seen or sent an IPI.
|
||||
*
|
||||
* You must not call this function with disabled interrupts or
|
||||
* from a hardware interrupt handler or from a bottom half handler.
|
||||
*/
|
||||
void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
|
||||
smp_call_func_t func, void *info, bool wait,
|
||||
gfp_t gfp_flags)
|
||||
{
|
||||
cpumask_var_t cpus;
|
||||
int cpu, ret;
|
||||
|
||||
might_sleep_if(gfp_flags & __GFP_WAIT);
|
||||
|
||||
if (likely(zalloc_cpumask_var(&cpus, (gfp_flags|__GFP_NOWARN)))) {
|
||||
preempt_disable();
|
||||
for_each_online_cpu(cpu)
|
||||
if (cond_func(cpu, info))
|
||||
cpumask_set_cpu(cpu, cpus);
|
||||
on_each_cpu_mask(cpus, func, info, wait);
|
||||
preempt_enable();
|
||||
free_cpumask_var(cpus);
|
||||
} else {
|
||||
/*
|
||||
* No free cpumask, bother. No matter, we'll
|
||||
* just have to IPI them one by one.
|
||||
*/
|
||||
preempt_disable();
|
||||
for_each_online_cpu(cpu)
|
||||
if (cond_func(cpu, info)) {
|
||||
ret = smp_call_function_single(cpu, func,
|
||||
info, wait);
|
||||
WARN_ON_ONCE(!ret);
|
||||
}
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(on_each_cpu_cond);
|
||||
|
|
|
@ -444,6 +444,15 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
|
|||
magic2 != LINUX_REBOOT_MAGIC2C))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* If pid namespaces are enabled and the current task is in a child
|
||||
* pid_namespace, the command is handled by reboot_pid_ns() which will
|
||||
* call do_exit().
|
||||
*/
|
||||
ret = reboot_pid_ns(task_active_pid_ns(current), cmd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Instead of trying to make the power_off code look like
|
||||
* halt when pm_power_off is not set do it the easy way.
|
||||
*/
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/proc_fs.h>
|
||||
|
@ -2395,9 +2396,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|||
}
|
||||
}
|
||||
|
||||
while (val_a <= val_b)
|
||||
set_bit(val_a++, tmp_bitmap);
|
||||
|
||||
bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1);
|
||||
first = 0;
|
||||
proc_skip_char(&kbuf, &left, '\n');
|
||||
}
|
||||
|
@ -2440,8 +2439,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|||
if (*ppos)
|
||||
bitmap_or(bitmap, bitmap, tmp_bitmap, bitmap_len);
|
||||
else
|
||||
memcpy(bitmap, tmp_bitmap,
|
||||
BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long));
|
||||
bitmap_copy(bitmap, tmp_bitmap, bitmap_len);
|
||||
}
|
||||
kfree(tmp_bitmap);
|
||||
*lenp -= left;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue