diff options
| author | Andi Kleen <ak@suse.de> | 2006-06-26 07:56:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:48:16 -0400 |
| commit | bebfa1013eee1d91b3242e5801cc8fbdfaf148ec (patch) | |
| tree | d1abf916c29bbb5c312717f57798987268aff9a9 | |
| parent | f201611fcecdfa825471dc425ee007997228fae4 (diff) | |
[PATCH] x86_64: Add compat_printk and sysctl to turn off compat layer warnings
Sometimes e.g. with crashme the compat layer warnings can be noisy.
Add a way to turn them off by gating all output through compat_printk
that checks a global sysctl. The default is not changed.
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | arch/x86_64/ia32/sys_ia32.c | 4 | ||||
| -rw-r--r-- | fs/compat.c | 16 | ||||
| -rw-r--r-- | include/linux/compat.h | 2 | ||||
| -rw-r--r-- | include/linux/sysctl.h | 2 | ||||
| -rw-r--r-- | kernel/sysctl.c | 11 |
5 files changed, 32 insertions, 3 deletions
diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index f182b20858e2..ee30557629dc 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c | |||
| @@ -514,7 +514,7 @@ int sys32_ni_syscall(int call) | |||
| 514 | static char lastcomm[sizeof(me->comm)]; | 514 | static char lastcomm[sizeof(me->comm)]; |
| 515 | 515 | ||
| 516 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { | 516 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { |
| 517 | printk(KERN_INFO "IA32 syscall %d from %s not implemented\n", | 517 | compat_printk(KERN_INFO "IA32 syscall %d from %s not implemented\n", |
| 518 | call, me->comm); | 518 | call, me->comm); |
| 519 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); | 519 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); |
| 520 | } | 520 | } |
| @@ -916,7 +916,7 @@ long sys32_vm86_warning(void) | |||
| 916 | struct task_struct *me = current; | 916 | struct task_struct *me = current; |
| 917 | static char lastcomm[sizeof(me->comm)]; | 917 | static char lastcomm[sizeof(me->comm)]; |
| 918 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { | 918 | if (strncmp(lastcomm, me->comm, sizeof(lastcomm))) { |
| 919 | printk(KERN_INFO "%s: vm86 mode not supported on 64 bit kernel\n", | 919 | compat_printk(KERN_INFO "%s: vm86 mode not supported on 64 bit kernel\n", |
| 920 | me->comm); | 920 | me->comm); |
| 921 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); | 921 | strncpy(lastcomm, me->comm, sizeof(lastcomm)); |
| 922 | } | 922 | } |
diff --git a/fs/compat.c b/fs/compat.c index 7e7e5bc4f3cf..e31e9cf96647 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -55,6 +55,20 @@ | |||
| 55 | 55 | ||
| 56 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | 56 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); |
| 57 | 57 | ||
| 58 | int compat_log = 1; | ||
| 59 | |||
| 60 | int compat_printk(const char *fmt, ...) | ||
| 61 | { | ||
| 62 | va_list ap; | ||
| 63 | int ret; | ||
| 64 | if (!compat_log) | ||
| 65 | return 0; | ||
| 66 | va_start(ap, fmt); | ||
| 67 | ret = vprintk(fmt, ap); | ||
| 68 | va_end(ap); | ||
| 69 | return ret; | ||
| 70 | } | ||
| 71 | |||
| 58 | /* | 72 | /* |
| 59 | * Not all architectures have sys_utime, so implement this in terms | 73 | * Not all architectures have sys_utime, so implement this in terms |
| 60 | * of sys_utimes. | 74 | * of sys_utimes. |
| @@ -359,7 +373,7 @@ static void compat_ioctl_error(struct file *filp, unsigned int fd, | |||
| 359 | sprintf(buf,"'%c'", (cmd>>24) & 0x3f); | 373 | sprintf(buf,"'%c'", (cmd>>24) & 0x3f); |
| 360 | if (!isprint(buf[1])) | 374 | if (!isprint(buf[1])) |
| 361 | sprintf(buf, "%02x", buf[1]); | 375 | sprintf(buf, "%02x", buf[1]); |
| 362 | printk("ioctl32(%s:%d): Unknown cmd fd(%d) " | 376 | compat_printk("ioctl32(%s:%d): Unknown cmd fd(%d) " |
| 363 | "cmd(%08x){%s} arg(%08x) on %s\n", | 377 | "cmd(%08x){%s} arg(%08x) on %s\n", |
| 364 | current->comm, current->pid, | 378 | current->comm, current->pid, |
| 365 | (int)fd, (unsigned int)cmd, buf, | 379 | (int)fd, (unsigned int)cmd, buf, |
diff --git a/include/linux/compat.h b/include/linux/compat.h index dda1697ec753..9760753e662b 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -226,5 +226,7 @@ static inline int compat_timespec_compare(struct compat_timespec *lhs, | |||
| 226 | 226 | ||
| 227 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | 227 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); |
| 228 | 228 | ||
| 229 | extern int compat_printk(const char *fmt, ...); | ||
| 230 | |||
| 229 | #endif /* CONFIG_COMPAT */ | 231 | #endif /* CONFIG_COMPAT */ |
| 230 | #endif /* _LINUX_COMPAT_H */ | 232 | #endif /* _LINUX_COMPAT_H */ |
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 6a60770984e9..349ef908a222 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
| @@ -148,9 +148,11 @@ enum | |||
| 148 | KERN_SPIN_RETRY=70, /* int: number of spinlock retries */ | 148 | KERN_SPIN_RETRY=70, /* int: number of spinlock retries */ |
| 149 | KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */ | 149 | KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */ |
| 150 | KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */ | 150 | KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */ |
| 151 | KERN_COMPAT_LOG=73, /* int: print compat layer messages */ | ||
| 151 | }; | 152 | }; |
| 152 | 153 | ||
| 153 | 154 | ||
| 155 | |||
| 154 | /* CTL_VM names: */ | 156 | /* CTL_VM names: */ |
| 155 | enum | 157 | enum |
| 156 | { | 158 | { |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 2c0e65819448..f1a4eb1a655e 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -73,6 +73,7 @@ extern int printk_ratelimit_burst; | |||
| 73 | extern int pid_max_min, pid_max_max; | 73 | extern int pid_max_min, pid_max_max; |
| 74 | extern int sysctl_drop_caches; | 74 | extern int sysctl_drop_caches; |
| 75 | extern int percpu_pagelist_fraction; | 75 | extern int percpu_pagelist_fraction; |
| 76 | extern int compat_log; | ||
| 76 | 77 | ||
| 77 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) | 78 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) |
| 78 | int unknown_nmi_panic; | 79 | int unknown_nmi_panic; |
| @@ -677,6 +678,16 @@ static ctl_table kern_table[] = { | |||
| 677 | .proc_handler = &proc_dointvec, | 678 | .proc_handler = &proc_dointvec, |
| 678 | }, | 679 | }, |
| 679 | #endif | 680 | #endif |
| 681 | #ifdef CONFIG_COMPAT | ||
| 682 | { | ||
| 683 | .ctl_name = KERN_COMPAT_LOG, | ||
| 684 | .procname = "compat-log", | ||
| 685 | .data = &compat_log, | ||
| 686 | .maxlen = sizeof (int), | ||
| 687 | .mode = 0644, | ||
| 688 | .proc_handler = &proc_dointvec, | ||
| 689 | }, | ||
| 690 | #endif | ||
| 680 | { .ctl_name = 0 } | 691 | { .ctl_name = 0 } |
| 681 | }; | 692 | }; |
| 682 | 693 | ||
