rpms/kernel/devel linux-2.6-debug-latency-tracing.patch, NONE, 1.1 kernel-2.6.spec, 1.1797, 1.1798
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Thu Dec 29 08:41:48 UTC 2005
- Previous message (by thread): rpms/kernel/devel/configs config-generic,1.115,1.116
- Next message (by thread): rpms/kernel/devel patch-2.6.15-rc7-git3.bz2.sign, NONE, 1.1 .cvsignore, 1.306, 1.307 kernel-2.6.spec, 1.1798, 1.1799 sources, 1.248, 1.249 upstream, 1.233, 1.234 patch-2.6.15-rc6.bz2.sign, 1.1, NONE patch-2.6.15-rc7-git2.bz2.sign, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: davej
Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv24091
Modified Files:
kernel-2.6.spec
Added Files:
linux-2.6-debug-latency-tracing.patch
Log Message:
add latency tracing
linux-2.6-debug-latency-tracing.patch:
arch/i386/boot/compressed/misc.c | 8
linux/Makefile | 10
linux/arch/arm/boot/compressed/head.S | 13
linux/arch/arm/boot/compressed/misc.c | 1
linux/arch/arm/kernel/calls.S | 6
linux/arch/arm/kernel/entry-common.S | 111 +
linux/arch/arm/kernel/fiq.c | 4
linux/arch/arm/kernel/irq.c | 4
linux/arch/arm/kernel/traps.c | 2
linux/arch/arm/mm/copypage-v4mc.c | 4
linux/arch/arm/mm/copypage-xscale.c | 4
linux/arch/arm/mm/fault.c | 14
linux/arch/arm26/boot/compressed/misc.c | 1
linux/arch/i386/Kconfig | 2
linux/arch/i386/boot/compressed/misc.c | 1
linux/arch/i386/kernel/Makefile | 1
linux/arch/i386/kernel/entry.S | 41
linux/arch/i386/kernel/irq.c | 8
linux/arch/i386/kernel/mcount-wrapper.S | 27
linux/arch/ppc/boot/Makefile | 9
linux/arch/ppc/boot/lib/Makefile | 48
linux/arch/ppc/kernel/entry.S | 82 +
linux/arch/x86_64/boot/compressed/misc.c | 1
linux/arch/x86_64/kernel/entry.S | 48
linux/arch/x86_64/kernel/vsyscall.c | 2
linux/fs/proc/proc_misc.c | 17
linux/include/asm-arm/pgalloc.h | 4
linux/include/asm-arm/timex.h | 10
linux/include/asm-arm/unistd.h | 3
linux/include/asm-i386/system.h | 8
linux/include/linux/interrupt.h | 10
linux/include/linux/latency_hist.h | 32
linux/include/linux/linkage.h | 2
linux/include/linux/preempt.h | 20
linux/include/linux/sched.h | 86 +
linux/kernel/Makefile | 3
linux/kernel/latency.c | 2390 +++++++++++++++++++++++++++++++
linux/kernel/latency_hist.c | 267 +++
linux/kernel/sched.c | 103 -
linux/kernel/sysctl.c | 77
linux/kernel/time.c | 19
linux/lib/Kconfig.debug | 149 +
linux/lib/inflate.c | 44
linux/lib/zlib_inflate/inftrees.c | 45
44 files changed, 3641 insertions(+), 100 deletions(-)
--- NEW FILE linux-2.6-debug-latency-tracing.patch ---
this patch reduces the ~2500+ worst-case stack footprint of zlib to
~500 bytes, by making the largest arrays static and by introducing a
spinlock to protect access to them.
Signed-off-by: Ingo Molnar <mingo at elte.hu>
arch/arm/boot/compressed/misc.c | 1
arch/arm26/boot/compressed/misc.c | 1
arch/i386/boot/compressed/misc.c | 1
arch/x86_64/boot/compressed/misc.c | 1
lib/inflate.c | 44 +++++++++++++++++++++++++++---------
lib/zlib_inflate/inftrees.c | 45 ++++++++++++++++++++++++++++---------
6 files changed, 72 insertions(+), 21 deletions(-)
Index: linux/arch/arm/boot/compressed/misc.c
===================================================================
--- linux.orig/arch/arm/boot/compressed/misc.c
+++ linux/arch/arm/boot/compressed/misc.c
@@ -199,6 +199,7 @@ static ulg free_mem_ptr_end;
#define HEAP_SIZE 0x2000
+#define ZLIB_INFLATE_NO_INFLATE_LOCK
#include "../../../../lib/inflate.c"
#ifndef STANDALONE_DEBUG
Index: linux/arch/arm26/boot/compressed/misc.c
===================================================================
--- linux.orig/arch/arm26/boot/compressed/misc.c
+++ linux/arch/arm26/boot/compressed/misc.c
@@ -184,6 +184,7 @@ static ulg free_mem_ptr_end;
#define HEAP_SIZE 0x2000
+#define ZLIB_INFLATE_NO_INFLATE_LOCK
#include "../../../../lib/inflate.c"
#ifndef STANDALONE_DEBUG
Index: linux/arch/i386/boot/compressed/misc.c
===================================================================
--- linux.orig/arch/i386/boot/compressed/misc.c
+++ linux/arch/i386/boot/compressed/misc.c
@@ -125,6 +125,7 @@ static int lines, cols;
static void * xquad_portio = NULL;
#endif
+#define ZLIB_INFLATE_NO_INFLATE_LOCK
#include "../../../../lib/inflate.c"
static void *malloc(int size)
Index: linux/arch/x86_64/boot/compressed/misc.c
===================================================================
--- linux.orig/arch/x86_64/boot/compressed/misc.c
+++ linux/arch/x86_64/boot/compressed/misc.c
@@ -114,6 +114,7 @@ static char *vidmem = (char *)0xb8000;
static int vidport;
static int lines, cols;
+#define ZLIB_INFLATE_NO_INFLATE_LOCK
#include "../../../../lib/inflate.c"
static void *malloc(int size)
Index: linux/lib/inflate.c
===================================================================
--- linux.orig/lib/inflate.c
+++ linux/lib/inflate.c
@@ -141,6 +141,25 @@ struct huft {
} v;
};
+/*
+ * turn off the inflate_lock for the bootloader code, it is
+ * single-threaded and has no need for (nor access to) the
+ * kernel's locking primitives:
+ */
+#ifdef ZLIB_INFLATE_NO_INFLATE_LOCK
+# undef DEFINE_SPINLOCK
+# undef spin_lock
+# undef spin_unlock
+# define DEFINE_SPINLOCK(x) int x
+# define spin_lock(x) (void)(x)
+# define spin_unlock(x) (void)(x)
+#endif
+
+/*
+ * lock protecting static variables of huft_build() and other inflate
+ * functions, to reduce their insane stack footprint.
+ */
+static DEFINE_SPINLOCK(inflate_lock);
/* Function prototypes */
STATIC int INIT huft_build OF((unsigned *, unsigned, unsigned,
@@ -304,7 +323,7 @@ STATIC int INIT huft_build(
register struct huft *q; /* points to current table */
struct huft r; /* table entry for structure assignment */
struct huft *u[BMAX]; /* table stack */
- unsigned v[N_MAX]; /* values in order of bit length */
+ static unsigned v[N_MAX]; /* values in order of bit length */
register int w; /* bits before this table == (l * h) */
unsigned x[BMAX+1]; /* bit offsets, then code stack */
unsigned *xp; /* pointer into x */
@@ -705,7 +724,7 @@ STATIC int noinline INIT inflate_fixed(v
struct huft *td; /* distance code table */
int bl; /* lookup bits for tl */
int bd; /* lookup bits for td */
- unsigned l[288]; /* length list for huft_build */
+ static unsigned l[288]; /* length list for huft_build */
DEBG("<fix");
@@ -767,9 +786,9 @@ STATIC int noinline INIT inflate_dynamic
unsigned nl; /* number of literal/length codes */
unsigned nd; /* number of distance codes */
#ifdef PKZIP_BUG_WORKAROUND
- unsigned ll[288+32]; /* literal/length and distance code lengths */
+ static unsigned ll[288+32]; /* literal/length and distance code lengths */
#else
- unsigned ll[286+30]; /* literal/length and distance code lengths */
+ static unsigned ll[286+30]; /* literal/length and distance code lengths */
#endif
register ulg b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
@@ -940,6 +959,7 @@ STATIC int INIT inflate_block(
unsigned t; /* block type */
register ulg b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ unsigned ret; /* return code */
DEBG("<blk");
@@ -965,17 +985,19 @@ STATIC int INIT inflate_block(
bk = k;
/* inflate that block type */
- if (t == 2)
- return inflate_dynamic();
- if (t == 0)
- return inflate_stored();
- if (t == 1)
- return inflate_fixed();
+ ret = 2;
+ spin_lock(&inflate_lock);
+ switch (t) {
+ case 2: ret = inflate_dynamic(); break;
+ case 0: ret = inflate_stored(); break;
+ case 1: ret = inflate_fixed(); break;
+ }
+ spin_unlock(&inflate_lock);
DEBG(">");
/* bad block type */
- return 2;
+ return ret;
underrun:
return 4; /* Input underrun */
Index: linux/lib/zlib_inflate/inftrees.c
===================================================================
--- linux.orig/lib/zlib_inflate/inftrees.c
+++ linux/lib/zlib_inflate/inftrees.c
@@ -4,11 +4,19 @@
*/
#include <linux/zutil.h>
+#include <linux/spinlock.h>
#include "inftrees.h"
#include "infutil.h"
static const char inflate_copyright[] __attribute_used__ =
" inflate 1.1.3 Copyright 1995-1998 Mark Adler ";
+
+/*
+ * lock protecting static variables of huft_build() and other inflate
+ * functions, to reduce their insane stack footprint.
+ */
+static DEFINE_SPINLOCK(inflate_lock);
+
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -107,7 +115,7 @@ static int huft_build(
{
uInt a; /* counter for codes of length k */
- uInt c[BMAX+1]; /* bit length count table */
+ static uInt c[BMAX+1]; /* bit length count table */
uInt f; /* i repeats in table every f entries */
int g; /* maximum code length */
int h; /* table level */
@@ -118,10 +126,10 @@ static int huft_build(
uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */
register uInt *p; /* pointer into c[], b[], or v[] */
inflate_huft *q; /* points to current table */
- struct inflate_huft_s r; /* table entry for structure assignment */
- inflate_huft *u[BMAX]; /* table stack */
+ static struct inflate_huft_s r; /* table entry for structure assignment */
+ static inflate_huft *u[BMAX]; /* table stack */
[...4322 lines suppressed...]
+ return user_trace_stop();
+#endif
+ return 1;
+}
+
asmlinkage long sys_gettimeofday(struct timeval __user *tv, struct timezone __user *tz)
{
+ int ret = timeofday_API_hacks(tv, tz);
+ if (ret != 1)
+ return ret;
+
if (likely(tv != NULL)) {
struct timeval ktv;
do_gettimeofday(&ktv);
@@ -184,6 +199,10 @@ asmlinkage long sys_settimeofday(struct
struct timespec new_ts;
struct timezone new_tz;
+ int ret = timeofday_API_hacks(tv, tz);
+ if (ret != 1)
+ return ret;
+
if (tv) {
if (copy_from_user(&user_tv, tv, sizeof(*tv)))
return -EFAULT;
Index: linux/lib/Kconfig.debug
===================================================================
--- linux.orig/lib/Kconfig.debug
+++ linux/lib/Kconfig.debug
@@ -111,6 +111,146 @@ config DEBUG_SPINLOCK_SLEEP
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config WAKEUP_TIMING
+ bool "Wakeup latency timing"
+ default y
+ help
+ This option measures the time spent from a highprio thread being
+ woken up to it getting scheduled on a CPU, with microsecond
+ accuracy.
+
+ The default measurement method is a maximum search, which is
+ disabled by default and can be runtime (re-)started via:
+
+ echo 0 > /proc/sys/kernel/preempt_max_latency
+
+config WAKEUP_LATENCY_HIST
+ bool "wakeup latency histogram"
+ default n
+ depends on WAKEUP_TIMING
+ help
+ This option logs all the wakeup latency timing to a big histogram
+ bucket, in the meanwhile, it also dummies up printk produced by
+ wakeup latency timing.
+
+ The wakeup latency timing histogram can be viewed via:
+
+ cat /proc/latency_hist/wakeup_latency/CPU*
+
+ (Note: * presents CPU ID.)
+
+config PREEMPT_TRACE
+ bool
+ default y
+ depends on DEBUG_PREEMPT
+
+config CRITICAL_PREEMPT_TIMING
+ bool "Non-preemptible critical section latency timing"
+ default n
+ depends on PREEMPT
+ help
+ This option measures the time spent in preempt-off critical
+ sections, with microsecond accuracy.
+
+ The default measurement method is a maximum search, which is
+ disabled by default and can be runtime (re-)started via:
+
+ echo 0 > /proc/sys/kernel/preempt_max_latency
+
+ (Note that kernel size and overhead increases with this option
+ enabled. This option and the irqs-off timing option can be
+ used together or separately.)
+
+config PREEMPT_OFF_HIST
+ bool "non-preemptible critical section latency histogram"
+ default n
+ depends on CRITICAL_PREEMPT_TIMING
+ help
+ This option logs all the non-preemptible critical section latency
+ timing to a big histogram bucket, in the meanwhile, it also
+ dummies up printk produced by non-preemptible critical section
+ latency timing.
+
+ The non-preemptible critical section latency timing histogram can
+ be viewed via:
+
+ cat /proc/latency_hist/preempt_off_latency/CPU*
+
+ (Note: * presents CPU ID.)
+
+config CRITICAL_IRQSOFF_TIMING
+ bool "Interrupts-off critical section latency timing"
+ default n
+ help
+ This option measures the time spent in irqs-off critical
+ sections, with microsecond accuracy.
+
+ The default measurement method is a maximum search, which is
+ disabled by default and can be runtime (re-)started via:
+
+ echo 0 > /proc/sys/kernel/preempt_max_latency
+
+ (Note that kernel size and overhead increases with this option
+ enabled. This option and the preempt-off timing option can be
+ used together or separately.)
+
+config INTERRUPT_OFF_HIST
+ bool "interrupts-off critical section latency histogram"
+ default n
+ depends on CRITICAL_IRQSOFF_TIMING
+ help
+ This option logs all the interrupts-off critical section latency
+ timing to a big histogram bucket, in the meanwhile, it also
+ dummies up printk produced by interrupts-off critical section
+ latency timing.
+
+ The interrupts-off critical section latency timing histogram can
+ be viewed via:
+
+ cat /proc/latency_hist/interrupt_off_latency/CPU*
+
+ (Note: * presents CPU ID.)
+
+config CRITICAL_TIMING
+ bool
+ default y
+ depends on CRITICAL_PREEMPT_TIMING || CRITICAL_IRQSOFF_TIMING
+
+config LATENCY_TIMING
+ bool
+ default y
+ depends on WAKEUP_TIMING || CRITICAL_TIMING
+
+config CRITICAL_LATENCY_HIST
+ bool
+ default y
+ depends on PREEMPT_OFF_HIST || INTERRUPT_OFF_HIST
+
+config LATENCY_HIST
+ bool
+ default y
+ depends on WAKEUP_LATENCY_HIST || CRITICAL_LATENCY_HIST
+
+config LATENCY_TRACE
+ bool "Latency tracing"
+ default n
+ depends on LATENCY_TIMING
+ help
+ This option enables a kernel tracing mechanism that will track
+ precise function-call granularity kernel execution during
+ wakeup paths or critical sections. When this option is enabled
+ then the last maximum latency timing event's full trace can be
+ found in /proc/latency_trace, in a human-readable (or rather as
+ some would say, in a kernel-developer-readable) form.
+
+ (Note that kernel size and overhead increases noticeably
+ with this option enabled.)
+
+config MCOUNT
+ bool
+ depends on LATENCY_TRACE
+ default y
+
config DEBUG_KOBJECT
bool "kobject debugging"
depends on DEBUG_KERNEL
@@ -176,9 +316,9 @@ config DEBUG_VM
If unsure, say N.
-config FRAME_POINTER
+config USE_FRAME_POINTER
bool "Compile the kernel with frame pointers"
- depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML)
+ depends on DEBUG_KERNEL && !MCOUNT && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML)
default y if DEBUG_INFO && UML
help
If you say Y here the resulting kernel image will be slightly larger
@@ -186,6 +326,11 @@ config FRAME_POINTER
some architectures or if you use external debuggers.
If you don't debug the kernel, you can say N.
+config FRAME_POINTER
+ bool
+ depends on USE_FRAME_POINTER || MCOUNT
+ default y
+
config RCU_TORTURE_TEST
tristate "torture tests for RCU"
depends on DEBUG_KERNEL
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.1797
retrieving revision 1.1798
diff -u -r1.1797 -r1.1798
--- kernel-2.6.spec 29 Dec 2005 08:05:15 -0000 1.1797
+++ kernel-2.6.spec 29 Dec 2005 08:41:45 -0000 1.1798
@@ -298,6 +298,7 @@
Patch1027: linux-2.6-debug-slab-leak-detector.patch
Patch1028: linux-2.6-debug-oops-pause.patch
Patch1029: linux-2.6-debug-account-kmalloc.patch
+Patch1030: linux-2.6-debug-latency-tracing.patch
# Restrict /dev/mem usage.
Patch1050: linux-2.6-devmem.patch
@@ -740,6 +741,7 @@
%patch1027 -p1
%patch1028 -p1
%patch1029 -p1
+%patch1030 -p1
#
# Make /dev/mem a need-to-know function
- Previous message (by thread): rpms/kernel/devel/configs config-generic,1.115,1.116
- Next message (by thread): rpms/kernel/devel patch-2.6.15-rc7-git3.bz2.sign, NONE, 1.1 .cvsignore, 1.306, 1.307 kernel-2.6.spec, 1.1798, 1.1799 sources, 1.248, 1.249 upstream, 1.233, 1.234 patch-2.6.15-rc6.bz2.sign, 1.1, NONE patch-2.6.15-rc7-git2.bz2.sign, 1.1, NONE
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-cvs-commits
mailing list