Merge branch 'akpm' (incoming from Andrew)
Merge third batch of fixes from Andrew Morton: "Most of the rest. I still have two large patchsets against AIO and IPC, but they're a bit stuck behind other trees and I'm about to vanish for six days. - random fixlets - inotify - more of the MM queue - show_stack() cleanups - DMI update - kthread/workqueue things - compat cleanups - epoll udpates - binfmt updates - nilfs2 - hfs - hfsplus - ptrace - kmod - coredump - kexec - rbtree - pids - pidns - pps - semaphore tweaks - some w1 patches - relay updates - core Kconfig changes - sysrq tweaks" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (109 commits) Documentation/sysrq: fix inconstistent help message of sysrq key ethernet/emac/sysrq: fix inconstistent help message of sysrq key sparc/sysrq: fix inconstistent help message of sysrq key powerpc/xmon/sysrq: fix inconstistent help message of sysrq key ARM/etm/sysrq: fix inconstistent help message of sysrq key power/sysrq: fix inconstistent help message of sysrq key kgdb/sysrq: fix inconstistent help message of sysrq key lib/decompress.c: fix initconst notifier-error-inject: fix module names in Kconfig kernel/sys.c: make prctl(PR_SET_MM) generally available UAPI: remove empty Kbuild files menuconfig: print more info for symbol without prompts init/Kconfig: re-order CONFIG_EXPERT options to fix menuconfig display kconfig menu: move Virtualization drivers near other virtualization options Kconfig: consolidate CONFIG_DEBUG_STRICT_USER_COPY_CHECKS relay: use macro PAGE_ALIGN instead of FIX_SIZE kernel/relay.c: move FIX_SIZE macro into relay.c kernel/relay.c: remove unused function argument actor drivers/w1/slaves/w1_ds2760.c: fix the error handling in w1_ds2760_add_slave() drivers/w1/slaves/w1_ds2781.c: fix the error handling in w1_ds2781_add_slave() ...
This commit is contained in:
commit
5f56886521
@ -129,9 +129,9 @@ On all - write a character to /proc/sysrq-trigger. e.g.:
|
|||||||
|
|
||||||
* Okay, so what can I use them for?
|
* Okay, so what can I use them for?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
Well, un'R'aw is very handy when your X server or a svgalib program crashes.
|
Well, unraw(r) is very handy when your X server or a svgalib program crashes.
|
||||||
|
|
||||||
sa'K' (Secure Access Key) is useful when you want to be sure there is no
|
sak(k) (Secure Access Key) is useful when you want to be sure there is no
|
||||||
trojan program running at console which could grab your password
|
trojan program running at console which could grab your password
|
||||||
when you would try to login. It will kill all programs on given console,
|
when you would try to login. It will kill all programs on given console,
|
||||||
thus letting you make sure that the login prompt you see is actually
|
thus letting you make sure that the login prompt you see is actually
|
||||||
@ -143,20 +143,20 @@ IMPORTANT: such. :IMPORTANT
|
|||||||
useful when you want to exit a program that will not let you switch consoles.
|
useful when you want to exit a program that will not let you switch consoles.
|
||||||
(For example, X or a svgalib program.)
|
(For example, X or a svgalib program.)
|
||||||
|
|
||||||
re'B'oot is good when you're unable to shut down. But you should also 'S'ync
|
reboot(b) is good when you're unable to shut down. But you should also
|
||||||
and 'U'mount first.
|
sync(s) and umount(u) first.
|
||||||
|
|
||||||
'C'rash can be used to manually trigger a crashdump when the system is hung.
|
crash(c) can be used to manually trigger a crashdump when the system is hung.
|
||||||
Note that this just triggers a crash if there is no dump mechanism available.
|
Note that this just triggers a crash if there is no dump mechanism available.
|
||||||
|
|
||||||
'S'ync is great when your system is locked up, it allows you to sync your
|
sync(s) is great when your system is locked up, it allows you to sync your
|
||||||
disks and will certainly lessen the chance of data loss and fscking. Note
|
disks and will certainly lessen the chance of data loss and fscking. Note
|
||||||
that the sync hasn't taken place until you see the "OK" and "Done" appear
|
that the sync hasn't taken place until you see the "OK" and "Done" appear
|
||||||
on the screen. (If the kernel is really in strife, you may not ever get the
|
on the screen. (If the kernel is really in strife, you may not ever get the
|
||||||
OK or Done message...)
|
OK or Done message...)
|
||||||
|
|
||||||
'U'mount is basically useful in the same ways as 'S'ync. I generally 'S'ync,
|
umount(u) is basically useful in the same ways as sync(s). I generally sync(s),
|
||||||
'U'mount, then re'B'oot when my system locks. It's saved me many a fsck.
|
umount(u), then reboot(b) when my system locks. It's saved me many a fsck.
|
||||||
Again, the unmount (remount read-only) hasn't taken place until you see the
|
Again, the unmount (remount read-only) hasn't taken place until you see the
|
||||||
"OK" and "Done" message appear on the screen.
|
"OK" and "Done" message appear on the screen.
|
||||||
|
|
||||||
@ -165,11 +165,11 @@ kernel messages you do not want to see. Selecting '0' will prevent all but
|
|||||||
the most urgent kernel messages from reaching your console. (They will
|
the most urgent kernel messages from reaching your console. (They will
|
||||||
still be logged if syslogd/klogd are alive, though.)
|
still be logged if syslogd/klogd are alive, though.)
|
||||||
|
|
||||||
t'E'rm and k'I'll are useful if you have some sort of runaway process you
|
term(e) and kill(i) are useful if you have some sort of runaway process you
|
||||||
are unable to kill any other way, especially if it's spawning other
|
are unable to kill any other way, especially if it's spawning other
|
||||||
processes.
|
processes.
|
||||||
|
|
||||||
"'J'ust thaw it" is useful if your system becomes unresponsive due to a frozen
|
"just thaw it(j)" is useful if your system becomes unresponsive due to a frozen
|
||||||
(probably root) filesystem via the FIFREEZE ioctl.
|
(probably root) filesystem via the FIFREEZE ioctl.
|
||||||
|
|
||||||
* Sometimes SysRq seems to get 'stuck' after using it, what can I do?
|
* Sometimes SysRq seems to get 'stuck' after using it, what can I do?
|
||||||
|
@ -175,6 +175,7 @@ machine_power_off(void)
|
|||||||
void
|
void
|
||||||
show_regs(struct pt_regs *regs)
|
show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
dik_show_regs(regs, NULL);
|
dik_show_regs(regs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,13 +169,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
dik_show_trace(sp);
|
dik_show_trace(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
|
die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
|
||||||
{
|
{
|
||||||
|
@ -220,13 +220,6 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
|
|||||||
show_stacktrace(tsk, NULL);
|
show_stacktrace(tsk, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Expected by Rest of kernel code */
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stacktrace(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
/* Another API expected by schedular, shows up in "ps" as Wait Channel
|
/* Another API expected by schedular, shows up in "ps" as Wait Channel
|
||||||
* Ofcourse just returning schedule( ) would be pointless so unwind until
|
* Ofcourse just returning schedule( ) would be pointless so unwind until
|
||||||
* the function is not in schedular code
|
* the function is not in schedular code
|
||||||
|
@ -71,7 +71,7 @@ void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
pr_info("%s, TGID %u\n", path_nm, tsk->tgid);
|
pr_info("Path: %s\n", path_nm);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(print_task_path_n_nm);
|
EXPORT_SYMBOL(print_task_path_n_nm);
|
||||||
|
|
||||||
@ -163,6 +163,7 @@ void show_regs(struct pt_regs *regs)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
print_task_path_n_nm(tsk, buf);
|
print_task_path_n_nm(tsk, buf);
|
||||||
|
show_regs_print_info(KERN_INFO);
|
||||||
|
|
||||||
if (current->thread.cause_code)
|
if (current->thread.cause_code)
|
||||||
show_ecr_verbose(regs);
|
show_ecr_verbose(regs);
|
||||||
|
@ -254,7 +254,7 @@ static void sysrq_etm_dump(int key)
|
|||||||
|
|
||||||
static struct sysrq_key_op sysrq_etm_op = {
|
static struct sysrq_key_op sysrq_etm_op = {
|
||||||
.handler = sysrq_etm_dump,
|
.handler = sysrq_etm_dump,
|
||||||
.help_msg = "ETM buffer dump",
|
.help_msg = "etm-buffer-dump(v)",
|
||||||
.action_msg = "etm",
|
.action_msg = "etm",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -225,11 +225,8 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
printk("CPU: %d %s (%s %.*s)\n",
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
raw_smp_processor_id(), print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||||
print_symbol("LR is at %s\n", regs->ARM_lr);
|
print_symbol("LR is at %s\n", regs->ARM_lr);
|
||||||
printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n"
|
printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n"
|
||||||
@ -284,7 +281,6 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
printk("\n");
|
printk("\n");
|
||||||
printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm);
|
|
||||||
__show_regs(regs);
|
__show_regs(regs);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
}
|
}
|
||||||
|
@ -204,13 +204,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
dump_backtrace(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
||||||
{
|
{
|
||||||
dump_backtrace(NULL, tsk);
|
dump_backtrace(NULL, tsk);
|
||||||
|
@ -145,11 +145,7 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk("CPU: %d %s (%s %.*s)\n",
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
raw_smp_processor_id(), print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||||
print_symbol("LR is at %s\n", regs->regs[30]);
|
print_symbol("LR is at %s\n", regs->regs[30]);
|
||||||
printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
|
printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
|
||||||
@ -166,7 +162,6 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
printk("\n");
|
printk("\n");
|
||||||
printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm);
|
|
||||||
__show_regs(regs);
|
__show_regs(regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,13 +167,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
dump_backtrace(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
||||||
{
|
{
|
||||||
dump_backtrace(NULL, tsk);
|
dump_backtrace(NULL, tsk);
|
||||||
|
@ -204,14 +204,6 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
|||||||
show_stack_log_lvl(tsk, (unsigned long)stack, NULL, "");
|
show_stack_log_lvl(tsk, (unsigned long)stack, NULL, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_trace_log_lvl(current, &stack, NULL, "");
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static const char *cpu_modes[] = {
|
static const char *cpu_modes[] = {
|
||||||
"Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",
|
"Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",
|
||||||
"Interrupt level 2", "Interrupt level 3", "Exception", "NMI"
|
"Interrupt level 2", "Interrupt level 3", "Exception", "NMI"
|
||||||
@ -223,6 +215,8 @@ void show_regs_log_lvl(struct pt_regs *regs, const char *log_lvl)
|
|||||||
unsigned long lr = regs->lr;
|
unsigned long lr = regs->lr;
|
||||||
unsigned long mode = (regs->sr & MODE_MASK) >> MODE_SHIFT;
|
unsigned long mode = (regs->sr & MODE_MASK) >> MODE_SHIFT;
|
||||||
|
|
||||||
|
show_regs_print_info(log_lvl);
|
||||||
|
|
||||||
if (!user_mode(regs)) {
|
if (!user_mode(regs)) {
|
||||||
sp = (unsigned long)regs + FRAME_SIZE_FULL;
|
sp = (unsigned long)regs + FRAME_SIZE_FULL;
|
||||||
|
|
||||||
@ -260,9 +254,6 @@ void show_regs_log_lvl(struct pt_regs *regs, const char *log_lvl)
|
|||||||
regs->sr & SR_I0M ? '0' : '.',
|
regs->sr & SR_I0M ? '0' : '.',
|
||||||
regs->sr & SR_GM ? 'G' : 'g');
|
regs->sr & SR_GM ? 'G' : 'g');
|
||||||
printk("%sCPU Mode: %s\n", log_lvl, cpu_modes[mode]);
|
printk("%sCPU Mode: %s\n", log_lvl, cpu_modes[mode]);
|
||||||
printk("%sProcess: %s [%d] (task: %p thread: %p)\n",
|
|
||||||
log_lvl, current->comm, current->pid, current,
|
|
||||||
task_thread_info(current));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
|
@ -168,6 +168,7 @@ void dump_stack(void)
|
|||||||
#endif
|
#endif
|
||||||
trace_buffer_save(tflags);
|
trace_buffer_save(tflags);
|
||||||
dump_bfin_trace_buffer();
|
dump_bfin_trace_buffer();
|
||||||
|
dump_stack_print_info(KERN_DEFAULT);
|
||||||
show_stack(current, &stack);
|
show_stack(current, &stack);
|
||||||
trace_buffer_restore(tflags);
|
trace_buffer_restore(tflags);
|
||||||
}
|
}
|
||||||
|
@ -853,6 +853,8 @@ void show_regs(struct pt_regs *fp)
|
|||||||
unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
|
unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
|
||||||
|
|
||||||
pr_notice("\n");
|
pr_notice("\n");
|
||||||
|
show_regs_print_info(KERN_NOTICE);
|
||||||
|
|
||||||
if (CPUID != bfin_cpuid())
|
if (CPUID != bfin_cpuid())
|
||||||
pr_notice("Compiled for cpu family 0x%04x (Rev %d), "
|
pr_notice("Compiled for cpu family 0x%04x (Rev %d), "
|
||||||
"but running on:0x%04x (Rev %d)\n",
|
"but running on:0x%04x (Rev %d)\n",
|
||||||
|
@ -31,6 +31,7 @@ void __init trap_init(void)
|
|||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
pr_err("\n");
|
pr_err("\n");
|
||||||
|
show_regs_print_info(KERN_ERR);
|
||||||
pr_err("PC: %08lx SP: %08lx\n", regs->pc, regs->sp);
|
pr_err("PC: %08lx SP: %08lx\n", regs->pc, regs->sp);
|
||||||
pr_err("Status: %08lx ORIG_A4: %08lx\n", regs->csr, regs->orig_a4);
|
pr_err("Status: %08lx ORIG_A4: %08lx\n", regs->csr, regs->orig_a4);
|
||||||
pr_err("A0: %08lx B0: %08lx\n", regs->a0, regs->b0);
|
pr_err("A0: %08lx B0: %08lx\n", regs->a0, regs->b0);
|
||||||
@ -67,15 +68,6 @@ void show_regs(struct pt_regs *regs)
|
|||||||
pr_err("A31: %08lx B31: %08lx\n", regs->a31, regs->b31);
|
pr_err("A31: %08lx B31: %08lx\n", regs->a31, regs->b31);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_stack(current, &stack);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
|
|
||||||
void die(char *str, struct pt_regs *fp, int nr)
|
void die(char *str, struct pt_regs *fp, int nr)
|
||||||
{
|
{
|
||||||
console_verbose();
|
console_verbose();
|
||||||
|
@ -176,6 +176,9 @@ unsigned long get_wchan(struct task_struct *p)
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
unsigned long usp = rdusp();
|
unsigned long usp = rdusp();
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx\n",
|
printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx\n",
|
||||||
regs->irp, regs->srp, regs->dccr, usp, regs->mof );
|
regs->irp, regs->srp, regs->dccr, usp, regs->mof );
|
||||||
printk(" r0: %08lx r1: %08lx r2: %08lx r3: %08lx\n",
|
printk(" r0: %08lx r1: %08lx r2: %08lx r3: %08lx\n",
|
||||||
|
@ -164,6 +164,9 @@ get_wchan(struct task_struct *p)
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
unsigned long usp = rdusp();
|
unsigned long usp = rdusp();
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("ERP: %08lx SRP: %08lx CCS: %08lx USP: %08lx MOF: %08lx\n",
|
printk("ERP: %08lx SRP: %08lx CCS: %08lx USP: %08lx MOF: %08lx\n",
|
||||||
regs->erp, regs->srp, regs->ccs, usp, regs->mof);
|
regs->erp, regs->srp, regs->ccs, usp, regs->mof);
|
||||||
|
|
||||||
|
@ -146,13 +146,6 @@ show_stack(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
|
||||||
dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
set_nmi_handler(void (*handler)(struct pt_regs *))
|
set_nmi_handler(void (*handler)(struct pt_regs *))
|
||||||
{
|
{
|
||||||
|
@ -466,17 +466,6 @@ asmlinkage void compound_exception(unsigned long esfr1,
|
|||||||
BUG();
|
BUG();
|
||||||
} /* end compound_exception() */
|
} /* end compound_exception() */
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*
|
|
||||||
* The architecture-independent backtrace generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void show_stack(struct task_struct *task, unsigned long *sp)
|
void show_stack(struct task_struct *task, unsigned long *sp)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -508,6 +497,7 @@ void show_regs(struct pt_regs *regs)
|
|||||||
int loop;
|
int loop;
|
||||||
|
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("Frame: @%08lx [%s]\n",
|
printk("Frame: @%08lx [%s]\n",
|
||||||
(unsigned long) regs,
|
(unsigned long) regs,
|
||||||
@ -522,8 +512,6 @@ void show_regs(struct pt_regs *regs)
|
|||||||
else
|
else
|
||||||
printk(" | ");
|
printk(" | ");
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("Process %s (pid: %d)\n", current->comm, current->pid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void die_if_kernel(const char *str, ...)
|
void die_if_kernel(const char *str, ...)
|
||||||
|
@ -83,6 +83,8 @@ void machine_power_off(void)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("\nPC: %08lx Status: %02x",
|
printk("\nPC: %08lx Status: %02x",
|
||||||
regs->pc, regs->ccr);
|
regs->pc, regs->ccr);
|
||||||
printk("\nORIG_ER0: %08lx ER0: %08lx ER1: %08lx",
|
printk("\nORIG_ER0: %08lx ER0: %08lx ER1: %08lx",
|
||||||
|
@ -164,10 +164,3 @@ void show_trace_task(struct task_struct *tsk)
|
|||||||
{
|
{
|
||||||
show_stack(tsk,(unsigned long *)tsk->thread.esp0);
|
show_stack(tsk,(unsigned long *)tsk->thread.esp0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL,NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
@ -191,14 +191,6 @@ void show_stack(struct task_struct *task, unsigned long *fp)
|
|||||||
do_show_stack(task, fp, 0);
|
do_show_stack(task, fp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long *fp;
|
|
||||||
asm("%0 = r30" : "=r" (fp));
|
|
||||||
show_stack(current, fp);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
int die(const char *str, struct pt_regs *regs, long err)
|
int die(const char *str, struct pt_regs *regs, long err)
|
||||||
{
|
{
|
||||||
static struct {
|
static struct {
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
*/
|
*/
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_EMERG);
|
||||||
|
|
||||||
printk(KERN_EMERG "restart_r0: \t0x%08lx syscall_nr: %ld\n",
|
printk(KERN_EMERG "restart_r0: \t0x%08lx syscall_nr: %ld\n",
|
||||||
regs->restart_r0, regs->syscall_nr);
|
regs->restart_r0, regs->syscall_nr);
|
||||||
printk(KERN_EMERG "preds: \t\t0x%08lx\n", regs->preds);
|
printk(KERN_EMERG "preds: \t\t0x%08lx\n", regs->preds);
|
||||||
|
@ -95,22 +95,14 @@ show_stack (struct task_struct *task, unsigned long *sp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
dump_stack (void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
show_regs (struct pt_regs *regs)
|
show_regs (struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
|
unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
|
||||||
|
|
||||||
print_modules();
|
print_modules();
|
||||||
printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current),
|
printk("\n");
|
||||||
smp_processor_id(), current->comm);
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
|
printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
|
||||||
regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
|
regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
|
||||||
init_utsname()->release);
|
init_utsname()->release);
|
||||||
|
@ -1063,6 +1063,7 @@ check_bugs (void)
|
|||||||
static int __init run_dmi_scan(void)
|
static int __init run_dmi_scan(void)
|
||||||
{
|
{
|
||||||
dmi_scan_machine();
|
dmi_scan_machine();
|
||||||
|
dmi_set_dump_stack_arch_desc();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
core_initcall(run_dmi_scan);
|
core_initcall(run_dmi_scan);
|
||||||
|
@ -73,6 +73,8 @@ void machine_power_off(void)
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("BPC[%08lx]:PSW[%08lx]:LR [%08lx]:FP [%08lx]\n", \
|
printk("BPC[%08lx]:PSW[%08lx]:LR [%08lx]:FP [%08lx]\n", \
|
||||||
regs->bpc, regs->psw, regs->lr, regs->fp);
|
regs->bpc, regs->psw, regs->lr, regs->fp);
|
||||||
printk("BBPC[%08lx]:BBPSW[%08lx]:SPU[%08lx]:SPI[%08lx]\n", \
|
printk("BBPC[%08lx]:BBPSW[%08lx]:SPU[%08lx]:SPI[%08lx]\n", \
|
||||||
|
@ -167,15 +167,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
show_trace(task, sp);
|
show_trace(task, sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_trace(current, &stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static void show_registers(struct pt_regs *regs)
|
static void show_registers(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -991,18 +991,6 @@ void show_stack(struct task_struct *task, unsigned long *stack)
|
|||||||
show_trace(stack);
|
show_trace(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent backtrace generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_trace(&stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The vector number returned in the frame pointer may also contain
|
* The vector number returned in the frame pointer may also contain
|
||||||
* the "fs" (Fault Status) bits on ColdFire. These are in the bottom
|
* the "fs" (Fault Status) bits on ColdFire. These are in the bottom
|
||||||
|
@ -129,6 +129,8 @@ void show_regs(struct pt_regs *regs)
|
|||||||
"D1.7 "
|
"D1.7 "
|
||||||
};
|
};
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_INFO);
|
||||||
|
|
||||||
pr_info(" pt_regs @ %p\n", regs);
|
pr_info(" pt_regs @ %p\n", regs);
|
||||||
pr_info(" SaveMask = 0x%04hx\n", regs->ctx.SaveMask);
|
pr_info(" SaveMask = 0x%04hx\n", regs->ctx.SaveMask);
|
||||||
pr_info(" Flags = 0x%04hx (%c%c%c%c)\n", regs->ctx.Flags,
|
pr_info(" Flags = 0x%04hx (%c%c%c%c)\n", regs->ctx.Flags,
|
||||||
|
@ -987,9 +987,3 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
|
|||||||
|
|
||||||
show_trace(tsk, sp, NULL);
|
show_trace(tsk, sp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_INFO);
|
||||||
|
|
||||||
pr_info(" Registers dump: mode=%X\r\n", regs->pt_mode);
|
pr_info(" Registers dump: mode=%X\r\n", regs->pt_mode);
|
||||||
pr_info(" r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n",
|
pr_info(" r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n",
|
||||||
regs->r1, regs->r2, regs->r3, regs->r4);
|
regs->r1, regs->r2, regs->r3, regs->r4);
|
||||||
|
@ -75,9 +75,3 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
|
|
||||||
debug_show_held_locks(task);
|
debug_show_held_locks(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
@ -206,19 +206,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
show_stacktrace(task, ®s);
|
show_stacktrace(task, ®s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent dump_stack generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
struct pt_regs regs;
|
|
||||||
|
|
||||||
prepare_frametrace(®s);
|
|
||||||
show_backtrace(current, ®s);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static void show_code(unsigned int __user *pc)
|
static void show_code(unsigned int __user *pc)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
@ -244,7 +231,7 @@ static void __show_regs(const struct pt_regs *regs)
|
|||||||
unsigned int cause = regs->cp0_cause;
|
unsigned int cause = regs->cp0_cause;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk("Cpu %d\n", smp_processor_id());
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Saved main processor registers
|
* Saved main processor registers
|
||||||
|
@ -97,6 +97,7 @@ void machine_power_off(void)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -293,17 +293,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
show_trace(sp);
|
show_trace(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* the architecture-independent dump_stack generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_stack(current, &stack);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dump the register file in the specified exception frame
|
* dump the register file in the specified exception frame
|
||||||
*/
|
*/
|
||||||
|
@ -90,6 +90,7 @@ void show_regs(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
extern void show_registers(struct pt_regs *regs);
|
extern void show_registers(struct pt_regs *regs);
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
/* __PHX__ cleanup this mess */
|
/* __PHX__ cleanup this mess */
|
||||||
show_registers(regs);
|
show_registers(regs);
|
||||||
}
|
}
|
||||||
|
@ -105,17 +105,6 @@ void show_trace_task(struct task_struct *tsk)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent backtrace generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_stack(current, &stack);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void show_registers(struct pt_regs *regs)
|
void show_registers(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
config PARISC
|
config PARISC
|
||||||
def_bool y
|
def_bool y
|
||||||
|
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select HAVE_OPROFILE
|
select HAVE_OPROFILE
|
||||||
select HAVE_FUNCTION_TRACER if 64BIT
|
select HAVE_FUNCTION_TRACER if 64BIT
|
||||||
|
@ -12,18 +12,4 @@ config DEBUG_RODATA
|
|||||||
portion of the kernel code won't be covered by a TLB anymore.
|
portion of the kernel code won't be covered by a TLB anymore.
|
||||||
If in doubt, say "N".
|
If in doubt, say "N".
|
||||||
|
|
||||||
config DEBUG_STRICT_USER_COPY_CHECKS
|
|
||||||
bool "Strict copy size checks"
|
|
||||||
depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
|
|
||||||
---help---
|
|
||||||
Enabling this option turns a certain set of sanity checks for user
|
|
||||||
copy operations into compile time failures.
|
|
||||||
|
|
||||||
The copy_from_user() etc checks are there to help test if there
|
|
||||||
are sufficient security checks on the length argument of
|
|
||||||
the copy operation, by having gcc prove that the argument is
|
|
||||||
within bounds.
|
|
||||||
|
|
||||||
If unsure, or if you run an older (pre 4.4) gcc, say N.
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -126,6 +126,8 @@ void show_regs(struct pt_regs *regs)
|
|||||||
user = user_mode(regs);
|
user = user_mode(regs);
|
||||||
level = user ? KERN_DEBUG : KERN_CRIT;
|
level = user ? KERN_DEBUG : KERN_CRIT;
|
||||||
|
|
||||||
|
show_regs_print_info(level);
|
||||||
|
|
||||||
print_gr(level, regs);
|
print_gr(level, regs);
|
||||||
|
|
||||||
for (i = 0; i < 8; i += 4)
|
for (i = 0; i < 8; i += 4)
|
||||||
@ -158,14 +160,6 @@ void show_regs(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static void do_show_stack(struct unwind_frame_info *info)
|
static void do_show_stack(struct unwind_frame_info *info)
|
||||||
{
|
{
|
||||||
int i = 1;
|
int i = 1;
|
||||||
|
@ -831,6 +831,8 @@ void show_regs(struct pt_regs * regs)
|
|||||||
{
|
{
|
||||||
int i, trap;
|
int i, trap;
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("NIP: "REG" LR: "REG" CTR: "REG"\n",
|
printk("NIP: "REG" LR: "REG" CTR: "REG"\n",
|
||||||
regs->nip, regs->link, regs->ctr);
|
regs->nip, regs->link, regs->ctr);
|
||||||
printk("REGS: %p TRAP: %04lx %s (%s)\n",
|
printk("REGS: %p TRAP: %04lx %s (%s)\n",
|
||||||
@ -850,12 +852,6 @@ void show_regs(struct pt_regs * regs)
|
|||||||
#else
|
#else
|
||||||
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
||||||
#endif
|
#endif
|
||||||
printk("TASK = %p[%d] '%s' THREAD: %p",
|
|
||||||
current, task_pid_nr(current), current->comm, task_thread_info(current));
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
printk(" CPU: %d", raw_smp_processor_id());
|
|
||||||
#endif /* CONFIG_SMP */
|
|
||||||
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
if ((i % REGS_PER_LINE) == 0)
|
if ((i % REGS_PER_LINE) == 0)
|
||||||
@ -1362,12 +1358,6 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
|
|||||||
} while (count++ < kstack_depth_to_print);
|
} while (count++ < kstack_depth_to_print);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(current, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
/* Called with hard IRQs off */
|
/* Called with hard IRQs off */
|
||||||
void __ppc64_runlatch_on(void)
|
void __ppc64_runlatch_on(void)
|
||||||
|
@ -2947,7 +2947,7 @@ static void sysrq_handle_xmon(int key)
|
|||||||
|
|
||||||
static struct sysrq_key_op sysrq_xmon_op = {
|
static struct sysrq_key_op sysrq_xmon_op = {
|
||||||
.handler = sysrq_handle_xmon,
|
.handler = sysrq_handle_xmon,
|
||||||
.help_msg = "Xmon",
|
.help_msg = "xmon(x)",
|
||||||
.action_msg = "Entering xmon",
|
.action_msg = "Entering xmon",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ config S390
|
|||||||
select ARCH_INLINE_WRITE_UNLOCK_BH
|
select ARCH_INLINE_WRITE_UNLOCK_BH
|
||||||
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||||
|
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
select ARCH_SAVE_PAGE_KEYS if HIBERNATION
|
select ARCH_SAVE_PAGE_KEYS if HIBERNATION
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
select BUILDTIME_EXTABLE_SORT
|
select BUILDTIME_EXTABLE_SORT
|
||||||
|
@ -17,20 +17,6 @@ config STRICT_DEVMEM
|
|||||||
|
|
||||||
If you are unsure, say Y.
|
If you are unsure, say Y.
|
||||||
|
|
||||||
config DEBUG_STRICT_USER_COPY_CHECKS
|
|
||||||
def_bool n
|
|
||||||
prompt "Strict user copy size checks"
|
|
||||||
---help---
|
|
||||||
Enabling this option turns a certain set of sanity checks for user
|
|
||||||
copy operations into compile time warnings.
|
|
||||||
|
|
||||||
The copy_from_user() etc checks are there to help test if there
|
|
||||||
are sufficient security checks on the length argument of
|
|
||||||
the copy operation, by having gcc prove that the argument is
|
|
||||||
within bounds.
|
|
||||||
|
|
||||||
If unsure, or if you run an older (pre 4.4) gcc, say N.
|
|
||||||
|
|
||||||
config S390_PTDUMP
|
config S390_PTDUMP
|
||||||
bool "Export kernel pagetable layout to userspace via debugfs"
|
bool "Export kernel pagetable layout to userspace via debugfs"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
@ -129,23 +129,6 @@ static void show_last_breaking_event(struct pt_regs *regs)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent dump_stack generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
printk("CPU: %d %s %s %.*s\n",
|
|
||||||
task_thread_info(current)->cpu, print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
printk("Process %s (pid: %d, task: %p, ksp: %p)\n",
|
|
||||||
current->comm, current->pid, current,
|
|
||||||
(void *) current->thread.ksp);
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static inline int mask_bits(struct pt_regs *regs, unsigned long bits)
|
static inline int mask_bits(struct pt_regs *regs, unsigned long bits)
|
||||||
{
|
{
|
||||||
return (regs->psw.mask & bits) / ((~bits + 1) & bits);
|
return (regs->psw.mask & bits) / ((~bits + 1) & bits);
|
||||||
@ -183,14 +166,7 @@ void show_registers(struct pt_regs *regs)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
printk("CPU: %d %s %s %.*s\n",
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
task_thread_info(current)->cpu, print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
printk("Process %s (pid: %d, task: %p, ksp: %p)\n",
|
|
||||||
current->comm, current->pid, current,
|
|
||||||
(void *) current->thread.ksp);
|
|
||||||
show_registers(regs);
|
show_registers(regs);
|
||||||
/* Show stack backtrace if pt_regs is from kernel mode */
|
/* Show stack backtrace if pt_regs is from kernel mode */
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
lib-y += delay.o string.o uaccess_std.o uaccess_pt.o
|
lib-y += delay.o string.o uaccess_std.o uaccess_pt.o
|
||||||
obj-y += usercopy.o
|
|
||||||
obj-$(CONFIG_32BIT) += div64.o qrnnd.o ucmpdi2.o mem32.o
|
obj-$(CONFIG_32BIT) += div64.o qrnnd.o ucmpdi2.o mem32.o
|
||||||
obj-$(CONFIG_64BIT) += mem64.o
|
obj-$(CONFIG_64BIT) += mem64.o
|
||||||
lib-$(CONFIG_64BIT) += uaccess_mvcos.o
|
lib-$(CONFIG_64BIT) += uaccess_mvcos.o
|
||||||
|
@ -117,6 +117,8 @@ static void show_code(unsigned int *pc)
|
|||||||
*/
|
*/
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("r0 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
|
printk("r0 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
|
||||||
regs->regs[0], regs->regs[1], regs->regs[2], regs->regs[3],
|
regs->regs[0], regs->regs[1], regs->regs[2], regs->regs[3],
|
||||||
regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]);
|
regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]);
|
||||||
@ -149,16 +151,6 @@ static void show_registers(struct pt_regs *regs)
|
|||||||
printk(KERN_NOTICE "\n");
|
printk(KERN_NOTICE "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent dump_stack generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(current_thread_info()->task,
|
|
||||||
(long *) get_irq_regs()->regs[0]);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void __die(const char *str, struct pt_regs *regs, const char *file,
|
void __die(const char *str, struct pt_regs *regs, const char *file,
|
||||||
const char *func, unsigned long line)
|
const char *func, unsigned long line)
|
||||||
{
|
{
|
||||||
|
@ -158,9 +158,3 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
|
|||||||
(unsigned long)task_stack_page(tsk));
|
(unsigned long)task_stack_page(tsk));
|
||||||
show_trace(tsk, sp, NULL);
|
show_trace(tsk, sp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
@ -32,11 +32,7 @@
|
|||||||
void show_regs(struct pt_regs * regs)
|
void show_regs(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
printk("\n");
|
printk("\n");
|
||||||
printk("Pid : %d, Comm: \t\t%s\n", task_pid_nr(current), current->comm);
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
printk("CPU : %d \t\t%s (%s %.*s)\n\n",
|
|
||||||
smp_processor_id(), print_tainted(), init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
|
|
||||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||||
print_symbol("PR is at %s\n", regs->pr);
|
print_symbol("PR is at %s\n", regs->pr);
|
||||||
|
@ -40,6 +40,7 @@ void show_regs(struct pt_regs *regs)
|
|||||||
unsigned long long ah, al, bh, bl, ch, cl;
|
unsigned long long ah, al, bh, bl, ch, cl;
|
||||||
|
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
ah = (regs->pc) >> 32;
|
ah = (regs->pc) >> 32;
|
||||||
al = (regs->pc) & 0xffffffff;
|
al = (regs->pc) & 0xffffffff;
|
||||||
|
@ -112,6 +112,8 @@ void show_regs(struct pt_regs *r)
|
|||||||
{
|
{
|
||||||
struct reg_window32 *rw = (struct reg_window32 *) r->u_regs[14];
|
struct reg_window32 *rw = (struct reg_window32 *) r->u_regs[14];
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("PSR: %08lx PC: %08lx NPC: %08lx Y: %08lx %s\n",
|
printk("PSR: %08lx PC: %08lx NPC: %08lx Y: %08lx %s\n",
|
||||||
r->psr, r->pc, r->npc, r->y, print_tainted());
|
r->psr, r->pc, r->npc, r->y, print_tainted());
|
||||||
printk("PC: <%pS>\n", (void *) r->pc);
|
printk("PC: <%pS>\n", (void *) r->pc);
|
||||||
@ -142,11 +144,13 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
|||||||
struct reg_window32 *rw;
|
struct reg_window32 *rw;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
if (tsk != NULL)
|
if (!tsk)
|
||||||
task_base = (unsigned long) task_stack_page(tsk);
|
tsk = current;
|
||||||
else
|
|
||||||
task_base = (unsigned long) current_thread_info();
|
|
||||||
|
|
||||||
|
if (tsk == current && !_ksp)
|
||||||
|
__asm__ __volatile__("mov %%fp, %0" : "=r" (_ksp));
|
||||||
|
|
||||||
|
task_base = (unsigned long) task_stack_page(tsk);
|
||||||
fp = (unsigned long) _ksp;
|
fp = (unsigned long) _ksp;
|
||||||
do {
|
do {
|
||||||
/* Bogus frame pointer? */
|
/* Bogus frame pointer? */
|
||||||
@ -162,17 +166,6 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
|||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long *ksp;
|
|
||||||
|
|
||||||
__asm__ __volatile__("mov %%fp, %0"
|
|
||||||
: "=r" (ksp));
|
|
||||||
show_stack(current, ksp);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: sparc64 has a pretty intricated thread_saved_pc, check it out.
|
* Note: sparc64 has a pretty intricated thread_saved_pc, check it out.
|
||||||
*/
|
*/
|
||||||
|
@ -163,6 +163,8 @@ static void show_regwindow(struct pt_regs *regs)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x %s\n", regs->tstate,
|
printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x %s\n", regs->tstate,
|
||||||
regs->tpc, regs->tnpc, regs->y, print_tainted());
|
regs->tpc, regs->tnpc, regs->y, print_tainted());
|
||||||
printk("TPC: <%pS>\n", (void *) regs->tpc);
|
printk("TPC: <%pS>\n", (void *) regs->tpc);
|
||||||
@ -292,7 +294,7 @@ static void sysrq_handle_globreg(int key)
|
|||||||
|
|
||||||
static struct sysrq_key_op sparc_globalreg_op = {
|
static struct sysrq_key_op sparc_globalreg_op = {
|
||||||
.handler = sysrq_handle_globreg,
|
.handler = sysrq_handle_globreg,
|
||||||
.help_msg = "global-regs(Y)",
|
.help_msg = "global-regs(y)",
|
||||||
.action_msg = "Show Global CPU Regs",
|
.action_msg = "Show Global CPU Regs",
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -362,7 +364,7 @@ static void sysrq_handle_globpmu(int key)
|
|||||||
|
|
||||||
static struct sysrq_key_op sparc_globalpmu_op = {
|
static struct sysrq_key_op sparc_globalpmu_op = {
|
||||||
.handler = sysrq_handle_globpmu,
|
.handler = sysrq_handle_globpmu,
|
||||||
.help_msg = "global-pmu(X)",
|
.help_msg = "global-pmu(x)",
|
||||||
.action_msg = "Show Global PMU Regs",
|
.action_msg = "Show Global PMU Regs",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2350,13 +2350,6 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
|||||||
} while (++count < 16);
|
} while (++count < 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(current, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
|
static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
|
||||||
{
|
{
|
||||||
unsigned long fp = rw->ins[6];
|
unsigned long fp = rw->ins[6];
|
||||||
|
@ -45,4 +45,3 @@ obj-y += iomap.o
|
|||||||
obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o
|
obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o
|
||||||
obj-y += ksyms.o
|
obj-y += ksyms.o
|
||||||
obj-$(CONFIG_SPARC64) += PeeCeeI.o
|
obj-$(CONFIG_SPARC64) += PeeCeeI.o
|
||||||
obj-y += usercopy.o
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
#include <linux/module.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/bug.h>
|
|
||||||
|
|
||||||
void copy_from_user_overflow(void)
|
|
||||||
{
|
|
||||||
WARN(1, "Buffer overflow detected!\n");
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(copy_from_user_overflow);
|
|
@ -19,6 +19,7 @@ config TILE
|
|||||||
select HAVE_SYSCALL_WRAPPERS if TILEGX
|
select HAVE_SYSCALL_WRAPPERS if TILEGX
|
||||||
select VIRT_TO_BUS
|
select VIRT_TO_BUS
|
||||||
select SYS_HYPERVISOR
|
select SYS_HYPERVISOR
|
||||||
|
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
@ -114,13 +115,6 @@ config STRICT_DEVMEM
|
|||||||
config SMP
|
config SMP
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
# Allow checking for compile-time determined overflow errors in
|
|
||||||
# copy_from_user(). There are still unprovable places in the
|
|
||||||
# generic code as of 2.6.34, so this option is not really compatible
|
|
||||||
# with -Werror, which is more useful in general.
|
|
||||||
config DEBUG_COPY_FROM_USER
|
|
||||||
def_bool n
|
|
||||||
|
|
||||||
config HVC_TILE
|
config HVC_TILE
|
||||||
depends on TTY
|
depends on TTY
|
||||||
select HVC_DRIVER
|
select HVC_DRIVER
|
||||||
|
@ -395,7 +395,12 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_COPY_FROM_USER
|
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
|
/*
|
||||||
|
* There are still unprovable places in the generic code as of 2.6.34, so this
|
||||||
|
* option is not really compatible with -Werror, which is more useful in
|
||||||
|
* general.
|
||||||
|
*/
|
||||||
extern void copy_from_user_overflow(void)
|
extern void copy_from_user_overflow(void)
|
||||||
__compiletime_warning("copy_from_user() size is not provably correct");
|
__compiletime_warning("copy_from_user() size is not provably correct");
|
||||||
|
|
||||||
|
@ -573,8 +573,7 @@ void show_regs(struct pt_regs *regs)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
pr_err("\n");
|
pr_err("\n");
|
||||||
pr_err(" Pid: %d, comm: %20s, CPU: %d\n",
|
show_regs_print_info(KERN_ERR);
|
||||||
tsk->pid, tsk->comm, smp_processor_id());
|
|
||||||
#ifdef __tilegx__
|
#ifdef __tilegx__
|
||||||
for (i = 0; i < 51; i += 3)
|
for (i = 0; i < 51; i += 3)
|
||||||
pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT" r%-2d: "REGFMT"\n",
|
pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT" r%-2d: "REGFMT"\n",
|
||||||
|
@ -22,11 +22,3 @@ int __range_ok(unsigned long addr, unsigned long size)
|
|||||||
is_arch_mappable_range(addr, size));
|
is_arch_mappable_range(addr, size));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__range_ok);
|
EXPORT_SYMBOL(__range_ok);
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_COPY_FROM_USER
|
|
||||||
void copy_from_user_overflow(void)
|
|
||||||
{
|
|
||||||
WARN(1, "Buffer overflow detected!\n");
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(copy_from_user_overflow);
|
|
||||||
#endif
|
|
||||||
|
@ -35,18 +35,6 @@ void show_trace(struct task_struct *task, unsigned long * stack)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* stack dumps generator - this is used by arch-independent code.
|
|
||||||
* And this is identical to i386 currently.
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long stack;
|
|
||||||
|
|
||||||
show_trace(current, &stack);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
/*Stolen from arch/i386/kernel/traps.c */
|
/*Stolen from arch/i386/kernel/traps.c */
|
||||||
static const int kstack_depth_to_print = 24;
|
static const int kstack_depth_to_print = 24;
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
void show_regs(struct pt_regs_subarch *regs)
|
void show_regs(struct pt_regs_subarch *regs)
|
||||||
{
|
{
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
printk("show_regs(): insert regs here.\n");
|
printk("show_regs(): insert regs here.\n");
|
||||||
#if 0
|
#if 0
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
@ -144,11 +144,7 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
printk(KERN_DEFAULT "CPU: %d %s (%s %.*s)\n",
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
raw_smp_processor_id(), print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version);
|
|
||||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||||
print_symbol("LR is at %s\n", regs->UCreg_lr);
|
print_symbol("LR is at %s\n", regs->UCreg_lr);
|
||||||
printk(KERN_DEFAULT "pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n"
|
printk(KERN_DEFAULT "pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n"
|
||||||
|
@ -170,12 +170,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
|||||||
c_backtrace(fp, mode);
|
c_backtrace(fp, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
dump_backtrace(NULL, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
||||||
{
|
{
|
||||||
dump_backtrace(NULL, tsk);
|
dump_backtrace(NULL, tsk);
|
||||||
|
@ -20,6 +20,7 @@ config X86_64
|
|||||||
### Arch settings
|
### Arch settings
|
||||||
config X86
|
config X86
|
||||||
def_bool y
|
def_bool y
|
||||||
|
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||||
select HAVE_AOUT if X86_32
|
select HAVE_AOUT if X86_32
|
||||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||||
|
@ -292,20 +292,6 @@ config OPTIMIZE_INLINING
|
|||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
config DEBUG_STRICT_USER_COPY_CHECKS
|
|
||||||
bool "Strict copy size checks"
|
|
||||||
depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
|
|
||||||
---help---
|
|
||||||
Enabling this option turns a certain set of sanity checks for user
|
|
||||||
copy operations into compile time failures.
|
|
||||||
|
|
||||||
The copy_from_user() etc checks are there to help test if there
|
|
||||||
are sufficient security checks on the length argument of
|
|
||||||
the copy operation, by having gcc prove that the argument is
|
|
||||||
within bounds.
|
|
||||||
|
|
||||||
If unsure, or if you run an older (pre 4.4) gcc, say N.
|
|
||||||
|
|
||||||
config DEBUG_NMI_SELFTEST
|
config DEBUG_NMI_SELFTEST
|
||||||
bool "NMI Selftest"
|
bool "NMI Selftest"
|
||||||
depends on DEBUG_KERNEL && X86_LOCAL_APIC
|
depends on DEBUG_KERNEL && X86_LOCAL_APIC
|
||||||
|
@ -162,7 +162,6 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
|
|||||||
fs = get_fs();
|
fs = get_fs();
|
||||||
set_fs(KERNEL_DS);
|
set_fs(KERNEL_DS);
|
||||||
has_dumped = 1;
|
has_dumped = 1;
|
||||||
current->flags |= PF_DUMPCORE;
|
|
||||||
strncpy(dump.u_comm, current->comm, sizeof(current->comm));
|
strncpy(dump.u_comm, current->comm, sizeof(current->comm));
|
||||||
dump.u_ar0 = offsetof(struct user32, regs);
|
dump.u_ar0 = offsetof(struct user32, regs);
|
||||||
dump.signal = signr;
|
dump.signal = signr;
|
||||||
|
@ -37,7 +37,4 @@ do { \
|
|||||||
|
|
||||||
#include <asm-generic/bug.h>
|
#include <asm-generic/bug.h>
|
||||||
|
|
||||||
|
|
||||||
extern void show_regs_common(void);
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_BUG_H */
|
#endif /* _ASM_X86_BUG_H */
|
||||||
|
@ -176,26 +176,20 @@ void show_trace(struct task_struct *task, struct pt_regs *regs,
|
|||||||
|
|
||||||
void show_stack(struct task_struct *task, unsigned long *sp)
|
void show_stack(struct task_struct *task, unsigned long *sp)
|
||||||
{
|
{
|
||||||
show_stack_log_lvl(task, NULL, sp, 0, "");
|
unsigned long bp = 0;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The architecture-independent dump_stack generator
|
|
||||||
*/
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
unsigned long bp;
|
|
||||||
unsigned long stack;
|
unsigned long stack;
|
||||||
|
|
||||||
bp = stack_frame(current, NULL);
|
/*
|
||||||
printk("Pid: %d, comm: %.20s %s %s %.*s\n",
|
* Stack frames below this one aren't interesting. Don't show them
|
||||||
current->pid, current->comm, print_tainted(),
|
* if we're printing for %current.
|
||||||
init_utsname()->release,
|
*/
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
if (!sp && (!task || task == current)) {
|
||||||
init_utsname()->version);
|
sp = &stack;
|
||||||
show_trace(NULL, NULL, &stack, bp);
|
bp = stack_frame(current, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
show_stack_log_lvl(task, NULL, sp, bp, "");
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
||||||
static int die_owner = -1;
|
static int die_owner = -1;
|
||||||
|
@ -86,11 +86,9 @@ void show_regs(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_EMERG);
|
||||||
__show_regs(regs, !user_mode_vm(regs));
|
__show_regs(regs, !user_mode_vm(regs));
|
||||||
|
|
||||||
pr_emerg("Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)\n",
|
|
||||||
TASK_COMM_LEN, current->comm, task_pid_nr(current),
|
|
||||||
current_thread_info(), current, task_thread_info(current));
|
|
||||||
/*
|
/*
|
||||||
* When in-kernel, we also print out the stack and code at the
|
* When in-kernel, we also print out the stack and code at the
|
||||||
* time of the fault..
|
* time of the fault..
|
||||||
|
@ -249,14 +249,10 @@ void show_regs(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned long sp;
|
unsigned long sp;
|
||||||
const int cpu = smp_processor_id();
|
|
||||||
struct task_struct *cur = current;
|
|
||||||
|
|
||||||
sp = regs->sp;
|
sp = regs->sp;
|
||||||
printk("CPU %d ", cpu);
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
__show_regs(regs, 1);
|
__show_regs(regs, 1);
|
||||||
printk(KERN_DEFAULT "Process %s (pid: %d, threadinfo %p, task %p)\n",
|
|
||||||
cur->comm, cur->pid, task_thread_info(cur), cur);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When in-kernel, we also print out the stack and code at the
|
* When in-kernel, we also print out the stack and code at the
|
||||||
|
@ -121,30 +121,6 @@ void exit_thread(void)
|
|||||||
drop_fpu(me);
|
drop_fpu(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_regs_common(void)
|
|
||||||
{
|
|
||||||
const char *vendor, *product, *board;
|
|
||||||
|
|
||||||
vendor = dmi_get_system_info(DMI_SYS_VENDOR);
|
|
||||||
if (!vendor)
|
|
||||||
vendor = "";
|
|
||||||
product = dmi_get_system_info(DMI_PRODUCT_NAME);
|
|
||||||
if (!product)
|
|
||||||
product = "";
|
|
||||||
|
|
||||||
/* Board Name is optional */
|
|
||||||
board = dmi_get_system_info(DMI_BOARD_NAME);
|
|
||||||
|
|
||||||
printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s %s %s%s%s\n",
|
|
||||||
current->pid, current->comm, print_tainted(),
|
|
||||||
init_utsname()->release,
|
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
|
||||||
init_utsname()->version,
|
|
||||||
vendor, product,
|
|
||||||
board ? "/" : "",
|
|
||||||
board ? board : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
|
@ -84,8 +84,6 @@ void __show_regs(struct pt_regs *regs, int all)
|
|||||||
savesegment(gs, gs);
|
savesegment(gs, gs);
|
||||||
}
|
}
|
||||||
|
|
||||||
show_regs_common();
|
|
||||||
|
|
||||||
printk(KERN_DEFAULT "EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n",
|
printk(KERN_DEFAULT "EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n",
|
||||||
(u16)regs->cs, regs->ip, regs->flags,
|
(u16)regs->cs, regs->ip, regs->flags,
|
||||||
smp_processor_id());
|
smp_processor_id());
|
||||||
|
@ -62,7 +62,6 @@ void __show_regs(struct pt_regs *regs, int all)
|
|||||||
unsigned int fsindex, gsindex;
|
unsigned int fsindex, gsindex;
|
||||||
unsigned int ds, cs, es;
|
unsigned int ds, cs, es;
|
||||||
|
|
||||||
show_regs_common();
|
|
||||||
printk(KERN_DEFAULT "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
|
printk(KERN_DEFAULT "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
|
||||||
printk_address(regs->ip, 1);
|
printk_address(regs->ip, 1);
|
||||||
printk(KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
|
printk(KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
|
||||||
|
@ -996,6 +996,7 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
efi_init();
|
efi_init();
|
||||||
|
|
||||||
dmi_scan_machine();
|
dmi_scan_machine();
|
||||||
|
dmi_set_dump_stack_arch_desc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VMware detection requires dmi to be available, so this
|
* VMware detection requires dmi to be available, so this
|
||||||
|
@ -689,9 +689,3 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(_copy_from_user);
|
EXPORT_SYMBOL(_copy_from_user);
|
||||||
|
|
||||||
void copy_from_user_overflow(void)
|
|
||||||
{
|
|
||||||
WARN(1, "Buffer overflow detected!\n");
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(copy_from_user_overflow);
|
|
||||||
|
@ -383,6 +383,8 @@ void show_regs(struct pt_regs * regs)
|
|||||||
{
|
{
|
||||||
int i, wmask;
|
int i, wmask;
|
||||||
|
|
||||||
|
show_regs_print_info(KERN_DEFAULT);
|
||||||
|
|
||||||
wmask = regs->wmask & ~1;
|
wmask = regs->wmask & ~1;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
@ -481,14 +483,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|||||||
show_trace(task, stack);
|
show_trace(task, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_stack(void)
|
|
||||||
{
|
|
||||||
show_stack(current, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
|
||||||
|
|
||||||
|
|
||||||
void show_code(unsigned int *pc)
|
void show_code(unsigned int *pc)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
|
@ -120,6 +120,8 @@ source "drivers/vfio/Kconfig"
|
|||||||
|
|
||||||
source "drivers/vlynq/Kconfig"
|
source "drivers/vlynq/Kconfig"
|
||||||
|
|
||||||
|
source "drivers/virt/Kconfig"
|
||||||
|
|
||||||
source "drivers/virtio/Kconfig"
|
source "drivers/virtio/Kconfig"
|
||||||
|
|
||||||
source "drivers/hv/Kconfig"
|
source "drivers/hv/Kconfig"
|
||||||
@ -144,8 +146,6 @@ source "drivers/remoteproc/Kconfig"
|
|||||||
|
|
||||||
source "drivers/rpmsg/Kconfig"
|
source "drivers/rpmsg/Kconfig"
|
||||||
|
|
||||||
source "drivers/virt/Kconfig"
|
|
||||||
|
|
||||||
source "drivers/devfreq/Kconfig"
|
source "drivers/devfreq/Kconfig"
|
||||||
|
|
||||||
source "drivers/extcon/Kconfig"
|
source "drivers/extcon/Kconfig"
|
||||||
|
@ -139,13 +139,12 @@ bail: spin_unlock_irqrestore(&emsgs_lock, flags);
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mp = kmalloc(n, GFP_ATOMIC);
|
mp = kmemdup(msg, n, GFP_ATOMIC);
|
||||||
if (mp == NULL) {
|
if (mp == NULL) {
|
||||||
printk(KERN_ERR "aoe: allocation failure, len=%ld\n", n);
|
printk(KERN_ERR "aoe: allocation failure, len=%ld\n", n);
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(mp, msg, n);
|
|
||||||
em->msg = mp;
|
em->msg = mp;
|
||||||
em->flags |= EMFL_VALID;
|
em->flags |= EMFL_VALID;
|
||||||
em->len = n;
|
em->len = n;
|
||||||
|
@ -856,6 +856,8 @@ static int __init nbd_init(void)
|
|||||||
disk->queue->limits.discard_granularity = 512;
|
disk->queue->limits.discard_granularity = 512;
|
||||||
disk->queue->limits.max_discard_sectors = UINT_MAX;
|
disk->queue->limits.max_discard_sectors = UINT_MAX;
|
||||||
disk->queue->limits.discard_zeroes_data = 0;
|
disk->queue->limits.discard_zeroes_data = 0;
|
||||||
|
blk_queue_max_hw_sectors(disk->queue, 65536);
|
||||||
|
disk->queue->limits.max_sectors = 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (register_blkdev(NBD_MAJOR, "nbd")) {
|
if (register_blkdev(NBD_MAJOR, "nbd")) {
|
||||||
|
@ -1485,6 +1485,7 @@ unsigned int get_random_int(void)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(get_random_int);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* randomize_range() returns a start address such that
|
* randomize_range() returns a start address such that
|
||||||
|
@ -22,6 +22,9 @@ static u16 __initdata dmi_ver;
|
|||||||
*/
|
*/
|
||||||
static int dmi_initialized;
|
static int dmi_initialized;
|
||||||
|
|
||||||
|
/* DMI system identification string used during boot */
|
||||||
|
static char dmi_ids_string[128] __initdata;
|
||||||
|
|
||||||
static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
|
static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
|
||||||
{
|
{
|
||||||
const u8 *bp = ((u8 *) dm) + dm->length;
|
const u8 *bp = ((u8 *) dm) + dm->length;
|
||||||
@ -376,99 +379,103 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init print_filtered(const char *info)
|
static int __init print_filtered(char *buf, size_t len, const char *info)
|
||||||
{
|
{
|
||||||
|
int c = 0;
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
if (!info)
|
if (!info)
|
||||||
return;
|
return c;
|
||||||
|
|
||||||
for (p = info; *p; p++)
|
for (p = info; *p; p++)
|
||||||
if (isprint(*p))
|
if (isprint(*p))
|
||||||
printk(KERN_CONT "%c", *p);
|
c += scnprintf(buf + c, len - c, "%c", *p);
|
||||||
else
|
else
|
||||||
printk(KERN_CONT "\\x%02x", *p & 0xff);
|
c += scnprintf(buf + c, len - c, "\\x%02x", *p & 0xff);
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init dmi_dump_ids(void)
|
static void __init dmi_format_ids(char *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
int c = 0;
|
||||||
const char *board; /* Board Name is optional */
|
const char *board; /* Board Name is optional */
|
||||||
|
|
||||||
printk(KERN_DEBUG "DMI: ");
|
c += print_filtered(buf + c, len - c,
|
||||||
print_filtered(dmi_get_system_info(DMI_SYS_VENDOR));
|
dmi_get_system_info(DMI_SYS_VENDOR));
|
||||||
printk(KERN_CONT " ");
|
c += scnprintf(buf + c, len - c, " ");
|
||||||
print_filtered(dmi_get_system_info(DMI_PRODUCT_NAME));
|
c += print_filtered(buf + c, len - c,
|
||||||
|
dmi_get_system_info(DMI_PRODUCT_NAME));
|
||||||
|
|
||||||
board = dmi_get_system_info(DMI_BOARD_NAME);
|
board = dmi_get_system_info(DMI_BOARD_NAME);
|
||||||
if (board) {
|
if (board) {
|
||||||
printk(KERN_CONT "/");
|
c += scnprintf(buf + c, len - c, "/");
|
||||||
print_filtered(board);
|
c += print_filtered(buf + c, len - c, board);
|
||||||
}
|
}
|
||||||
printk(KERN_CONT ", BIOS ");
|
c += scnprintf(buf + c, len - c, ", BIOS ");
|
||||||
print_filtered(dmi_get_system_info(DMI_BIOS_VERSION));
|
c += print_filtered(buf + c, len - c,
|
||||||
printk(KERN_CONT " ");
|
dmi_get_system_info(DMI_BIOS_VERSION));
|
||||||
print_filtered(dmi_get_system_info(DMI_BIOS_DATE));
|
c += scnprintf(buf + c, len - c, " ");
|
||||||
printk(KERN_CONT "\n");
|
c += print_filtered(buf + c, len - c,
|
||||||
|
dmi_get_system_info(DMI_BIOS_DATE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init dmi_present(const char __iomem *p)
|
static int __init dmi_present(const u8 *buf)
|
||||||
{
|
{
|
||||||
u8 buf[15];
|
int smbios_ver;
|
||||||
|
|
||||||
memcpy_fromio(buf, p, 15);
|
if (memcmp(buf, "_SM_", 4) == 0 &&
|
||||||
if (dmi_checksum(buf, 15)) {
|
buf[5] < 32 && dmi_checksum(buf, buf[5])) {
|
||||||
|
smbios_ver = (buf[6] << 8) + buf[7];
|
||||||
|
|
||||||
|
/* Some BIOS report weird SMBIOS version, fix that up */
|
||||||
|
switch (smbios_ver) {
|
||||||
|
case 0x021F:
|
||||||
|
case 0x0221:
|
||||||
|
pr_debug("SMBIOS version fixup(2.%d->2.%d)\n",
|
||||||
|
smbios_ver & 0xFF, 3);
|
||||||
|
smbios_ver = 0x0203;
|
||||||
|
break;
|
||||||
|
case 0x0233:
|
||||||
|
pr_debug("SMBIOS version fixup(2.%d->2.%d)\n", 51, 6);
|
||||||
|
smbios_ver = 0x0206;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
smbios_ver = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf += 16;
|
||||||
|
|
||||||
|
if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) {
|
||||||
dmi_num = (buf[13] << 8) | buf[12];
|
dmi_num = (buf[13] << 8) | buf[12];
|
||||||
dmi_len = (buf[7] << 8) | buf[6];
|
dmi_len = (buf[7] << 8) | buf[6];
|
||||||
dmi_base = (buf[11] << 24) | (buf[10] << 16) |
|
dmi_base = (buf[11] << 24) | (buf[10] << 16) |
|
||||||
(buf[9] << 8) | buf[8];
|
(buf[9] << 8) | buf[8];
|
||||||
|
|
||||||
if (dmi_walk_early(dmi_decode) == 0) {
|
if (dmi_walk_early(dmi_decode) == 0) {
|
||||||
if (dmi_ver)
|
if (smbios_ver) {
|
||||||
|
dmi_ver = smbios_ver;
|
||||||
pr_info("SMBIOS %d.%d present.\n",
|
pr_info("SMBIOS %d.%d present.\n",
|
||||||
dmi_ver >> 8, dmi_ver & 0xFF);
|
dmi_ver >> 8, dmi_ver & 0xFF);
|
||||||
else {
|
} else {
|
||||||
dmi_ver = (buf[14] & 0xF0) << 4 |
|
dmi_ver = (buf[14] & 0xF0) << 4 |
|
||||||
(buf[14] & 0x0F);
|
(buf[14] & 0x0F);
|
||||||
pr_info("Legacy DMI %d.%d present.\n",
|
pr_info("Legacy DMI %d.%d present.\n",
|
||||||
dmi_ver >> 8, dmi_ver & 0xFF);
|
dmi_ver >> 8, dmi_ver & 0xFF);
|
||||||
}
|
}
|
||||||
dmi_dump_ids();
|
dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
|
||||||
|
printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dmi_ver = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init smbios_present(const char __iomem *p)
|
|
||||||
{
|
|
||||||
u8 buf[32];
|
|
||||||
|
|
||||||
memcpy_fromio(buf, p, 32);
|
|
||||||
if ((buf[5] < 32) && dmi_checksum(buf, buf[5])) {
|
|
||||||
dmi_ver = (buf[6] << 8) + buf[7];
|
|
||||||
|
|
||||||
/* Some BIOS report weird SMBIOS version, fix that up */
|
|
||||||
switch (dmi_ver) {
|
|
||||||
case 0x021F:
|
|
||||||
case 0x0221:
|
|
||||||
pr_debug("SMBIOS version fixup(2.%d->2.%d)\n",
|
|
||||||
dmi_ver & 0xFF, 3);
|
|
||||||
dmi_ver = 0x0203;
|
|
||||||
break;
|
|
||||||
case 0x0233:
|
|
||||||
pr_debug("SMBIOS version fixup(2.%d->2.%d)\n", 51, 6);
|
|
||||||
dmi_ver = 0x0206;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return memcmp(p + 16, "_DMI_", 5) || dmi_present(p + 16);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init dmi_scan_machine(void)
|
void __init dmi_scan_machine(void)
|
||||||
{
|
{
|
||||||
char __iomem *p, *q;
|
char __iomem *p, *q;
|
||||||
int rc;
|
char buf[32];
|
||||||
|
|
||||||
if (efi_enabled(EFI_CONFIG_TABLES)) {
|
if (efi_enabled(EFI_CONFIG_TABLES)) {
|
||||||
if (efi.smbios == EFI_INVALID_TABLE_ADDR)
|
if (efi.smbios == EFI_INVALID_TABLE_ADDR)
|
||||||
@ -481,10 +488,10 @@ void __init dmi_scan_machine(void)
|
|||||||
p = dmi_ioremap(efi.smbios, 32);
|
p = dmi_ioremap(efi.smbios, 32);
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
memcpy_fromio(buf, p, 32);
|
||||||
rc = smbios_present(p);
|
|
||||||
dmi_iounmap(p, 32);
|
dmi_iounmap(p, 32);
|
||||||
if (!rc) {
|
|
||||||
|
if (!dmi_present(buf)) {
|
||||||
dmi_available = 1;
|
dmi_available = 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -499,18 +506,15 @@ void __init dmi_scan_machine(void)
|
|||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
memset(buf, 0, 16);
|
||||||
for (q = p; q < p + 0x10000; q += 16) {
|
for (q = p; q < p + 0x10000; q += 16) {
|
||||||
if (memcmp(q, "_SM_", 4) == 0 && q - p <= 0xFFE0)
|
memcpy_fromio(buf + 16, q, 16);
|
||||||
rc = smbios_present(q);
|
if (!dmi_present(buf)) {
|
||||||
else if (memcmp(q, "_DMI_", 5) == 0)
|
|
||||||
rc = dmi_present(q);
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
if (!rc) {
|
|
||||||
dmi_available = 1;
|
dmi_available = 1;
|
||||||
dmi_iounmap(p, 0x10000);
|
dmi_iounmap(p, 0x10000);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
memcpy(buf, buf + 16, 16);
|
||||||
}
|
}
|
||||||
dmi_iounmap(p, 0x10000);
|
dmi_iounmap(p, 0x10000);
|
||||||
}
|
}
|
||||||
@ -520,6 +524,19 @@ void __init dmi_scan_machine(void)
|
|||||||
dmi_initialized = 1;
|
dmi_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dmi_set_dump_stack_arch_desc - set arch description for dump_stack()
|
||||||
|
*
|
||||||
|
* Invoke dump_stack_set_arch_desc() with DMI system information so that
|
||||||
|
* DMI identifiers are printed out on task dumps. Arch boot code should
|
||||||
|
* call this function after dmi_scan_machine() if it wants to print out DMI
|
||||||
|
* identifiers on task dumps.
|
||||||
|
*/
|
||||||
|
void __init dmi_set_dump_stack_arch_desc(void)
|
||||||
|
{
|
||||||
|
dump_stack_set_arch_desc("%s", dmi_ids_string);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dmi_matches - check if dmi_system_id structure matches system DMI data
|
* dmi_matches - check if dmi_system_id structure matches system DMI data
|
||||||
* @dmi: pointer to the dmi_system_id structure to check
|
* @dmi: pointer to the dmi_system_id structure to check
|
||||||
|
@ -847,7 +847,7 @@ static void r592_remove(struct pci_dev *pdev)
|
|||||||
dev->dummy_dma_page_physical_address);
|
dev->dummy_dma_page_physical_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int r592_suspend(struct device *core_dev)
|
static int r592_suspend(struct device *core_dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(core_dev);
|
struct pci_dev *pdev = to_pci_dev(core_dev);
|
||||||
@ -870,10 +870,10 @@ static int r592_resume(struct device *core_dev)
|
|||||||
r592_update_card_detect(dev);
|
r592_update_card_detect(dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SIMPLE_DEV_PM_OPS(r592_pm_ops, r592_suspend, r592_resume);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static SIMPLE_DEV_PM_OPS(r592_pm_ops, r592_suspend, r592_resume);
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, r592_pci_id_tbl);
|
MODULE_DEVICE_TABLE(pci, r592_pci_id_tbl);
|
||||||
|
|
||||||
static struct pci_driver r852_pci_driver = {
|
static struct pci_driver r852_pci_driver = {
|
||||||
@ -881,9 +881,7 @@ static struct pci_driver r852_pci_driver = {
|
|||||||
.id_table = r592_pci_id_tbl,
|
.id_table = r592_pci_id_tbl,
|
||||||
.probe = r592_probe,
|
.probe = r592_probe,
|
||||||
.remove = r592_remove,
|
.remove = r592_remove,
|
||||||
#ifdef CONFIG_PM
|
|
||||||
.driver.pm = &r592_pm_ops,
|
.driver.pm = &r592_pm_ops,
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init int r592_module_init(void)
|
static __init int r592_module_init(void)
|
||||||
|
@ -687,6 +687,11 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
|
|||||||
}
|
}
|
||||||
size = size >> 16;
|
size = size >> 16;
|
||||||
size *= 4;
|
size *= 4;
|
||||||
|
if (size > sizeof(rmsg)) {
|
||||||
|
rcode = -EINVAL;
|
||||||
|
goto sg_list_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy in the user's I2O command */
|
/* Copy in the user's I2O command */
|
||||||
if (copy_from_user(rmsg, user_msg, size)) {
|
if (copy_from_user(rmsg, user_msg, size)) {
|
||||||
rcode = -EFAULT;
|
rcode = -EFAULT;
|
||||||
@ -922,6 +927,11 @@ static int i2o_cfg_passthru(unsigned long arg)
|
|||||||
}
|
}
|
||||||
size = size >> 16;
|
size = size >> 16;
|
||||||
size *= 4;
|
size *= 4;
|
||||||
|
if (size > sizeof(rmsg)) {
|
||||||
|
rcode = -EFAULT;
|
||||||
|
goto sg_list_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy in the user's I2O command */
|
/* Copy in the user's I2O command */
|
||||||
if (copy_from_user(rmsg, user_msg, size)) {
|
if (copy_from_user(rmsg, user_msg, size)) {
|
||||||
rcode = -EFAULT;
|
rcode = -EFAULT;
|
||||||
|
@ -245,7 +245,7 @@ static void emac_sysrq_handler(int key)
|
|||||||
|
|
||||||
static struct sysrq_key_op emac_sysrq_op = {
|
static struct sysrq_key_op emac_sysrq_op = {
|
||||||
.handler = emac_sysrq_handler,
|
.handler = emac_sysrq_handler,
|
||||||
.help_msg = "emaC",
|
.help_msg = "emac(c)",
|
||||||
.action_msg = "Show EMAC(s) status",
|
.action_msg = "Show EMAC(s) status",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,10 +20,10 @@ config PPS
|
|||||||
|
|
||||||
To compile this driver as a module, choose M here: the module
|
To compile this driver as a module, choose M here: the module
|
||||||
will be called pps_core.ko.
|
will be called pps_core.ko.
|
||||||
|
if PPS
|
||||||
|
|
||||||
config PPS_DEBUG
|
config PPS_DEBUG
|
||||||
bool "PPS debugging messages"
|
bool "PPS debugging messages"
|
||||||
depends on PPS
|
|
||||||
help
|
help
|
||||||
Say Y here if you want the PPS support to produce a bunch of debug
|
Say Y here if you want the PPS support to produce a bunch of debug
|
||||||
messages to the system log. Select this if you are having a
|
messages to the system log. Select this if you are having a
|
||||||
@ -31,13 +31,15 @@ config PPS_DEBUG
|
|||||||
|
|
||||||
config NTP_PPS
|
config NTP_PPS
|
||||||
bool "PPS kernel consumer support"
|
bool "PPS kernel consumer support"
|
||||||
depends on PPS && !NO_HZ
|
depends on !NO_HZ
|
||||||
help
|
help
|
||||||
This option adds support for direct in-kernel time
|
This option adds support for direct in-kernel time
|
||||||
synchronization using an external PPS signal.
|
synchronization using an external PPS signal.
|
||||||
|
|
||||||
It doesn't work on tickless systems at the moment.
|
It doesn't work on tickless systems at the moment.
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
source drivers/pps/clients/Kconfig
|
source drivers/pps/clients/Kconfig
|
||||||
|
|
||||||
source drivers/pps/generators/Kconfig
|
source drivers/pps/generators/Kconfig
|
||||||
|
@ -34,10 +34,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* state variables to bind kernel consumer */
|
/* state variables to bind kernel consumer */
|
||||||
DEFINE_SPINLOCK(pps_kc_hardpps_lock);
|
static DEFINE_SPINLOCK(pps_kc_hardpps_lock);
|
||||||
/* PPS API (RFC 2783): current source and mode for kernel consumer */
|
/* PPS API (RFC 2783): current source and mode for kernel consumer */
|
||||||
struct pps_device *pps_kc_hardpps_dev; /* unique pointer to device */
|
static struct pps_device *pps_kc_hardpps_dev; /* unique pointer to device */
|
||||||
int pps_kc_hardpps_mode; /* mode bits for kernel consumer */
|
static int pps_kc_hardpps_mode; /* mode bits for kernel consumer */
|
||||||
|
|
||||||
/* pps_kc_bind - control PPS kernel consumer binding
|
/* pps_kc_bind - control PPS kernel consumer binding
|
||||||
* @pps: the PPS source
|
* @pps: the PPS source
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/kobject.h>
|
#include <linux/kobject.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/string_helpers.h>
|
||||||
#include <linux/sysfs.h>
|
#include <linux/sysfs.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
@ -417,7 +418,7 @@ static ssize_t synth_direct_store(struct kobject *kobj,
|
|||||||
bytes = min_t(size_t, len, 250);
|
bytes = min_t(size_t, len, 250);
|
||||||
strncpy(tmp, ptr, bytes);
|
strncpy(tmp, ptr, bytes);
|
||||||
tmp[bytes] = '\0';
|
tmp[bytes] = '\0';
|
||||||
spk_xlate(tmp);
|
string_unescape_any_inplace(tmp);
|
||||||
synth_printf("%s", tmp);
|
synth_printf("%s", tmp);
|
||||||
ptr += bytes;
|
ptr += bytes;
|
||||||
len -= bytes;
|
len -= bytes;
|
||||||
@ -605,7 +606,8 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr,
|
|||||||
if (param->data == NULL)
|
if (param->data == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cp = spk_xlate((char *) buf);
|
cp = (char *)buf;
|
||||||
|
string_unescape_any_inplace(cp);
|
||||||
|
|
||||||
spk_lock(flags);
|
spk_lock(flags);
|
||||||
switch (param->var_type) {
|
switch (param->var_type) {
|
||||||
|
@ -54,7 +54,6 @@ void spk_get_index_count(int *linecount, int *sentcount);
|
|||||||
extern int spk_set_key_info(const u_char *key_info, u_char *k_buffer);
|
extern int spk_set_key_info(const u_char *key_info, u_char *k_buffer);
|
||||||
extern char *spk_strlwr(char *s);
|
extern char *spk_strlwr(char *s);
|
||||||
extern char *spk_s2uchar(char *start, char *dest);
|
extern char *spk_s2uchar(char *start, char *dest);
|
||||||
extern char *spk_xlate(char *s);
|
|
||||||
extern int speakup_kobj_init(void);
|
extern int speakup_kobj_init(void);
|
||||||
extern void speakup_kobj_exit(void);
|
extern void speakup_kobj_exit(void);
|
||||||
extern int spk_chartab_get_value(char *keyword);
|
extern int spk_chartab_get_value(char *keyword);
|
||||||
|
@ -328,49 +328,3 @@ char *spk_s2uchar(char *start, char *dest)
|
|||||||
*dest = (u_char)val;
|
*dest = (u_char)val;
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *spk_xlate(char *s)
|
|
||||||
{
|
|
||||||
static const char finds[] = "nrtvafe";
|
|
||||||
static const char subs[] = "\n\r\t\013\001\014\033";
|
|
||||||
static const char hx[] = "0123456789abcdefABCDEF";
|
|
||||||
char *p = s, *p1, *p2, c;
|
|
||||||
int num;
|
|
||||||
while ((p = strchr(p, '\\'))) {
|
|
||||||
p1 = p+1;
|
|
||||||
p2 = strchr(finds, *p1);
|
|
||||||
if (p2) {
|
|
||||||
*p++ = subs[p2-finds];
|
|
||||||
p1++;
|
|
||||||
} else if (*p1 >= '0' && *p1 <= '7') {
|
|
||||||
num = (*p1++)&7;
|
|
||||||
while (num < 32 && *p1 >= '0' && *p1 <= '7') {
|
|
||||||
num <<= 3;
|
|
||||||
num += (*p1++)&7;
|
|
||||||
}
|
|
||||||
*p++ = num;
|
|
||||||
} else if (*p1 == 'x' &&
|
|
||||||
strchr(hx, p1[1]) && strchr(hx, p1[2])) {
|
|
||||||
p1++;
|
|
||||||
c = *p1++;
|
|
||||||
if (c > '9')
|
|
||||||
c = (c - '7') & 0x0f;
|
|
||||||
else
|
|
||||||
c -= '0';
|
|
||||||
num = c << 4;
|
|
||||||
c = *p1++;
|
|
||||||
if (c > '9')
|
|
||||||
c = (c-'7')&0x0f;
|
|
||||||
else
|
|
||||||
c -= '0';
|
|
||||||
num += c;
|
|
||||||
*p++ = num;
|
|
||||||
} else
|
|
||||||
*p++ = *p1++;
|
|
||||||
p2 = p;
|
|
||||||
while (*p1)
|
|
||||||
*p2++ = *p1++;
|
|
||||||
*p2 = '\0';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
config ZCACHE
|
config ZCACHE
|
||||||
bool "Dynamic compression of swap pages and clean pagecache pages"
|
tristate "Dynamic compression of swap pages and clean pagecache pages"
|
||||||
depends on CRYPTO=y && SWAP=y && CLEANCACHE && FRONTSWAP
|
depends on CRYPTO=y && SWAP=y && CLEANCACHE && FRONTSWAP
|
||||||
select CRYPTO_LZO
|
select CRYPTO_LZO
|
||||||
default n
|
default n
|
||||||
@ -19,8 +19,8 @@ config ZCACHE_DEBUG
|
|||||||
how zcache is doing. You probably want to set this to 'N'.
|
how zcache is doing. You probably want to set this to 'N'.
|
||||||
|
|
||||||
config RAMSTER
|
config RAMSTER
|
||||||
bool "Cross-machine RAM capacity sharing, aka peer-to-peer tmem"
|
tristate "Cross-machine RAM capacity sharing, aka peer-to-peer tmem"
|
||||||
depends on CONFIGFS_FS=y && SYSFS=y && !HIGHMEM && ZCACHE=y
|
depends on CONFIGFS_FS=y && SYSFS=y && !HIGHMEM && ZCACHE
|
||||||
depends on NET
|
depends on NET
|
||||||
# must ensure struct page is 8-byte aligned
|
# must ensure struct page is 8-byte aligned
|
||||||
select HAVE_ALIGNED_STRUCT_PAGE if !64BIT
|
select HAVE_ALIGNED_STRUCT_PAGE if !64BIT
|
||||||
|
@ -11,10 +11,14 @@
|
|||||||
#ifndef _ZCACHE_RAMSTER_H_
|
#ifndef _ZCACHE_RAMSTER_H_
|
||||||
#define _ZCACHE_RAMSTER_H_
|
#define _ZCACHE_RAMSTER_H_
|
||||||
|
|
||||||
|
#ifdef CONFIG_RAMSTER_MODULE
|
||||||
|
#define CONFIG_RAMSTER
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_RAMSTER
|
#ifdef CONFIG_RAMSTER
|
||||||
#include "ramster/ramster.h"
|
#include "ramster/ramster.h"
|
||||||
#else
|
#else
|
||||||
static inline void ramster_init(bool x, bool y, bool z)
|
static inline void ramster_init(bool x, bool y, bool z, bool w)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ static struct debug_entry {
|
|||||||
};
|
};
|
||||||
#undef ATTR
|
#undef ATTR
|
||||||
|
|
||||||
int __init ramster_debugfs_init(void)
|
int ramster_debugfs_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct dentry *root = debugfs_create_dir("ramster", NULL);
|
struct dentry *root = debugfs_create_dir("ramster", NULL);
|
||||||
|
@ -949,7 +949,7 @@ static void __exit exit_r2nm(void)
|
|||||||
r2hb_exit();
|
r2hb_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init init_r2nm(void)
|
int r2nm_init(void)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
@ -986,10 +986,11 @@ out_r2hb:
|
|||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(r2nm_init);
|
||||||
|
|
||||||
MODULE_AUTHOR("Oracle");
|
MODULE_AUTHOR("Oracle");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
/* module_init(init_r2nm) */
|
#ifndef CONFIG_RAMSTER_MODULE
|
||||||
late_initcall(init_r2nm);
|
late_initcall(r2nm_init);
|
||||||
/* module_exit(exit_r2nm) */
|
#endif
|
||||||
|
@ -121,6 +121,7 @@ int ramster_do_preload_flnode(struct tmem_pool *pool)
|
|||||||
kmem_cache_free(ramster_flnode_cache, flnode);
|
kmem_cache_free(ramster_flnode_cache, flnode);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_do_preload_flnode);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by the message handler after a (still compressed) page has been
|
* Called by the message handler after a (still compressed) page has been
|
||||||
@ -388,6 +389,7 @@ void *ramster_pampd_free(void *pampd, struct tmem_pool *pool,
|
|||||||
}
|
}
|
||||||
return local_pampd;
|
return local_pampd;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_pampd_free);
|
||||||
|
|
||||||
void ramster_count_foreign_pages(bool eph, int count)
|
void ramster_count_foreign_pages(bool eph, int count)
|
||||||
{
|
{
|
||||||
@ -408,6 +410,7 @@ void ramster_count_foreign_pages(bool eph, int count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_count_foreign_pages);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For now, just push over a few pages every few seconds to
|
* For now, just push over a few pages every few seconds to
|
||||||
@ -593,7 +596,7 @@ requeue:
|
|||||||
ramster_remotify_queue_delayed_work(HZ);
|
ramster_remotify_queue_delayed_work(HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init ramster_remotify_init(void)
|
void ramster_remotify_init(void)
|
||||||
{
|
{
|
||||||
unsigned long n = 60UL;
|
unsigned long n = 60UL;
|
||||||
ramster_remotify_workqueue =
|
ramster_remotify_workqueue =
|
||||||
@ -768,8 +771,10 @@ static bool frontswap_selfshrinking __read_mostly;
|
|||||||
static void selfshrink_process(struct work_struct *work);
|
static void selfshrink_process(struct work_struct *work);
|
||||||
static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process);
|
static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process);
|
||||||
|
|
||||||
|
#ifndef CONFIG_RAMSTER_MODULE
|
||||||
/* Enable/disable with kernel boot option. */
|
/* Enable/disable with kernel boot option. */
|
||||||
static bool use_frontswap_selfshrink __initdata = true;
|
static bool use_frontswap_selfshrink = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The default values for the following parameters were deemed reasonable
|
* The default values for the following parameters were deemed reasonable
|
||||||
@ -824,6 +829,7 @@ static void frontswap_selfshrink(void)
|
|||||||
frontswap_shrink(tgt_frontswap_pages);
|
frontswap_shrink(tgt_frontswap_pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_RAMSTER_MODULE
|
||||||
static int __init ramster_nofrontswap_selfshrink_setup(char *s)
|
static int __init ramster_nofrontswap_selfshrink_setup(char *s)
|
||||||
{
|
{
|
||||||
use_frontswap_selfshrink = false;
|
use_frontswap_selfshrink = false;
|
||||||
@ -831,6 +837,7 @@ static int __init ramster_nofrontswap_selfshrink_setup(char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
__setup("noselfshrink", ramster_nofrontswap_selfshrink_setup);
|
__setup("noselfshrink", ramster_nofrontswap_selfshrink_setup);
|
||||||
|
#endif
|
||||||
|
|
||||||
static void selfshrink_process(struct work_struct *work)
|
static void selfshrink_process(struct work_struct *work)
|
||||||
{
|
{
|
||||||
@ -849,6 +856,7 @@ void ramster_cpu_up(int cpu)
|
|||||||
per_cpu(ramster_remoteputmem1, cpu) = p1;
|
per_cpu(ramster_remoteputmem1, cpu) = p1;
|
||||||
per_cpu(ramster_remoteputmem2, cpu) = p2;
|
per_cpu(ramster_remoteputmem2, cpu) = p2;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_cpu_up);
|
||||||
|
|
||||||
void ramster_cpu_down(int cpu)
|
void ramster_cpu_down(int cpu)
|
||||||
{
|
{
|
||||||
@ -864,6 +872,7 @@ void ramster_cpu_down(int cpu)
|
|||||||
kp->flnode = NULL;
|
kp->flnode = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_cpu_down);
|
||||||
|
|
||||||
void ramster_register_pamops(struct tmem_pamops *pamops)
|
void ramster_register_pamops(struct tmem_pamops *pamops)
|
||||||
{
|
{
|
||||||
@ -874,9 +883,11 @@ void ramster_register_pamops(struct tmem_pamops *pamops)
|
|||||||
pamops->repatriate = ramster_pampd_repatriate;
|
pamops->repatriate = ramster_pampd_repatriate;
|
||||||
pamops->repatriate_preload = ramster_pampd_repatriate_preload;
|
pamops->repatriate_preload = ramster_pampd_repatriate_preload;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_register_pamops);
|
||||||
|
|
||||||
void __init ramster_init(bool cleancache, bool frontswap,
|
void ramster_init(bool cleancache, bool frontswap,
|
||||||
bool frontswap_exclusive_gets)
|
bool frontswap_exclusive_gets,
|
||||||
|
bool frontswap_selfshrink)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -891,10 +902,17 @@ void __init ramster_init(bool cleancache, bool frontswap,
|
|||||||
if (ret)
|
if (ret)
|
||||||
pr_err("ramster: can't create sysfs for ramster\n");
|
pr_err("ramster: can't create sysfs for ramster\n");
|
||||||
(void)r2net_register_handlers();
|
(void)r2net_register_handlers();
|
||||||
|
#ifdef CONFIG_RAMSTER_MODULE
|
||||||
|
ret = r2nm_init();
|
||||||
|
if (ret)
|
||||||
|
pr_err("ramster: can't init r2net\n");
|
||||||
|
frontswap_selfshrinking = frontswap_selfshrink;
|
||||||
|
#else
|
||||||
|
frontswap_selfshrinking = use_frontswap_selfshrink;
|
||||||
|
#endif
|
||||||
INIT_LIST_HEAD(&ramster_rem_op_list);
|
INIT_LIST_HEAD(&ramster_rem_op_list);
|
||||||
ramster_flnode_cache = kmem_cache_create("ramster_flnode",
|
ramster_flnode_cache = kmem_cache_create("ramster_flnode",
|
||||||
sizeof(struct flushlist_node), 0, 0, NULL);
|
sizeof(struct flushlist_node), 0, 0, NULL);
|
||||||
frontswap_selfshrinking = use_frontswap_selfshrink;
|
|
||||||
if (frontswap_selfshrinking) {
|
if (frontswap_selfshrinking) {
|
||||||
pr_info("ramster: Initializing frontswap selfshrink driver.\n");
|
pr_info("ramster: Initializing frontswap selfshrink driver.\n");
|
||||||
schedule_delayed_work(&selfshrink_worker,
|
schedule_delayed_work(&selfshrink_worker,
|
||||||
@ -902,3 +920,4 @@ void __init ramster_init(bool cleancache, bool frontswap,
|
|||||||
}
|
}
|
||||||
ramster_remotify_init();
|
ramster_remotify_init();
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ramster_init);
|
||||||
|
@ -147,7 +147,7 @@ extern int r2net_register_handlers(void);
|
|||||||
extern int r2net_remote_target_node_set(int);
|
extern int r2net_remote_target_node_set(int);
|
||||||
|
|
||||||
extern int ramster_remotify_pageframe(bool);
|
extern int ramster_remotify_pageframe(bool);
|
||||||
extern void ramster_init(bool, bool, bool);
|
extern void ramster_init(bool, bool, bool, bool);
|
||||||
extern void ramster_register_pamops(struct tmem_pamops *);
|
extern void ramster_register_pamops(struct tmem_pamops *);
|
||||||
extern int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *,
|
extern int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *,
|
||||||
unsigned int, void *);
|
unsigned int, void *);
|
||||||
|
@ -36,4 +36,6 @@
|
|||||||
/* host name, group name, cluster name all 64 bytes */
|
/* host name, group name, cluster name all 64 bytes */
|
||||||
#define R2NM_MAX_NAME_LEN 64 /* __NEW_UTS_LEN */
|
#define R2NM_MAX_NAME_LEN 64 /* __NEW_UTS_LEN */
|
||||||
|
|
||||||
|
extern int r2nm_init(void);
|
||||||
|
|
||||||
#endif /* _RAMSTER_NODEMANAGER_H */
|
#endif /* _RAMSTER_NODEMANAGER_H */
|
||||||
|
@ -35,7 +35,8 @@
|
|||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#ifdef CONFIG_RAMSTER
|
#include <linux/export.h>
|
||||||
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -641,6 +642,7 @@ void *tmem_localify_get_pampd(struct tmem_pool *pool, struct tmem_oid *oidp,
|
|||||||
/* note, hashbucket remains locked */
|
/* note, hashbucket remains locked */
|
||||||
return pampd;
|
return pampd;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(tmem_localify_get_pampd);
|
||||||
|
|
||||||
void tmem_localify_finish(struct tmem_obj *obj, uint32_t index,
|
void tmem_localify_finish(struct tmem_obj *obj, uint32_t index,
|
||||||
void *pampd, void *saved_hb, bool delete)
|
void *pampd, void *saved_hb, bool delete)
|
||||||
@ -658,6 +660,7 @@ void tmem_localify_finish(struct tmem_obj *obj, uint32_t index,
|
|||||||
}
|
}
|
||||||
spin_unlock(&hb->lock);
|
spin_unlock(&hb->lock);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(tmem_localify_finish);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For ramster only. Helper function to support asynchronous tmem_get.
|
* For ramster only. Helper function to support asynchronous tmem_get.
|
||||||
@ -719,6 +722,7 @@ out:
|
|||||||
spin_unlock(&hb->lock);
|
spin_unlock(&hb->lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(tmem_replace);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -126,7 +126,7 @@ static inline unsigned tmem_oid_hash(struct tmem_oid *oidp)
|
|||||||
TMEM_HASH_BUCKET_BITS);
|
TMEM_HASH_BUCKET_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_RAMSTER
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
struct tmem_xhandle {
|
struct tmem_xhandle {
|
||||||
uint8_t client_id;
|
uint8_t client_id;
|
||||||
uint8_t xh_data_cksum;
|
uint8_t xh_data_cksum;
|
||||||
@ -171,7 +171,7 @@ struct tmem_obj {
|
|||||||
unsigned int objnode_tree_height;
|
unsigned int objnode_tree_height;
|
||||||
unsigned long objnode_count;
|
unsigned long objnode_count;
|
||||||
long pampd_count;
|
long pampd_count;
|
||||||
#ifdef CONFIG_RAMSTER
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
/*
|
/*
|
||||||
* for current design of ramster, all pages belonging to
|
* for current design of ramster, all pages belonging to
|
||||||
* an object reside on the same remotenode and extra is
|
* an object reside on the same remotenode and extra is
|
||||||
@ -215,7 +215,7 @@ struct tmem_pamops {
|
|||||||
uint32_t);
|
uint32_t);
|
||||||
void (*free)(void *, struct tmem_pool *,
|
void (*free)(void *, struct tmem_pool *,
|
||||||
struct tmem_oid *, uint32_t, bool);
|
struct tmem_oid *, uint32_t, bool);
|
||||||
#ifdef CONFIG_RAMSTER
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
void (*new_obj)(struct tmem_obj *);
|
void (*new_obj)(struct tmem_obj *);
|
||||||
void (*free_obj)(struct tmem_pool *, struct tmem_obj *, bool);
|
void (*free_obj)(struct tmem_pool *, struct tmem_obj *, bool);
|
||||||
void *(*repatriate_preload)(void *, struct tmem_pool *,
|
void *(*repatriate_preload)(void *, struct tmem_pool *,
|
||||||
@ -247,7 +247,7 @@ extern int tmem_flush_page(struct tmem_pool *, struct tmem_oid *,
|
|||||||
extern int tmem_flush_object(struct tmem_pool *, struct tmem_oid *);
|
extern int tmem_flush_object(struct tmem_pool *, struct tmem_oid *);
|
||||||
extern int tmem_destroy_pool(struct tmem_pool *);
|
extern int tmem_destroy_pool(struct tmem_pool *);
|
||||||
extern void tmem_new_pool(struct tmem_pool *, uint32_t);
|
extern void tmem_new_pool(struct tmem_pool *, uint32_t);
|
||||||
#ifdef CONFIG_RAMSTER
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
extern int tmem_replace(struct tmem_pool *, struct tmem_oid *, uint32_t index,
|
extern int tmem_replace(struct tmem_pool *, struct tmem_oid *, uint32_t index,
|
||||||
void *);
|
void *);
|
||||||
extern void *tmem_localify_get_pampd(struct tmem_pool *, struct tmem_oid *,
|
extern void *tmem_localify_get_pampd(struct tmem_pool *, struct tmem_oid *,
|
||||||
|
@ -37,8 +37,10 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#ifdef CONFIG_RAMSTER
|
#ifdef CONFIG_RAMSTER
|
||||||
static bool ramster_enabled __read_mostly;
|
static bool ramster_enabled __read_mostly;
|
||||||
|
static int disable_frontswap_selfshrink;
|
||||||
#else
|
#else
|
||||||
#define ramster_enabled false
|
#define ramster_enabled false
|
||||||
|
#define disable_frontswap_selfshrink 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __PG_WAS_ACTIVE
|
#ifndef __PG_WAS_ACTIVE
|
||||||
@ -81,8 +83,12 @@ static char *namestr __read_mostly = "zcache";
|
|||||||
(__GFP_FS | __GFP_NORETRY | __GFP_NOWARN | __GFP_NOMEMALLOC)
|
(__GFP_FS | __GFP_NORETRY | __GFP_NOWARN | __GFP_NOMEMALLOC)
|
||||||
|
|
||||||
/* crypto API for zcache */
|
/* crypto API for zcache */
|
||||||
|
#ifdef CONFIG_ZCACHE_MODULE
|
||||||
|
static char *zcache_comp_name = "lzo";
|
||||||
|
#else
|
||||||
#define ZCACHE_COMP_NAME_SZ CRYPTO_MAX_ALG_NAME
|
#define ZCACHE_COMP_NAME_SZ CRYPTO_MAX_ALG_NAME
|
||||||
static char zcache_comp_name[ZCACHE_COMP_NAME_SZ] __read_mostly;
|
static char zcache_comp_name[ZCACHE_COMP_NAME_SZ] __read_mostly;
|
||||||
|
#endif
|
||||||
static struct crypto_comp * __percpu *zcache_comp_pcpu_tfms __read_mostly;
|
static struct crypto_comp * __percpu *zcache_comp_pcpu_tfms __read_mostly;
|
||||||
|
|
||||||
enum comp_op {
|
enum comp_op {
|
||||||
@ -1576,9 +1582,9 @@ static struct cleancache_ops zcache_cleancache_ops = {
|
|||||||
.init_fs = zcache_cleancache_init_fs
|
.init_fs = zcache_cleancache_init_fs
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cleancache_ops zcache_cleancache_register_ops(void)
|
struct cleancache_ops *zcache_cleancache_register_ops(void)
|
||||||
{
|
{
|
||||||
struct cleancache_ops old_ops =
|
struct cleancache_ops *old_ops =
|
||||||
cleancache_register_ops(&zcache_cleancache_ops);
|
cleancache_register_ops(&zcache_cleancache_ops);
|
||||||
|
|
||||||
return old_ops;
|
return old_ops;
|
||||||
@ -1707,9 +1713,9 @@ static struct frontswap_ops zcache_frontswap_ops = {
|
|||||||
.init = zcache_frontswap_init
|
.init = zcache_frontswap_init
|
||||||
};
|
};
|
||||||
|
|
||||||
struct frontswap_ops zcache_frontswap_register_ops(void)
|
struct frontswap_ops *zcache_frontswap_register_ops(void)
|
||||||
{
|
{
|
||||||
struct frontswap_ops old_ops =
|
struct frontswap_ops *old_ops =
|
||||||
frontswap_register_ops(&zcache_frontswap_ops);
|
frontswap_register_ops(&zcache_frontswap_ops);
|
||||||
|
|
||||||
return old_ops;
|
return old_ops;
|
||||||
@ -1721,6 +1727,7 @@ struct frontswap_ops zcache_frontswap_register_ops(void)
|
|||||||
* OR NOTHING HAPPENS!
|
* OR NOTHING HAPPENS!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_ZCACHE_MODULE
|
||||||
static int __init enable_zcache(char *s)
|
static int __init enable_zcache(char *s)
|
||||||
{
|
{
|
||||||
zcache_enabled = true;
|
zcache_enabled = true;
|
||||||
@ -1787,18 +1794,27 @@ static int __init enable_zcache_compressor(char *s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__setup("zcache=", enable_zcache_compressor);
|
__setup("zcache=", enable_zcache_compressor);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int __init zcache_comp_init(void)
|
static int zcache_comp_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* check crypto algorithm */
|
/* check crypto algorithm */
|
||||||
|
#ifdef CONFIG_ZCACHE_MODULE
|
||||||
|
ret = crypto_has_comp(zcache_comp_name, 0, 0);
|
||||||
|
if (!ret) {
|
||||||
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (*zcache_comp_name != '\0') {
|
if (*zcache_comp_name != '\0') {
|
||||||
ret = crypto_has_comp(zcache_comp_name, 0, 0);
|
ret = crypto_has_comp(zcache_comp_name, 0, 0);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
pr_info("zcache: %s not supported\n",
|
pr_info("zcache: %s not supported\n",
|
||||||
zcache_comp_name);
|
zcache_comp_name);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if (!ret)
|
if (!ret)
|
||||||
strcpy(zcache_comp_name, "lzo");
|
strcpy(zcache_comp_name, "lzo");
|
||||||
@ -1807,6 +1823,7 @@ static int __init zcache_comp_init(void)
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
pr_info("zcache: using %s compressor\n", zcache_comp_name);
|
pr_info("zcache: using %s compressor\n", zcache_comp_name);
|
||||||
|
|
||||||
/* alloc percpu transforms */
|
/* alloc percpu transforms */
|
||||||
@ -1818,10 +1835,13 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init zcache_init(void)
|
static int zcache_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ZCACHE_MODULE
|
||||||
|
zcache_enabled = 1;
|
||||||
|
#endif
|
||||||
if (ramster_enabled) {
|
if (ramster_enabled) {
|
||||||
namestr = "ramster";
|
namestr = "ramster";
|
||||||
ramster_register_pamops(&zcache_pamops);
|
ramster_register_pamops(&zcache_pamops);
|
||||||
@ -1860,7 +1880,7 @@ static int __init zcache_init(void)
|
|||||||
}
|
}
|
||||||
zbud_init();
|
zbud_init();
|
||||||
if (zcache_enabled && !disable_cleancache) {
|
if (zcache_enabled && !disable_cleancache) {
|
||||||
struct cleancache_ops old_ops;
|
struct cleancache_ops *old_ops;
|
||||||
|
|
||||||
register_shrinker(&zcache_shrinker);
|
register_shrinker(&zcache_shrinker);
|
||||||
old_ops = zcache_cleancache_register_ops();
|
old_ops = zcache_cleancache_register_ops();
|
||||||
@ -1870,11 +1890,11 @@ static int __init zcache_init(void)
|
|||||||
pr_info("%s: cleancache: ignorenonactive = %d\n",
|
pr_info("%s: cleancache: ignorenonactive = %d\n",
|
||||||
namestr, !disable_cleancache_ignore_nonactive);
|
namestr, !disable_cleancache_ignore_nonactive);
|
||||||
#endif
|
#endif
|
||||||
if (old_ops.init_fs != NULL)
|
if (old_ops != NULL)
|
||||||
pr_warn("%s: cleancache_ops overridden\n", namestr);
|
pr_warn("%s: cleancache_ops overridden\n", namestr);
|
||||||
}
|
}
|
||||||
if (zcache_enabled && !disable_frontswap) {
|
if (zcache_enabled && !disable_frontswap) {
|
||||||
struct frontswap_ops old_ops;
|
struct frontswap_ops *old_ops;
|
||||||
|
|
||||||
old_ops = zcache_frontswap_register_ops();
|
old_ops = zcache_frontswap_register_ops();
|
||||||
if (frontswap_has_exclusive_gets)
|
if (frontswap_has_exclusive_gets)
|
||||||
@ -1886,14 +1906,36 @@ static int __init zcache_init(void)
|
|||||||
namestr, frontswap_has_exclusive_gets,
|
namestr, frontswap_has_exclusive_gets,
|
||||||
!disable_frontswap_ignore_nonactive);
|
!disable_frontswap_ignore_nonactive);
|
||||||
#endif
|
#endif
|
||||||
if (old_ops.init != NULL)
|
if (IS_ERR(old_ops) || old_ops) {
|
||||||
|
if (IS_ERR(old_ops))
|
||||||
|
return PTR_RET(old_ops);
|
||||||
pr_warn("%s: frontswap_ops overridden\n", namestr);
|
pr_warn("%s: frontswap_ops overridden\n", namestr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ramster_enabled)
|
if (ramster_enabled)
|
||||||
ramster_init(!disable_cleancache, !disable_frontswap,
|
ramster_init(!disable_cleancache, !disable_frontswap,
|
||||||
frontswap_has_exclusive_gets);
|
frontswap_has_exclusive_gets,
|
||||||
|
!disable_frontswap_selfshrink);
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ZCACHE_MODULE
|
||||||
|
#ifdef CONFIG_RAMSTER
|
||||||
|
module_param(ramster_enabled, int, S_IRUGO);
|
||||||
|
module_param(disable_frontswap_selfshrink, int, S_IRUGO);
|
||||||
|
#endif
|
||||||
|
module_param(disable_cleancache, int, S_IRUGO);
|
||||||
|
module_param(disable_frontswap, int, S_IRUGO);
|
||||||
|
#ifdef FRONTSWAP_HAS_EXCLUSIVE_GETS
|
||||||
|
module_param(frontswap_has_exclusive_gets, bool, S_IRUGO);
|
||||||
|
#endif
|
||||||
|
module_param(disable_frontswap_ignore_nonactive, int, S_IRUGO);
|
||||||
|
module_param(zcache_comp_name, charp, S_IRUGO);
|
||||||
|
module_init(zcache_init);
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Dan Magenheimer <dan.magenheimer@oracle.com>");
|
||||||
|
MODULE_DESCRIPTION("In-kernel compression of cleancache/frontswap pages");
|
||||||
|
#else
|
||||||
late_initcall(zcache_init);
|
late_initcall(zcache_init);
|
||||||
|
#endif
|
||||||
|
@ -39,7 +39,7 @@ extern int zcache_flush_page(int, int, struct tmem_oid *, uint32_t);
|
|||||||
extern int zcache_flush_object(int, int, struct tmem_oid *);
|
extern int zcache_flush_object(int, int, struct tmem_oid *);
|
||||||
extern void zcache_decompress_to_page(char *, unsigned int, struct page *);
|
extern void zcache_decompress_to_page(char *, unsigned int, struct page *);
|
||||||
|
|
||||||
#ifdef CONFIG_RAMSTER
|
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||||
extern void *zcache_pampd_create(char *, unsigned int, bool, int,
|
extern void *zcache_pampd_create(char *, unsigned int, bool, int,
|
||||||
struct tmem_handle *);
|
struct tmem_handle *);
|
||||||
int zcache_autocreate_pool(unsigned int cli_id, unsigned int pool_id, bool eph);
|
int zcache_autocreate_pool(unsigned int cli_id, unsigned int pool_id, bool eph);
|
||||||
|
@ -933,14 +933,11 @@ static int realtek_cr_autosuspend_setup(struct us_data *us)
|
|||||||
|
|
||||||
static void realtek_cr_destructor(void *extra)
|
static void realtek_cr_destructor(void *extra)
|
||||||
{
|
{
|
||||||
struct rts51x_chip *chip = (struct rts51x_chip *)extra;
|
struct rts51x_chip *chip = extra;
|
||||||
struct us_data *us;
|
|
||||||
|
|
||||||
if (!chip)
|
if (!chip)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
us = chip->us;
|
|
||||||
|
|
||||||
#ifdef CONFIG_REALTEK_AUTOPM
|
#ifdef CONFIG_REALTEK_AUTOPM
|
||||||
if (ss_en) {
|
if (ss_en) {
|
||||||
del_timer(&chip->rts51x_suspend_timer);
|
del_timer(&chip->rts51x_suspend_timer);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user