mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
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?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
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
|
||||
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
|
||||
@ -143,20 +143,20 @@ IMPORTANT: such. :IMPORTANT
|
||||
useful when you want to exit a program that will not let you switch consoles.
|
||||
(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
|
||||
and 'U'mount first.
|
||||
reboot(b) is good when you're unable to shut down. But you should also
|
||||
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.
|
||||
|
||||
'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
|
||||
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
|
||||
OK or Done message...)
|
||||
|
||||
'U'mount is basically useful in the same ways as 'S'ync. I generally 'S'ync,
|
||||
'U'mount, then re'B'oot when my system locks. It's saved me many a fsck.
|
||||
umount(u) is basically useful in the same ways as sync(s). I generally sync(s),
|
||||
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
|
||||
"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
|
||||
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
|
||||
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.
|
||||
|
||||
* Sometimes SysRq seems to get 'stuck' after using it, what can I do?
|
||||
|
@ -175,6 +175,7 @@ machine_power_off(void)
|
||||
void
|
||||
show_regs(struct pt_regs *regs)
|
||||
{
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
dik_show_regs(regs, NULL);
|
||||
}
|
||||
|
||||
|
@ -169,13 +169,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
||||
dik_show_trace(sp);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
show_stack(NULL, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
void
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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
|
||||
* Ofcourse just returning schedule( ) would be pointless so unwind until
|
||||
* the function is not in schedular code
|
||||
|
@ -71,7 +71,7 @@ void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@ -163,6 +163,7 @@ void show_regs(struct pt_regs *regs)
|
||||
return;
|
||||
|
||||
print_task_path_n_nm(tsk, buf);
|
||||
show_regs_print_info(KERN_INFO);
|
||||
|
||||
if (current->thread.cause_code)
|
||||
show_ecr_verbose(regs);
|
||||
|
@ -254,7 +254,7 @@ static void sysrq_etm_dump(int key)
|
||||
|
||||
static struct sysrq_key_op sysrq_etm_op = {
|
||||
.handler = sysrq_etm_dump,
|
||||
.help_msg = "ETM buffer dump",
|
||||
.help_msg = "etm-buffer-dump(v)",
|
||||
.action_msg = "etm",
|
||||
};
|
||||
|
||||
|
@ -225,11 +225,8 @@ void __show_regs(struct pt_regs *regs)
|
||||
unsigned long flags;
|
||||
char buf[64];
|
||||
|
||||
printk("CPU: %d %s (%s %.*s)\n",
|
||||
raw_smp_processor_id(), print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||
print_symbol("LR is at %s\n", regs->ARM_lr);
|
||||
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)
|
||||
{
|
||||
printk("\n");
|
||||
printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm);
|
||||
__show_regs(regs);
|
||||
dump_stack();
|
||||
}
|
||||
|
@ -204,13 +204,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||
}
|
||||
#endif
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
dump_backtrace(NULL, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
||||
{
|
||||
dump_backtrace(NULL, tsk);
|
||||
|
@ -145,11 +145,7 @@ void __show_regs(struct pt_regs *regs)
|
||||
{
|
||||
int i;
|
||||
|
||||
printk("CPU: %d %s (%s %.*s)\n",
|
||||
raw_smp_processor_id(), print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||
print_symbol("LR is at %s\n", regs->regs[30]);
|
||||
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)
|
||||
{
|
||||
printk("\n");
|
||||
printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm);
|
||||
__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)
|
||||
{
|
||||
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, "");
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
unsigned long stack;
|
||||
|
||||
show_trace_log_lvl(current, &stack, NULL, "");
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
static const char *cpu_modes[] = {
|
||||
"Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",
|
||||
"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 mode = (regs->sr & MODE_MASK) >> MODE_SHIFT;
|
||||
|
||||
show_regs_print_info(log_lvl);
|
||||
|
||||
if (!user_mode(regs)) {
|
||||
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_GM ? 'G' : 'g');
|
||||
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)
|
||||
|
@ -168,6 +168,7 @@ void dump_stack(void)
|
||||
#endif
|
||||
trace_buffer_save(tflags);
|
||||
dump_bfin_trace_buffer();
|
||||
dump_stack_print_info(KERN_DEFAULT);
|
||||
show_stack(current, &stack);
|
||||
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();
|
||||
|
||||
pr_notice("\n");
|
||||
show_regs_print_info(KERN_NOTICE);
|
||||
|
||||
if (CPUID != bfin_cpuid())
|
||||
pr_notice("Compiled for cpu family 0x%04x (Rev %d), "
|
||||
"but running on:0x%04x (Rev %d)\n",
|
||||
|
@ -31,6 +31,7 @@ void __init trap_init(void)
|
||||
void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
pr_err("\n");
|
||||
show_regs_print_info(KERN_ERR);
|
||||
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("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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
console_verbose();
|
||||
|
@ -176,6 +176,9 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
unsigned long usp = rdusp();
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx\n",
|
||||
regs->irp, regs->srp, regs->dccr, usp, regs->mof );
|
||||
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)
|
||||
{
|
||||
unsigned long usp = rdusp();
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("ERP: %08lx SRP: %08lx CCS: %08lx USP: %08lx MOF: %08lx\n",
|
||||
regs->erp, regs->srp, regs->ccs, usp, regs->mof);
|
||||
|
||||
|
@ -146,13 +146,6 @@ show_stack(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
dump_stack(void)
|
||||
{
|
||||
show_stack(NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
void
|
||||
set_nmi_handler(void (*handler)(struct pt_regs *))
|
||||
{
|
||||
|
@ -466,17 +466,6 @@ asmlinkage void compound_exception(unsigned long esfr1,
|
||||
BUG();
|
||||
} /* 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)
|
||||
{
|
||||
}
|
||||
@ -508,6 +497,7 @@ void show_regs(struct pt_regs *regs)
|
||||
int loop;
|
||||
|
||||
printk("\n");
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("Frame: @%08lx [%s]\n",
|
||||
(unsigned long) regs,
|
||||
@ -522,8 +512,6 @@ void show_regs(struct pt_regs *regs)
|
||||
else
|
||||
printk(" | ");
|
||||
}
|
||||
|
||||
printk("Process %s (pid: %d)\n", current->comm, current->pid);
|
||||
}
|
||||
|
||||
void die_if_kernel(const char *str, ...)
|
||||
|
@ -83,6 +83,8 @@ void machine_power_off(void)
|
||||
|
||||
void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("\nPC: %08lx Status: %02x",
|
||||
regs->pc, regs->ccr);
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
static struct {
|
||||
|
@ -33,6 +33,8 @@
|
||||
*/
|
||||
void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
show_regs_print_info(KERN_EMERG);
|
||||
|
||||
printk(KERN_EMERG "restart_r0: \t0x%08lx syscall_nr: %ld\n",
|
||||
regs->restart_r0, regs->syscall_nr);
|
||||
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
|
||||
show_regs (struct pt_regs *regs)
|
||||
{
|
||||
unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
|
||||
|
||||
print_modules();
|
||||
printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current),
|
||||
smp_processor_id(), current->comm);
|
||||
printk("\n");
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
|
||||
regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
|
||||
init_utsname()->release);
|
||||
|
@ -1063,6 +1063,7 @@ check_bugs (void)
|
||||
static int __init run_dmi_scan(void)
|
||||
{
|
||||
dmi_scan_machine();
|
||||
dmi_set_dump_stack_arch_desc();
|
||||
return 0;
|
||||
}
|
||||
core_initcall(run_dmi_scan);
|
||||
|
@ -73,6 +73,8 @@ void machine_power_off(void)
|
||||
void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
printk("\n");
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("BPC[%08lx]:PSW[%08lx]:LR [%08lx]:FP [%08lx]\n", \
|
||||
regs->bpc, regs->psw, regs->lr, regs->fp);
|
||||
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);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
unsigned long stack;
|
||||
|
||||
show_trace(current, &stack);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
static void show_registers(struct pt_regs *regs)
|
||||
{
|
||||
int i = 0;
|
||||
|
@ -991,18 +991,6 @@ void show_stack(struct task_struct *task, unsigned long *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 "fs" (Fault Status) bits on ColdFire. These are in the bottom
|
||||
|
@ -129,6 +129,8 @@ void show_regs(struct pt_regs *regs)
|
||||
"D1.7 "
|
||||
};
|
||||
|
||||
show_regs_print_info(KERN_INFO);
|
||||
|
||||
pr_info(" pt_regs @ %p\n", regs);
|
||||
pr_info(" SaveMask = 0x%04hx\n", regs->ctx.SaveMask);
|
||||
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);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
show_stack(NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
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(" r1=%08lX, r2=%08lX, r3=%08lX, r4=%08lX\n",
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
long i;
|
||||
@ -244,7 +231,7 @@ static void __show_regs(const struct pt_regs *regs)
|
||||
unsigned int cause = regs->cp0_cause;
|
||||
int i;
|
||||
|
||||
printk("Cpu %d\n", smp_processor_id());
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
/*
|
||||
* Saved main processor registers
|
||||
|
@ -97,6 +97,7 @@ void machine_power_off(void)
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
@ -90,6 +90,7 @@ void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
extern void show_registers(struct pt_regs *regs);
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
/* __PHX__ cleanup this mess */
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
|
@ -1,5 +1,6 @@
|
||||
config PARISC
|
||||
def_bool y
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select HAVE_IDE
|
||||
select HAVE_OPROFILE
|
||||
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.
|
||||
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
|
||||
|
@ -126,6 +126,8 @@ void show_regs(struct pt_regs *regs)
|
||||
user = user_mode(regs);
|
||||
level = user ? KERN_DEBUG : KERN_CRIT;
|
||||
|
||||
show_regs_print_info(level);
|
||||
|
||||
print_gr(level, regs);
|
||||
|
||||
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)
|
||||
{
|
||||
int i = 1;
|
||||
|
@ -831,6 +831,8 @@ void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
int i, trap;
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("NIP: "REG" LR: "REG" CTR: "REG"\n",
|
||||
regs->nip, regs->link, regs->ctr);
|
||||
printk("REGS: %p TRAP: %04lx %s (%s)\n",
|
||||
@ -850,12 +852,6 @@ void show_regs(struct pt_regs * regs)
|
||||
#else
|
||||
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
|
||||
#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++) {
|
||||
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);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
show_stack(current, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* Called with hard IRQs off */
|
||||
void __ppc64_runlatch_on(void)
|
||||
|
@ -2947,7 +2947,7 @@ static void sysrq_handle_xmon(int key)
|
||||
|
||||
static struct sysrq_key_op sysrq_xmon_op = {
|
||||
.handler = sysrq_handle_xmon,
|
||||
.help_msg = "Xmon",
|
||||
.help_msg = "xmon(x)",
|
||||
.action_msg = "Entering xmon",
|
||||
};
|
||||
|
||||
|
@ -91,6 +91,7 @@ config S390
|
||||
select ARCH_INLINE_WRITE_UNLOCK_BH
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_SAVE_PAGE_KEYS if HIBERNATION
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select BUILDTIME_EXTABLE_SORT
|
||||
|
@ -17,20 +17,6 @@ config STRICT_DEVMEM
|
||||
|
||||
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
|
||||
bool "Export kernel pagetable layout to userspace via debugfs"
|
||||
depends on DEBUG_KERNEL
|
||||
|
@ -129,23 +129,6 @@ static void show_last_breaking_event(struct pt_regs *regs)
|
||||
#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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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_regs_print_info(KERN_DEFAULT);
|
||||
show_registers(regs);
|
||||
/* Show stack backtrace if pt_regs is from kernel mode */
|
||||
if (!user_mode(regs))
|
||||
|
@ -3,7 +3,6 @@
|
||||
#
|
||||
|
||||
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_64BIT) += mem64.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)
|
||||
{
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
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[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");
|
||||
}
|
||||
|
||||
/*
|
||||
* 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,
|
||||
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));
|
||||
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)
|
||||
{
|
||||
printk("\n");
|
||||
printk("Pid : %d, Comm: \t\t%s\n", task_pid_nr(current), current->comm);
|
||||
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);
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||
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;
|
||||
|
||||
printk("\n");
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
ah = (regs->pc) >> 32;
|
||||
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];
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("PSR: %08lx PC: %08lx NPC: %08lx Y: %08lx %s\n",
|
||||
r->psr, r->pc, r->npc, r->y, print_tainted());
|
||||
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;
|
||||
int count = 0;
|
||||
|
||||
if (tsk != NULL)
|
||||
task_base = (unsigned long) task_stack_page(tsk);
|
||||
else
|
||||
task_base = (unsigned long) current_thread_info();
|
||||
if (!tsk)
|
||||
tsk = current;
|
||||
|
||||
if (tsk == current && !_ksp)
|
||||
__asm__ __volatile__("mov %%fp, %0" : "=r" (_ksp));
|
||||
|
||||
task_base = (unsigned long) task_stack_page(tsk);
|
||||
fp = (unsigned long) _ksp;
|
||||
do {
|
||||
/* Bogus frame pointer? */
|
||||
@ -162,17 +166,6 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
||||
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.
|
||||
*/
|
||||
|
@ -163,6 +163,8 @@ static void show_regwindow(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,
|
||||
regs->tpc, regs->tnpc, regs->y, print_tainted());
|
||||
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 = {
|
||||
.handler = sysrq_handle_globreg,
|
||||
.help_msg = "global-regs(Y)",
|
||||
.help_msg = "global-regs(y)",
|
||||
.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 = {
|
||||
.handler = sysrq_handle_globpmu,
|
||||
.help_msg = "global-pmu(X)",
|
||||
.help_msg = "global-pmu(x)",
|
||||
.action_msg = "Show Global PMU Regs",
|
||||
};
|
||||
|
||||
|
@ -2350,13 +2350,6 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
||||
} 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)
|
||||
{
|
||||
unsigned long fp = rw->ins[6];
|
||||
|
@ -45,4 +45,3 @@ obj-y += iomap.o
|
||||
obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o
|
||||
obj-y += ksyms.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 VIRT_TO_BUS
|
||||
select SYS_HYPERVISOR
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select MODULES_USE_ELF_RELA
|
||||
@ -114,13 +115,6 @@ config STRICT_DEVMEM
|
||||
config SMP
|
||||
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
|
||||
depends on TTY
|
||||
select HVC_DRIVER
|
||||
|
@ -395,7 +395,12 @@ _copy_from_user(void *to, const void __user *from, unsigned long 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)
|
||||
__compiletime_warning("copy_from_user() size is not provably correct");
|
||||
|
||||
|
@ -573,8 +573,7 @@ void show_regs(struct pt_regs *regs)
|
||||
int i;
|
||||
|
||||
pr_err("\n");
|
||||
pr_err(" Pid: %d, comm: %20s, CPU: %d\n",
|
||||
tsk->pid, tsk->comm, smp_processor_id());
|
||||
show_regs_print_info(KERN_ERR);
|
||||
#ifdef __tilegx__
|
||||
for (i = 0; i < 51; i += 3)
|
||||
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));
|
||||
}
|
||||
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
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
static const int kstack_depth_to_print = 24;
|
||||
|
||||
|
@ -11,6 +11,8 @@
|
||||
void show_regs(struct pt_regs_subarch *regs)
|
||||
{
|
||||
printk("\n");
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
printk("show_regs(): insert regs here.\n");
|
||||
#if 0
|
||||
printk("\n");
|
||||
|
@ -144,11 +144,7 @@ void __show_regs(struct pt_regs *regs)
|
||||
unsigned long flags;
|
||||
char buf[64];
|
||||
|
||||
printk(KERN_DEFAULT "CPU: %d %s (%s %.*s)\n",
|
||||
raw_smp_processor_id(), print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||
print_symbol("LR is at %s\n", regs->UCreg_lr);
|
||||
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);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
dump_backtrace(NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
void show_stack(struct task_struct *tsk, unsigned long *sp)
|
||||
{
|
||||
dump_backtrace(NULL, tsk);
|
||||
|
@ -20,6 +20,7 @@ config X86_64
|
||||
### Arch settings
|
||||
config X86
|
||||
def_bool y
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select HAVE_AOUT if X86_32
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||
|
@ -292,20 +292,6 @@ config OPTIMIZE_INLINING
|
||||
|
||||
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
|
||||
bool "NMI Selftest"
|
||||
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();
|
||||
set_fs(KERNEL_DS);
|
||||
has_dumped = 1;
|
||||
current->flags |= PF_DUMPCORE;
|
||||
strncpy(dump.u_comm, current->comm, sizeof(current->comm));
|
||||
dump.u_ar0 = offsetof(struct user32, regs);
|
||||
dump.signal = signr;
|
||||
|
@ -37,7 +37,4 @@ do { \
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
|
||||
extern void show_regs_common(void);
|
||||
|
||||
#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)
|
||||
{
|
||||
show_stack_log_lvl(task, NULL, sp, 0, "");
|
||||
}
|
||||
|
||||
/*
|
||||
* The architecture-independent dump_stack generator
|
||||
*/
|
||||
void dump_stack(void)
|
||||
{
|
||||
unsigned long bp;
|
||||
unsigned long bp = 0;
|
||||
unsigned long stack;
|
||||
|
||||
bp = stack_frame(current, NULL);
|
||||
printk("Pid: %d, comm: %.20s %s %s %.*s\n",
|
||||
current->pid, current->comm, print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
show_trace(NULL, NULL, &stack, bp);
|
||||
/*
|
||||
* Stack frames below this one aren't interesting. Don't show them
|
||||
* if we're printing for %current.
|
||||
*/
|
||||
if (!sp && (!task || task == current)) {
|
||||
sp = &stack;
|
||||
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 int die_owner = -1;
|
||||
|
@ -86,11 +86,9 @@ void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
int i;
|
||||
|
||||
show_regs_print_info(KERN_EMERG);
|
||||
__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
|
||||
* time of the fault..
|
||||
|
@ -249,14 +249,10 @@ void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
int i;
|
||||
unsigned long sp;
|
||||
const int cpu = smp_processor_id();
|
||||
struct task_struct *cur = current;
|
||||
|
||||
sp = regs->sp;
|
||||
printk("CPU %d ", cpu);
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
__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
|
||||
|
@ -121,30 +121,6 @@ void exit_thread(void)
|
||||
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)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
@ -84,8 +84,6 @@ void __show_regs(struct pt_regs *regs, int all)
|
||||
savesegment(gs, gs);
|
||||
}
|
||||
|
||||
show_regs_common();
|
||||
|
||||
printk(KERN_DEFAULT "EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n",
|
||||
(u16)regs->cs, regs->ip, regs->flags,
|
||||
smp_processor_id());
|
||||
|
@ -62,7 +62,6 @@ void __show_regs(struct pt_regs *regs, int all)
|
||||
unsigned int fsindex, gsindex;
|
||||
unsigned int ds, cs, es;
|
||||
|
||||
show_regs_common();
|
||||
printk(KERN_DEFAULT "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
|
||||
printk_address(regs->ip, 1);
|
||||
printk(KERN_DEFAULT "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
|
||||
|
@ -996,6 +996,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
efi_init();
|
||||
|
||||
dmi_scan_machine();
|
||||
dmi_set_dump_stack_arch_desc();
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
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;
|
||||
|
||||
show_regs_print_info(KERN_DEFAULT);
|
||||
|
||||
wmask = regs->wmask & ~1;
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
@ -481,14 +483,6 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
||||
show_trace(task, stack);
|
||||
}
|
||||
|
||||
void dump_stack(void)
|
||||
{
|
||||
show_stack(current, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
|
||||
void show_code(unsigned int *pc)
|
||||
{
|
||||
long i;
|
||||
|
@ -120,6 +120,8 @@ source "drivers/vfio/Kconfig"
|
||||
|
||||
source "drivers/vlynq/Kconfig"
|
||||
|
||||
source "drivers/virt/Kconfig"
|
||||
|
||||
source "drivers/virtio/Kconfig"
|
||||
|
||||
source "drivers/hv/Kconfig"
|
||||
@ -144,8 +146,6 @@ source "drivers/remoteproc/Kconfig"
|
||||
|
||||
source "drivers/rpmsg/Kconfig"
|
||||
|
||||
source "drivers/virt/Kconfig"
|
||||
|
||||
source "drivers/devfreq/Kconfig"
|
||||
|
||||
source "drivers/extcon/Kconfig"
|
||||
|
@ -139,13 +139,12 @@ bail: spin_unlock_irqrestore(&emsgs_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
mp = kmalloc(n, GFP_ATOMIC);
|
||||
mp = kmemdup(msg, n, GFP_ATOMIC);
|
||||
if (mp == NULL) {
|
||||
printk(KERN_ERR "aoe: allocation failure, len=%ld\n", n);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
memcpy(mp, msg, n);
|
||||
em->msg = mp;
|
||||
em->flags |= EMFL_VALID;
|
||||
em->len = n;
|
||||
|
@ -856,6 +856,8 @@ static int __init nbd_init(void)
|
||||
disk->queue->limits.discard_granularity = 512;
|
||||
disk->queue->limits.max_discard_sectors = UINT_MAX;
|
||||
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")) {
|
||||
|
@ -1485,6 +1485,7 @@ unsigned int get_random_int(void)
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_random_int);
|
||||
|
||||
/*
|
||||
* randomize_range() returns a start address such that
|
||||
|
@ -22,6 +22,9 @@ static u16 __initdata dmi_ver;
|
||||
*/
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
if (!info)
|
||||
return;
|
||||
return c;
|
||||
|
||||
for (p = info; *p; p++)
|
||||
if (isprint(*p))
|
||||
printk(KERN_CONT "%c", *p);
|
||||
c += scnprintf(buf + c, len - c, "%c", *p);
|
||||
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 */
|
||||
|
||||
printk(KERN_DEBUG "DMI: ");
|
||||
print_filtered(dmi_get_system_info(DMI_SYS_VENDOR));
|
||||
printk(KERN_CONT " ");
|
||||
print_filtered(dmi_get_system_info(DMI_PRODUCT_NAME));
|
||||
c += print_filtered(buf + c, len - c,
|
||||
dmi_get_system_info(DMI_SYS_VENDOR));
|
||||
c += scnprintf(buf + c, len - c, " ");
|
||||
c += print_filtered(buf + c, len - c,
|
||||
dmi_get_system_info(DMI_PRODUCT_NAME));
|
||||
|
||||
board = dmi_get_system_info(DMI_BOARD_NAME);
|
||||
if (board) {
|
||||
printk(KERN_CONT "/");
|
||||
print_filtered(board);
|
||||
c += scnprintf(buf + c, len - c, "/");
|
||||
c += print_filtered(buf + c, len - c, board);
|
||||
}
|
||||
printk(KERN_CONT ", BIOS ");
|
||||
print_filtered(dmi_get_system_info(DMI_BIOS_VERSION));
|
||||
printk(KERN_CONT " ");
|
||||
print_filtered(dmi_get_system_info(DMI_BIOS_DATE));
|
||||
printk(KERN_CONT "\n");
|
||||
c += scnprintf(buf + c, len - c, ", BIOS ");
|
||||
c += print_filtered(buf + c, len - c,
|
||||
dmi_get_system_info(DMI_BIOS_VERSION));
|
||||
c += scnprintf(buf + c, len - c, " ");
|
||||
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 (dmi_checksum(buf, 15)) {
|
||||
if (memcmp(buf, "_SM_", 4) == 0 &&
|
||||
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_len = (buf[7] << 8) | buf[6];
|
||||
dmi_base = (buf[11] << 24) | (buf[10] << 16) |
|
||||
(buf[9] << 8) | buf[8];
|
||||
|
||||
if (dmi_walk_early(dmi_decode) == 0) {
|
||||
if (dmi_ver)
|
||||
if (smbios_ver) {
|
||||
dmi_ver = smbios_ver;
|
||||
pr_info("SMBIOS %d.%d present.\n",
|
||||
dmi_ver >> 8, dmi_ver & 0xFF);
|
||||
else {
|
||||
} else {
|
||||
dmi_ver = (buf[14] & 0xF0) << 4 |
|
||||
(buf[14] & 0x0F);
|
||||
pr_info("Legacy DMI %d.%d present.\n",
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
void __init dmi_scan_machine(void)
|
||||
{
|
||||
char __iomem *p, *q;
|
||||
int rc;
|
||||
char buf[32];
|
||||
|
||||
if (efi_enabled(EFI_CONFIG_TABLES)) {
|
||||
if (efi.smbios == EFI_INVALID_TABLE_ADDR)
|
||||
@ -481,10 +488,10 @@ void __init dmi_scan_machine(void)
|
||||
p = dmi_ioremap(efi.smbios, 32);
|
||||
if (p == NULL)
|
||||
goto error;
|
||||
|
||||
rc = smbios_present(p);
|
||||
memcpy_fromio(buf, p, 32);
|
||||
dmi_iounmap(p, 32);
|
||||
if (!rc) {
|
||||
|
||||
if (!dmi_present(buf)) {
|
||||
dmi_available = 1;
|
||||
goto out;
|
||||
}
|
||||
@ -499,18 +506,15 @@ void __init dmi_scan_machine(void)
|
||||
if (p == NULL)
|
||||
goto error;
|
||||
|
||||
memset(buf, 0, 16);
|
||||
for (q = p; q < p + 0x10000; q += 16) {
|
||||
if (memcmp(q, "_SM_", 4) == 0 && q - p <= 0xFFE0)
|
||||
rc = smbios_present(q);
|
||||
else if (memcmp(q, "_DMI_", 5) == 0)
|
||||
rc = dmi_present(q);
|
||||
else
|
||||
continue;
|
||||
if (!rc) {
|
||||
memcpy_fromio(buf + 16, q, 16);
|
||||
if (!dmi_present(buf)) {
|
||||
dmi_available = 1;
|
||||
dmi_iounmap(p, 0x10000);
|
||||
goto out;
|
||||
}
|
||||
memcpy(buf, buf + 16, 16);
|
||||
}
|
||||
dmi_iounmap(p, 0x10000);
|
||||
}
|
||||
@ -520,6 +524,19 @@ void __init dmi_scan_machine(void)
|
||||
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: 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);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int r592_suspend(struct device *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);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SIMPLE_DEV_PM_OPS(r592_pm_ops, r592_suspend, r592_resume);
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(r592_pm_ops, r592_suspend, r592_resume);
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, r592_pci_id_tbl);
|
||||
|
||||
static struct pci_driver r852_pci_driver = {
|
||||
@ -881,9 +881,7 @@ static struct pci_driver r852_pci_driver = {
|
||||
.id_table = r592_pci_id_tbl,
|
||||
.probe = r592_probe,
|
||||
.remove = r592_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.driver.pm = &r592_pm_ops,
|
||||
#endif
|
||||
};
|
||||
|
||||
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 *= 4;
|
||||
if (size > sizeof(rmsg)) {
|
||||
rcode = -EINVAL;
|
||||
goto sg_list_cleanup;
|
||||
}
|
||||
|
||||
/* Copy in the user's I2O command */
|
||||
if (copy_from_user(rmsg, user_msg, size)) {
|
||||
rcode = -EFAULT;
|
||||
@ -922,6 +927,11 @@ static int i2o_cfg_passthru(unsigned long arg)
|
||||
}
|
||||
size = size >> 16;
|
||||
size *= 4;
|
||||
if (size > sizeof(rmsg)) {
|
||||
rcode = -EFAULT;
|
||||
goto sg_list_cleanup;
|
||||
}
|
||||
|
||||
/* Copy in the user's I2O command */
|
||||
if (copy_from_user(rmsg, user_msg, size)) {
|
||||
rcode = -EFAULT;
|
||||
|
@ -245,7 +245,7 @@ static void emac_sysrq_handler(int key)
|
||||
|
||||
static struct sysrq_key_op emac_sysrq_op = {
|
||||
.handler = emac_sysrq_handler,
|
||||
.help_msg = "emaC",
|
||||
.help_msg = "emac(c)",
|
||||
.action_msg = "Show EMAC(s) status",
|
||||
};
|
||||
|
||||
|
@ -20,10 +20,10 @@ config PPS
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called pps_core.ko.
|
||||
if PPS
|
||||
|
||||
config PPS_DEBUG
|
||||
bool "PPS debugging messages"
|
||||
depends on PPS
|
||||
help
|
||||
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
|
||||
@ -31,13 +31,15 @@ config PPS_DEBUG
|
||||
|
||||
config NTP_PPS
|
||||
bool "PPS kernel consumer support"
|
||||
depends on PPS && !NO_HZ
|
||||
depends on !NO_HZ
|
||||
help
|
||||
This option adds support for direct in-kernel time
|
||||
synchronization using an external PPS signal.
|
||||
|
||||
It doesn't work on tickless systems at the moment.
|
||||
|
||||
endif
|
||||
|
||||
source drivers/pps/clients/Kconfig
|
||||
|
||||
source drivers/pps/generators/Kconfig
|
||||
|
@ -34,10 +34,10 @@
|
||||
*/
|
||||
|
||||
/* 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 */
|
||||
struct pps_device *pps_kc_hardpps_dev; /* unique pointer to device */
|
||||
int pps_kc_hardpps_mode; /* mode bits for kernel consumer */
|
||||
static struct pps_device *pps_kc_hardpps_dev; /* unique pointer to device */
|
||||
static int pps_kc_hardpps_mode; /* mode bits for kernel consumer */
|
||||
|
||||
/* pps_kc_bind - control PPS kernel consumer binding
|
||||
* @pps: the PPS source
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/string_helpers.h>
|
||||
#include <linux/sysfs.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);
|
||||
strncpy(tmp, ptr, bytes);
|
||||
tmp[bytes] = '\0';
|
||||
spk_xlate(tmp);
|
||||
string_unescape_any_inplace(tmp);
|
||||
synth_printf("%s", tmp);
|
||||
ptr += bytes;
|
||||
len -= bytes;
|
||||
@ -605,7 +606,8 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
if (param->data == NULL)
|
||||
return 0;
|
||||
ret = 0;
|
||||
cp = spk_xlate((char *) buf);
|
||||
cp = (char *)buf;
|
||||
string_unescape_any_inplace(cp);
|
||||
|
||||
spk_lock(flags);
|
||||
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 char *spk_strlwr(char *s);
|
||||
extern char *spk_s2uchar(char *start, char *dest);
|
||||
extern char *spk_xlate(char *s);
|
||||
extern int speakup_kobj_init(void);
|
||||
extern void speakup_kobj_exit(void);
|
||||
extern int spk_chartab_get_value(char *keyword);
|
||||
|
@ -328,49 +328,3 @@ char *spk_s2uchar(char *start, char *dest)
|
||||
*dest = (u_char)val;
|
||||
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
|
||||
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
|
||||
select CRYPTO_LZO
|
||||
default n
|
||||
@ -19,8 +19,8 @@ config ZCACHE_DEBUG
|
||||
how zcache is doing. You probably want to set this to 'N'.
|
||||
|
||||
config RAMSTER
|
||||
bool "Cross-machine RAM capacity sharing, aka peer-to-peer tmem"
|
||||
depends on CONFIGFS_FS=y && SYSFS=y && !HIGHMEM && ZCACHE=y
|
||||
tristate "Cross-machine RAM capacity sharing, aka peer-to-peer tmem"
|
||||
depends on CONFIGFS_FS=y && SYSFS=y && !HIGHMEM && ZCACHE
|
||||
depends on NET
|
||||
# must ensure struct page is 8-byte aligned
|
||||
select HAVE_ALIGNED_STRUCT_PAGE if !64BIT
|
||||
|
@ -11,10 +11,14 @@
|
||||
#ifndef _ZCACHE_RAMSTER_H_
|
||||
#define _ZCACHE_RAMSTER_H_
|
||||
|
||||
#ifdef CONFIG_RAMSTER_MODULE
|
||||
#define CONFIG_RAMSTER
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RAMSTER
|
||||
#include "ramster/ramster.h"
|
||||
#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
|
||||
|
||||
int __init ramster_debugfs_init(void)
|
||||
int ramster_debugfs_init(void)
|
||||
{
|
||||
int i;
|
||||
struct dentry *root = debugfs_create_dir("ramster", NULL);
|
||||
|
@ -949,7 +949,7 @@ static void __exit exit_r2nm(void)
|
||||
r2hb_exit();
|
||||
}
|
||||
|
||||
static int __init init_r2nm(void)
|
||||
int r2nm_init(void)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
@ -986,10 +986,11 @@ out_r2hb:
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(r2nm_init);
|
||||
|
||||
MODULE_AUTHOR("Oracle");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/* module_init(init_r2nm) */
|
||||
late_initcall(init_r2nm);
|
||||
/* module_exit(exit_r2nm) */
|
||||
#ifndef CONFIG_RAMSTER_MODULE
|
||||
late_initcall(r2nm_init);
|
||||
#endif
|
||||
|
@ -121,6 +121,7 @@ int ramster_do_preload_flnode(struct tmem_pool *pool)
|
||||
kmem_cache_free(ramster_flnode_cache, flnode);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ramster_do_preload_flnode);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ramster_pampd_free);
|
||||
|
||||
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
|
||||
@ -593,7 +596,7 @@ requeue:
|
||||
ramster_remotify_queue_delayed_work(HZ);
|
||||
}
|
||||
|
||||
void __init ramster_remotify_init(void)
|
||||
void ramster_remotify_init(void)
|
||||
{
|
||||
unsigned long n = 60UL;
|
||||
ramster_remotify_workqueue =
|
||||
@ -768,8 +771,10 @@ static bool frontswap_selfshrinking __read_mostly;
|
||||
static void selfshrink_process(struct work_struct *work);
|
||||
static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process);
|
||||
|
||||
#ifndef CONFIG_RAMSTER_MODULE
|
||||
/* 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
|
||||
@ -824,6 +829,7 @@ static void frontswap_selfshrink(void)
|
||||
frontswap_shrink(tgt_frontswap_pages);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_RAMSTER_MODULE
|
||||
static int __init ramster_nofrontswap_selfshrink_setup(char *s)
|
||||
{
|
||||
use_frontswap_selfshrink = false;
|
||||
@ -831,6 +837,7 @@ static int __init ramster_nofrontswap_selfshrink_setup(char *s)
|
||||
}
|
||||
|
||||
__setup("noselfshrink", ramster_nofrontswap_selfshrink_setup);
|
||||
#endif
|
||||
|
||||
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_remoteputmem2, cpu) = p2;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ramster_cpu_up);
|
||||
|
||||
void ramster_cpu_down(int cpu)
|
||||
{
|
||||
@ -864,6 +872,7 @@ void ramster_cpu_down(int cpu)
|
||||
kp->flnode = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ramster_cpu_down);
|
||||
|
||||
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_preload = ramster_pampd_repatriate_preload;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ramster_register_pamops);
|
||||
|
||||
void __init ramster_init(bool cleancache, bool frontswap,
|
||||
bool frontswap_exclusive_gets)
|
||||
void ramster_init(bool cleancache, bool frontswap,
|
||||
bool frontswap_exclusive_gets,
|
||||
bool frontswap_selfshrink)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -891,10 +902,17 @@ void __init ramster_init(bool cleancache, bool frontswap,
|
||||
if (ret)
|
||||
pr_err("ramster: can't create sysfs for ramster\n");
|
||||
(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);
|
||||
ramster_flnode_cache = kmem_cache_create("ramster_flnode",
|
||||
sizeof(struct flushlist_node), 0, 0, NULL);
|
||||
frontswap_selfshrinking = use_frontswap_selfshrink;
|
||||
if (frontswap_selfshrinking) {
|
||||
pr_info("ramster: Initializing frontswap selfshrink driver.\n");
|
||||
schedule_delayed_work(&selfshrink_worker,
|
||||
@ -902,3 +920,4 @@ void __init ramster_init(bool cleancache, bool frontswap,
|
||||
}
|
||||
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 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 int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *,
|
||||
unsigned int, void *);
|
||||
|
@ -36,4 +36,6 @@
|
||||
/* host name, group name, cluster name all 64 bytes */
|
||||
#define R2NM_MAX_NAME_LEN 64 /* __NEW_UTS_LEN */
|
||||
|
||||
extern int r2nm_init(void);
|
||||
|
||||
#endif /* _RAMSTER_NODEMANAGER_H */
|
||||
|
@ -35,7 +35,8 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/atomic.h>
|
||||
#ifdef CONFIG_RAMSTER
|
||||
#include <linux/export.h>
|
||||
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||
#include <linux/delay.h>
|
||||
#endif
|
||||
|
||||
@ -641,6 +642,7 @@ void *tmem_localify_get_pampd(struct tmem_pool *pool, struct tmem_oid *oidp,
|
||||
/* note, hashbucket remains locked */
|
||||
return pampd;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmem_localify_get_pampd);
|
||||
|
||||
void tmem_localify_finish(struct tmem_obj *obj, uint32_t index,
|
||||
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);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmem_localify_finish);
|
||||
|
||||
/*
|
||||
* For ramster only. Helper function to support asynchronous tmem_get.
|
||||
@ -719,6 +722,7 @@ out:
|
||||
spin_unlock(&hb->lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmem_replace);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -126,7 +126,7 @@ static inline unsigned tmem_oid_hash(struct tmem_oid *oidp)
|
||||
TMEM_HASH_BUCKET_BITS);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RAMSTER
|
||||
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||
struct tmem_xhandle {
|
||||
uint8_t client_id;
|
||||
uint8_t xh_data_cksum;
|
||||
@ -171,7 +171,7 @@ struct tmem_obj {
|
||||
unsigned int objnode_tree_height;
|
||||
unsigned long objnode_count;
|
||||
long pampd_count;
|
||||
#ifdef CONFIG_RAMSTER
|
||||
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||
/*
|
||||
* for current design of ramster, all pages belonging to
|
||||
* an object reside on the same remotenode and extra is
|
||||
@ -215,7 +215,7 @@ struct tmem_pamops {
|
||||
uint32_t);
|
||||
void (*free)(void *, struct tmem_pool *,
|
||||
struct tmem_oid *, uint32_t, bool);
|
||||
#ifdef CONFIG_RAMSTER
|
||||
#if defined(CONFIG_RAMSTER) || defined(CONFIG_RAMSTER_MODULE)
|
||||
void (*new_obj)(struct tmem_obj *);
|
||||
void (*free_obj)(struct tmem_pool *, struct tmem_obj *, bool);
|
||||
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_destroy_pool(struct tmem_pool *);
|
||||
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,
|
||||
void *);
|
||||
extern void *tmem_localify_get_pampd(struct tmem_pool *, struct tmem_oid *,
|
||||
|
@ -37,8 +37,10 @@
|
||||
#include "debug.h"
|
||||
#ifdef CONFIG_RAMSTER
|
||||
static bool ramster_enabled __read_mostly;
|
||||
static int disable_frontswap_selfshrink;
|
||||
#else
|
||||
#define ramster_enabled false
|
||||
#define disable_frontswap_selfshrink 0
|
||||
#endif
|
||||
|
||||
#ifndef __PG_WAS_ACTIVE
|
||||
@ -81,8 +83,12 @@ static char *namestr __read_mostly = "zcache";
|
||||
(__GFP_FS | __GFP_NORETRY | __GFP_NOWARN | __GFP_NOMEMALLOC)
|
||||
|
||||
/* crypto API for zcache */
|
||||
#ifdef CONFIG_ZCACHE_MODULE
|
||||
static char *zcache_comp_name = "lzo";
|
||||
#else
|
||||
#define ZCACHE_COMP_NAME_SZ CRYPTO_MAX_ALG_NAME
|
||||
static char zcache_comp_name[ZCACHE_COMP_NAME_SZ] __read_mostly;
|
||||
#endif
|
||||
static struct crypto_comp * __percpu *zcache_comp_pcpu_tfms __read_mostly;
|
||||
|
||||
enum comp_op {
|
||||
@ -1576,9 +1582,9 @@ static struct cleancache_ops zcache_cleancache_ops = {
|
||||
.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);
|
||||
|
||||
return old_ops;
|
||||
@ -1707,9 +1713,9 @@ static struct frontswap_ops zcache_frontswap_ops = {
|
||||
.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);
|
||||
|
||||
return old_ops;
|
||||
@ -1721,6 +1727,7 @@ struct frontswap_ops zcache_frontswap_register_ops(void)
|
||||
* OR NOTHING HAPPENS!
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_ZCACHE_MODULE
|
||||
static int __init enable_zcache(char *s)
|
||||
{
|
||||
zcache_enabled = true;
|
||||
@ -1787,18 +1794,27 @@ static int __init enable_zcache_compressor(char *s)
|
||||
return 1;
|
||||
}
|
||||
__setup("zcache=", enable_zcache_compressor);
|
||||
#endif
|
||||
|
||||
|
||||
static int __init zcache_comp_init(void)
|
||||
static int zcache_comp_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
/* 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') {
|
||||
ret = crypto_has_comp(zcache_comp_name, 0, 0);
|
||||
if (!ret)
|
||||
pr_info("zcache: %s not supported\n",
|
||||
zcache_comp_name);
|
||||
goto out;
|
||||
}
|
||||
if (!ret)
|
||||
strcpy(zcache_comp_name, "lzo");
|
||||
@ -1807,6 +1823,7 @@ static int __init zcache_comp_init(void)
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
pr_info("zcache: using %s compressor\n", zcache_comp_name);
|
||||
|
||||
/* alloc percpu transforms */
|
||||
@ -1818,10 +1835,13 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __init zcache_init(void)
|
||||
static int zcache_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#ifdef CONFIG_ZCACHE_MODULE
|
||||
zcache_enabled = 1;
|
||||
#endif
|
||||
if (ramster_enabled) {
|
||||
namestr = "ramster";
|
||||
ramster_register_pamops(&zcache_pamops);
|
||||
@ -1860,7 +1880,7 @@ static int __init zcache_init(void)
|
||||
}
|
||||
zbud_init();
|
||||
if (zcache_enabled && !disable_cleancache) {
|
||||
struct cleancache_ops old_ops;
|
||||
struct cleancache_ops *old_ops;
|
||||
|
||||
register_shrinker(&zcache_shrinker);
|
||||
old_ops = zcache_cleancache_register_ops();
|
||||
@ -1870,11 +1890,11 @@ static int __init zcache_init(void)
|
||||
pr_info("%s: cleancache: ignorenonactive = %d\n",
|
||||
namestr, !disable_cleancache_ignore_nonactive);
|
||||
#endif
|
||||
if (old_ops.init_fs != NULL)
|
||||
if (old_ops != NULL)
|
||||
pr_warn("%s: cleancache_ops overridden\n", namestr);
|
||||
}
|
||||
if (zcache_enabled && !disable_frontswap) {
|
||||
struct frontswap_ops old_ops;
|
||||
struct frontswap_ops *old_ops;
|
||||
|
||||
old_ops = zcache_frontswap_register_ops();
|
||||
if (frontswap_has_exclusive_gets)
|
||||
@ -1886,14 +1906,36 @@ static int __init zcache_init(void)
|
||||
namestr, frontswap_has_exclusive_gets,
|
||||
!disable_frontswap_ignore_nonactive);
|
||||
#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);
|
||||
}
|
||||
}
|
||||
if (ramster_enabled)
|
||||
ramster_init(!disable_cleancache, !disable_frontswap,
|
||||
frontswap_has_exclusive_gets);
|
||||
frontswap_has_exclusive_gets,
|
||||
!disable_frontswap_selfshrink);
|
||||
out:
|
||||
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);
|
||||
#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 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,
|
||||
struct tmem_handle *);
|
||||
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)
|
||||
{
|
||||
struct rts51x_chip *chip = (struct rts51x_chip *)extra;
|
||||
struct us_data *us;
|
||||
struct rts51x_chip *chip = extra;
|
||||
|
||||
if (!chip)
|
||||
return;
|
||||
|
||||
us = chip->us;
|
||||
|
||||
#ifdef CONFIG_REALTEK_AUTOPM
|
||||
if (ss_en) {
|
||||
del_timer(&chip->rts51x_suspend_timer);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user