2009-12-04 07:29:05

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

Sorry for later response, hope we can make it in -33-rc
I just have time update the patch based on your comments
and known issues not fixed in previous patch.

>> -#define PERCPU_PAGE_SHIFT    16      /* log2() of max. size of per-CPU area */
>> +#define PERCPU_PAGE_SHIFT    20      /*16 log2() of max. size of per-CPU area */
>
> Why was this seemingly unrelated change done in a lockdep patch?

Tony has answered it.

>>
>> +config LOCKDEP_SUPPORT
>> +     bool
>> +     default y
>> +
>> +config STACKTRACE_SUPPORT
>> +     bool
>> +     default y
>
> The (shorter) form we generally use when architectures enable a
> feature is:
>
>  config LOCKDEP_SUPPORT
>         def_bool y

Updated in new patch.

>
>  config STACKTRACE_SUPPORT
>         def_bool y
>
> ( Separate cleanup patch: it might make sense to offer this in
>  generic code and just select a HAVE_LOCKDEP_SUPPORT flag. This
>  affects all lockdep architectures so should be handled
>  separately. )

Will update in an incremental patch
once this patch is in.

>> +config TRACE_IRQFLAGS_SUPPORT
>> +     bool
>> +     default y
>
> (same comment as above.)

Updated in new patch.

>> +void save_stack_trace(struct stack_trace *trace)
>> +{
>> +}
>> +EXPORT_SYMBOL(save_stack_trace);
>> +void __ia64_save_stack_nonlocal(struct stack_trace *trace)
>
> (nit: missing newline)

Updated in new patch

>
>> +{
>> +}
>> +EXPORT_SYMBOL(__ia64_save_stack_nonlocal);
>
> also, these functions should be implemented, for lockdep reports to
> be readable. Generally this is done by librarizing the dump_stack()
> et al architecture code into stacktrace.c.

Yes, Will update in an incremental patch once this patch is in.

>
>> diff -BruN linux-2.6.31-rc6/include/asm-ia64/irqflags.h
>> linux-2.6.31-rc6-lockdep/include/asm-ia64/irqflags.h
>> --- linux-2.6.31-rc6/include/asm-ia64/irqflags.h      1969-12-31
>> 16:00:00.000000000 -0800
>> +++ linux-2.6.31-rc6-lockdep/include/asm-ia64/irqflags.h      2009-08-23
>> 18:59:14.000000000 -0700
>> @@ -0,0 +1,92 @@
>> +#ifndef _ASM_IRQFLAGS_H
>> +#define _ASM_IRQFLAGS_H
>> +#include <asm/kregs.h>
>> +#include <asm/pal.h>
>> +/*
>> + * The group barrier in front of the rsm & ssm are necessary to ensure
>> + * that none of the previous instructions in the same group are
>> + * affected by the rsm/ssm.
>> + */
>> +/* For spinlocks etc */
>> +
>
> ( nit: looks a bit disorganized - could be merged into a single
>       comment block? )

Updated in new patch

>
>> +/*
>> + * - clearing psr.i is implicitly serialized (visible by next insn)
>> + * - setting psr.i requires data serialization
>> + * - we need a stop-bit before reading PSR because we sometimes
>> + *   write a floating-point register right before reading the PSR
>> + *   and that writes to PSR.mfl
>> + */
>> +#define __local_irq_save(x)                  \
>> +do {                                         \
>> +     ia64_stop();                            \
>> +     (x) = ia64_getreg(_IA64_REG_PSR);       \
>> +     ia64_stop();                            \
>> +     ia64_rsm(IA64_PSR_I);                   \
>> +} while (0)
>
> please use C inline functions for all of irqflags.h (x86 does that
> too). Macros have all sorts of disadvantages: they are harder to
> read and also double evaluation side-effects are harder to keep
> under control.

Good point. There are a lot of such kind of Macros in IA64
architecture waiting thoroughly clean up. May I update this
part later?

>> +
>> +# define raw_local_irq_disable()     do { unsigned long x;
>> raw_local_irq_save(x); } while (0)
>
> ( the patch seems line-wrapped, see Documentation/email-clients.txt
>  about how to send plain-text patches. )

I'm sorry for this. Please apply attached patch.
I use web gmail since it is the most convenient way to me.

>> -#define MAX_LOCKDEP_KEYS_BITS                13
>> +#define MAX_LOCKDEP_KEYS_BITS                10
>
> Why did you have to do this bit?

Without dynamic allocation both in Lockdep code and
ia64 architecture in place, 13 bits requires far moe
size than ia64 can support in Per CPU area (1M)

Tony, is it correct?

>>
>>  config DEBUG_LOCKDEP
>>       bool "Lock dependency engine debugging"
>> -     depends on DEBUG_KERNEL && LOCKDEP
>> +     depends on DEBUG_KERNEL && LOCKDEP && !IA64
>>       help
>
> That should be fixed (and this chunk will then not be needed) before
> this is merged.

Updated in new patch

>
> Also, a few general comments:
>
>  - There's no lockdep_sys_exit support implemented. (This callback
>   is needed to detect lock counts leaking to user-space. Just call
>   it in the return-from-syscall codepath(s).)

Updated in new patch. But Temporarily commented out in call site.
I tested it, but there is lock held before leaving kernel...
Will root cause, and fix the problem later.

>
>  - There's no changes to exception code assembly AFAICS - such as
>   debug traps, special exceptions, etc. You should review all
>   places in the IA64 code where there's open-coded or
>   hardware-implicit enable-irqs or disable-irqs instructions, not
>   just the main local_irq_*() functions. A starting point would be:
>
>      git grep IA64_PSR_I arch/ia64/ | grep .S:
>
>   but there may be instructions and trap entries where there's
>   implicit irq-flags behavior - those need to be examined too.

Updated some in assembly code that modify PSR.I bit.
But not all, because not all modifications of PSR.i bit
would be interesting to lockdep code..

>
>  - Do kprobes work with this patch?

Tested, yes.

>
>  - No NMI support AFAICS - all NMI codepaths should be exempted from
>   irqflags coverage.

Good point, I need to find out place to insert
nmi_enter and nmi_exit., and do some testing.
Not done yet.

Will update in an incremental patch after the patch is accepted.


>
> Thanks,
>
>        Ingo

Thanks for review.

>


The following is some results with the new patch.

[root@localhost ~]# dmesg | head -2
Linux version 2.6.31 ([email protected]) (gcc version 4.1.2
20071124 (Red Hat 4.1.2-42)) #1 SMP Thu Dec 3 16:35:07 PST 2009

[root@localhost ~]# dmesg | grep Kprobe
Kprobe smoke test started
Kprobe smoke test passed successfully

[root@localhost ~]# dmesg

.....
Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
... MAX_LOCKDEP_SUBCLASSES: 8
... MAX_LOCK_DEPTH: 48
... MAX_LOCKDEP_KEYS: 1023
... CLASSHASH_SIZE: 512
... MAX_LOCKDEP_ENTRIES: 16384
... MAX_LOCKDEP_CHAINS: 32768
... CHAINHASH_SIZE: 16384
memory used by lock dependency info: 2679 kB
per task-struct memory footprint: 2688 bytes
------------------------
| Locking API testsuite:
----------------------------------------------------------------------------
| spin |wlock |rlock |mutex | wsem | rsem |
--------------------------------------------------------------------------
A-A deadlock: ok | ok | ok | ok | ok | ok |
A-B-B-A deadlock: ok | ok | ok | ok | ok | ok |
A-B-B-C-C-A deadlock: ok | ok | ok | ok | ok | ok |
A-B-C-A-B-C deadlock: ok | ok | ok | ok | ok | ok |
A-B-B-C-C-D-D-A deadlock: ok | ok | ok | ok | ok | ok |
A-B-C-D-B-D-D-A deadlock: ok | ok | ok | ok | ok | ok |
A-B-C-D-B-C-D-A deadlock: ok | ok | ok | ok | ok | ok |
double unlock: ok | ok | ok | ok | ok | ok |
initialize held: ok | ok | ok | ok | ok | ok |
bad unlock order: ok | ok | ok | ok | ok | ok |
--------------------------------------------------------------------------
recursive read-lock: | ok | | ok |
recursive read-lock #2: | ok | | ok |
mixed read-write-lock: | ok | | ok |
mixed write-read-lock: | ok | | ok |
--------------------------------------------------------------------------
hard-irqs-on + irq-safe-A/12: ok | ok | ok |
soft-irqs-on + irq-safe-A/12: ok | ok | ok |
hard-irqs-on + irq-safe-A/21: ok | ok | ok |
soft-irqs-on + irq-safe-A/21: ok | ok | ok |
sirq-safe-A => hirqs-on/12: ok | ok | ok |
sirq-safe-A => hirqs-on/21: ok | ok | ok |
hard-safe-A + irqs-on/12: ok | ok | ok |
soft-safe-A + irqs-on/12: ok | ok | ok |
hard-safe-A + irqs-on/21: ok | ok | ok |
soft-safe-A + irqs-on/21: ok | ok | ok |
hard-safe-A + unsafe-B #1/123: ok | ok | ok |
soft-safe-A + unsafe-B #1/123: ok | ok | ok |
hard-safe-A + unsafe-B #1/132: ok | ok | ok |
soft-safe-A + unsafe-B #1/132: ok | ok | ok |
hard-safe-A + unsafe-B #1/213: ok | ok | ok |
soft-safe-A + unsafe-B #1/213: ok | ok | ok |
hard-safe-A + unsafe-B #1/231: ok | ok | ok |
soft-safe-A + unsafe-B #1/231: ok | ok | ok |
hard-safe-A + unsafe-B #1/312: ok | ok | ok |
soft-safe-A + unsafe-B #1/312: ok | ok | ok |
hard-safe-A + unsafe-B #1/321: ok | ok | ok |
soft-safe-A + unsafe-B #1/321: ok | ok | ok |
hard-safe-A + unsafe-B #2/123: ok | ok | ok |
soft-safe-A + unsafe-B #2/123: ok | ok | ok |
hard-safe-A + unsafe-B #2/132: ok | ok | ok |
soft-safe-A + unsafe-B #2/132: ok | ok | ok |
hard-safe-A + unsafe-B #2/213: ok | ok | ok |
soft-safe-A + unsafe-B #2/213: ok | ok | ok |
hard-safe-A + unsafe-B #2/231: ok | ok | ok |
soft-safe-A + unsafe-B #2/231: ok | ok | ok |
hard-safe-A + unsafe-B #2/312: ok | ok | ok |
soft-safe-A + unsafe-B #2/312: ok | ok | ok |
hard-safe-A + unsafe-B #2/321: ok | ok | ok |
soft-safe-A + unsafe-B #2/321: ok | ok | ok |
hard-irq lock-inversion/123: ok | ok | ok |
soft-irq lock-inversion/123: ok | ok | ok |
hard-irq lock-inversion/132: ok | ok | ok |
soft-irq lock-inversion/132: ok | ok | ok |
hard-irq lock-inversion/213: ok | ok | ok |
soft-irq lock-inversion/213: ok | ok | ok |
hard-irq lock-inversion/231: ok | ok | ok |
soft-irq lock-inversion/231: ok | ok | ok |
hard-irq lock-inversion/312: ok | ok | ok |
soft-irq lock-inversion/312: ok | ok | ok |
hard-irq lock-inversion/321: ok | ok | ok |
soft-irq lock-inversion/321: ok | ok | ok |
hard-irq read-recursion/123: ok |
soft-irq read-recursion/123: ok |
hard-irq read-recursion/132: ok |
soft-irq read-recursion/132: ok |
hard-irq read-recursion/213: ok |
soft-irq read-recursion/213: ok |
hard-irq read-recursion/231: ok |
soft-irq read-recursion/231: ok |
hard-irq read-recursion/312: ok |
soft-irq read-recursion/312: ok |
hard-irq read-recursion/321: ok |
soft-irq read-recursion/321: ok |
-------------------------------------------------------
Good, all 218 testcases passed! |

[root@localhost ~]# cat /proc/lockdep_stats
lock-classes: 546 [max: 1023]
direct dependencies: 572 [max: 16384]
indirect dependencies: 455
all direct dependencies: 2132
dependency chains: 1194 [max: 32768]
dependency chain hlocks: 1928 [max: 163840]
in-hardirq chains: 7
in-softirq chains: 3
in-process chains: 317
stack-trace entries: 0 [max: 262144]
combined max dependencies: 10176
hardirq-safe locks: 8
hardirq-unsafe locks: 65
softirq-safe locks: 10
softirq-unsafe locks: 64
irq-safe locks: 16
irq-unsafe locks: 65
hardirq-read-safe locks: 0
hardirq-read-unsafe locks: 5
softirq-read-safe locks: 0
softirq-read-unsafe locks: 5
irq-read-safe locks: 0
irq-read-unsafe locks: 5
uncategorized locks: 41
unused locks: 0
max locking depth: 5
max recursion depth: 4
debug_locks: 0



Known issues:
0. dynamic allocate per CPU area in lockdep.
1. lock held in leave kernel.
2. enabling CONFIG_DEBUG_LOCKDEP triggers the lockdep warning.

WARNING: at kernel/lockdep.c:2901 check_flags+0x1c0/0x480()
Modules linked in:

Call Trace:
[<a000000100017310>] show_stack+0x70/0xc0
sp=a000000100be7c40 bsp=a000000100be1e00
[<a0000001000173b0>] dump_stack+0x50/0x80
sp=a000000100be7e10 bsp=a000000100be1dd8
[<a000000100095750>] warn_slowpath_common+0xf0/0x140
sp=a000000100be7e10 bsp=a000000100be1d98
[<a000000100095800>] warn_slowpath_null+0x60/0x80
sp=a000000100be7e10 bsp=a000000100be1d68
[<a0000001000ecf00>] check_flags+0x1c0/0x480
sp=a000000100be7e10 bsp=a000000100be1d40
[<a0000001000f34a0>] lockdep_trace_alloc+0x60/0x160
sp=a000000100be7e10 bsp=a000000100be1d10
[<a0000001001ec2d0>] kmem_cache_alloc_node+0x70/0x440
sp=a000000100be7e10 bsp=a000000100be1cb8
[<a0000001001ec740>] __kmalloc_node+0xa0/0x1a0
sp=a000000100be7e10 bsp=a000000100be1c68
[<a0000001001ee7e0>] alloc_arraycache+0x60/0xe0
sp=a000000100be7e20 bsp=a000000100be1c28
[<a0000001001f02c0>] alloc_alien_cache+0x160/0x280
sp=a000000100be7e20 bsp=a000000100be1bd0
[<a0000001001f0960>] do_tune_cpucache+0x580/0xba0
sp=a000000100be7e20 bsp=a000000100be1b58
[<a0000001001f1470>] enable_cpucache+0x130/0x200
sp=a000000100be7e20 bsp=a000000100be1b20
[<a000000100b06c20>] kmem_cache_init_late+0x60/0x3e0
sp=a000000100be7e20 bsp=a000000100be1ae0
[<a000000100ae12b0>] start_kernel+0x550/0x940
sp=a000000100be7e20 bsp=a000000100be1a60
[<a000000100841a60>] _start+0x760/0x780
sp=a000000100be7e30 bsp=a000000100be19c0
---[ end trace 4eaa2a86a8e2da22 ]---
possible reason: unannotated irqs-on.


Please review patch update. If make sense, please apply.

Ps. The patch is enclosed in attachment. The inline one
is c&p of it for reading.


Thanks,
Luming

Signed-off-by: Bob Picco <[email protected]>
Signed-off-by: Yu Luming <[email protected]>

arch/ia64/Kconfig | 6 ++
arch/ia64/Kconfig.debug | 3 +
arch/ia64/include/asm/irqflags.h | 101 +++++++++++++++++++++++++++++++++++++
arch/ia64/include/asm/page.h | 2
arch/ia64/include/asm/rwsem.h | 27 ++++++---
arch/ia64/include/asm/stacktrace.h | 7 ++
arch/ia64/include/asm/system.h | 84 ------------------------------
arch/ia64/kernel/Makefile | 1
arch/ia64/kernel/entry.S | 6 ++
arch/ia64/kernel/ivt.S | 29 ++++++++++
arch/ia64/kernel/process.c | 6 +-
arch/ia64/kernel/setup.c | 4 +
arch/ia64/kernel/smpboot.c | 2
arch/ia64/kernel/stacktrace.c | 24 ++++++++
arch/ia64/kernel/time.c | 4 -
include/linux/lockdep.h | 2

diff -BruN linux-2.6.31/arch/ia64/include/asm/irqflags.h
testing/arch/ia64/include/asm/irqflags.h
--- linux-2.6.31/arch/ia64/include/asm/irqflags.h 1969-12-31
16:00:00.000000000 -0800
+++ testing/arch/ia64/include/asm/irqflags.h 2009-12-03 15:40:45.000000000 -0800
@@ -0,0 +1,101 @@
+#ifndef _ASM_IRQFLAGS_H
+#define _ASM_IRQFLAGS_H
+#include <asm/kregs.h>
+#include <asm/pal.h>
+/*
+ * The group barrier in front of the rsm & ssm are necessary to ensure
+ * that none of the previous instructions in the same group are
+ * affected by the rsm/ssm.
+ *
+ * For spinlocks etc
+ * - clearing psr.i is implicitly serialized (visible by next insn)
+ * - setting psr.i requires data serialization
+ * - we need a stop-bit before reading PSR because we sometimes
+ * write a floating-point register right before reading the PSR
+ * and that writes to PSR.mfl
+ */
+#define __local_irq_save(x) \
+do { \
+ ia64_stop(); \
+ (x) = ia64_getreg(_IA64_REG_PSR); \
+ ia64_stop(); \
+ ia64_rsm(IA64_PSR_I); \
+} while (0)
+
+#define __local_irq_disable() \
+do { \
+ ia64_stop(); \
+ ia64_rsm(IA64_PSR_I); \
+} while (0)
+
+#define __local_irq_restore(x) ia64_intrin_local_irq_restore((x) & IA64_PSR_I)
+
+#ifdef CONFIG_IA64_DEBUG_IRQ
+
+ extern unsigned long last_cli_ip;
+
+# define __save_ip() last_cli_ip = ia64_getreg(_IA64_REG_IP)
+
+# define raw_local_irq_save(x) \
+do { \
+ unsigned long psr; \
+ \
+ __local_irq_save(psr); \
+ if (psr & IA64_PSR_I) \
+ __save_ip(); \
+ (x) = psr; \
+} while (0)
+
+# define raw_local_irq_disable() do { unsigned long x;
raw_local_irq_save(x); } while (0)
+
+# define raw_local_irq_restore(x) \
+do { \
+ unsigned long old_psr, psr = (x); \
+ \
+ local_save_flags(old_psr); \
+ __local_irq_restore(psr); \
+ if ((old_psr & IA64_PSR_I) && !(psr & IA64_PSR_I)) \
+ __save_ip(); \
+} while (0)
+
+#else /* !CONFIG_IA64_DEBUG_IRQ */
+# define raw_local_irq_save(x) __local_irq_save(x)
+# define raw_local_irq_disable() __local_irq_disable()
+# define raw_local_irq_restore(x) __local_irq_restore(x)
+#endif /* !CONFIG_IA64_DEBUG_IRQ */
+
+#define raw_local_irq_enable() ({ ia64_stop(); ia64_ssm(IA64_PSR_I);
ia64_srlz_d(); })
+#define raw_local_save_flags(flags) ({ ia64_stop(); (flags) =
ia64_getreg(_IA64_REG_PSR); })
+
+#define raw_irqs_disabled() \
+({ \
+ unsigned long __ia64_id_flags; \
+ raw_local_save_flags(__ia64_id_flags); \
+ (__ia64_id_flags & IA64_PSR_I) == 0; \
+})
+
+#define raw_safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */
+#define raw_irqs_disabled_flags(flags) \
+({ \
+ (int)((flags) & IA64_PSR_I) == 0; \
+})
+
+#ifdef CONFIG_TRACE_IRQFLAGS
+#define TRACE_IRQS_ON br.call.sptk.many b0=trace_hardirqs_on
+#define TRACE_IRQS_OFF br.call.sptk.many b0=trace_hardirqs_off
+#else
+#define TRACE_IRQS_ON
+#define TRACE_IRQS_OFF
+#endif
+
+#define ARCH_LOCKDEP_SYS_EXIT br.call.sptk.many rp=lockdep_sys_exit
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+#define LOCKDEP_SYS_EXIT ARCH_LOCKDEP_SYS_EXIT
+#else
+#define LOCKDEP_SYS_EXIT
+#endif
+
+#endif
+
+
diff -BruN linux-2.6.31/arch/ia64/include/asm/page.h
testing/arch/ia64/include/asm/page.h
--- linux-2.6.31/arch/ia64/include/asm/page.h 2009-09-09
15:13:59.000000000 -0700
+++ testing/arch/ia64/include/asm/page.h 2009-12-03 12:01:50.000000000 -0800
@@ -41,7 +41,7 @@
#define PAGE_SIZE (__IA64_UL_CONST(1) << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE - 1))

-#define PERCPU_PAGE_SHIFT 16 /* log2() of max. size of per-CPU area */
+#define PERCPU_PAGE_SHIFT 20 /*20 log2() of max. size of per-CPU area */
#define PERCPU_PAGE_SIZE (__IA64_UL_CONST(1) << PERCPU_PAGE_SHIFT)


diff -BruN linux-2.6.31/arch/ia64/include/asm/rwsem.h
testing/arch/ia64/include/asm/rwsem.h
--- linux-2.6.31/arch/ia64/include/asm/rwsem.h 2009-09-09
15:13:59.000000000 -0700
+++ testing/arch/ia64/include/asm/rwsem.h 2009-12-03 11:39:27.000000000 -0800
@@ -37,6 +37,9 @@
signed long count;
spinlock_t wait_lock;
struct list_head wait_list;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+ struct lockdep_map dep_map;
+#endif
};

#define RWSEM_UNLOCKED_VALUE __IA64_UL_CONST(0x0000000000000000)
@@ -46,9 +49,15 @@
#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)

+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
+#else
+# define __RWSEM_DEP_MAP_INIT(lockname)
+#endif
+
#define __RWSEM_INITIALIZER(name) \
{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \
- LIST_HEAD_INIT((name).wait_list) }
+ LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name)}

#define DECLARE_RWSEM(name) \
struct rw_semaphore name = __RWSEM_INITIALIZER(name)
@@ -58,13 +67,15 @@
extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);

-static inline void
-init_rwsem (struct rw_semaphore *sem)
-{
- sem->count = RWSEM_UNLOCKED_VALUE;
- spin_lock_init(&sem->wait_lock);
- INIT_LIST_HEAD(&sem->wait_list);
-}
+extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
+ struct lock_class_key *key);
+
+#define init_rwsem(sem) \
+do { \
+ static struct lock_class_key __key; \
+ \
+ __init_rwsem((sem), #sem, &__key); \
+} while (0)

/*
* lock for reading
diff -BruN linux-2.6.31/arch/ia64/include/asm/stacktrace.h
testing/arch/ia64/include/asm/stacktrace.h
--- linux-2.6.31/arch/ia64/include/asm/stacktrace.h 1969-12-31
16:00:00.000000000 -0800
+++ testing/arch/ia64/include/asm/stacktrace.h 2009-12-03
12:32:58.000000000 -0800
@@ -0,0 +1,7 @@
+#ifndef _ASM_STACKTRACE_H
+#define _ASM_STACKTRACE_H 1
+
+/* Generic stack tracer with callbacks */
+
+
+#endif
diff -BruN linux-2.6.31/arch/ia64/include/asm/system.h
testing/arch/ia64/include/asm/system.h
--- linux-2.6.31/arch/ia64/include/asm/system.h 2009-09-09
15:13:59.000000000 -0700
+++ testing/arch/ia64/include/asm/system.h 2009-12-02 21:56:56.000000000 -0800
@@ -107,88 +107,6 @@
*/
#define set_mb(var, value) do { (var) = (value); mb(); } while (0)

-#define safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */
-
-/*
- * The group barrier in front of the rsm & ssm are necessary to ensure
- * that none of the previous instructions in the same group are
- * affected by the rsm/ssm.
- */
-/* For spinlocks etc */
-
-/*
- * - clearing psr.i is implicitly serialized (visible by next insn)
- * - setting psr.i requires data serialization
- * - we need a stop-bit before reading PSR because we sometimes
- * write a floating-point register right before reading the PSR
- * and that writes to PSR.mfl
- */
-#ifdef CONFIG_PARAVIRT
-#define __local_save_flags() ia64_get_psr_i()
-#else
-#define __local_save_flags() ia64_getreg(_IA64_REG_PSR)
-#endif
-
-#define __local_irq_save(x) \
-do { \
- ia64_stop(); \
- (x) = __local_save_flags(); \
- ia64_stop(); \
- ia64_rsm(IA64_PSR_I); \
-} while (0)
-
-#define __local_irq_disable() \
-do { \
- ia64_stop(); \
- ia64_rsm(IA64_PSR_I); \
-} while (0)
-
-#define __local_irq_restore(x) ia64_intrin_local_irq_restore((x) & IA64_PSR_I)
-
-#ifdef CONFIG_IA64_DEBUG_IRQ
-
- extern unsigned long last_cli_ip;
-
-# define __save_ip() last_cli_ip = ia64_getreg(_IA64_REG_IP)
-
-# define local_irq_save(x) \
-do { \
- unsigned long __psr; \
- \
- __local_irq_save(__psr); \
- if (__psr & IA64_PSR_I) \
- __save_ip(); \
- (x) = __psr; \
-} while (0)
-
-# define local_irq_disable() do { unsigned long __x;
local_irq_save(__x); } while (0)
-
-# define local_irq_restore(x) \
-do { \
- unsigned long __old_psr, __psr = (x); \
- \
- local_save_flags(__old_psr); \
- __local_irq_restore(__psr); \
- if ((__old_psr & IA64_PSR_I) && !(__psr & IA64_PSR_I)) \
- __save_ip(); \
-} while (0)
-
-#else /* !CONFIG_IA64_DEBUG_IRQ */
-# define local_irq_save(x) __local_irq_save(x)
-# define local_irq_disable() __local_irq_disable()
-# define local_irq_restore(x) __local_irq_restore(x)
-#endif /* !CONFIG_IA64_DEBUG_IRQ */
-
-#define local_irq_enable() ({ ia64_stop(); ia64_ssm(IA64_PSR_I);
ia64_srlz_d(); })
-#define local_save_flags(flags) ({ ia64_stop(); (flags) =
__local_save_flags(); })
-
-#define irqs_disabled() \
-({ \
- unsigned long __ia64_id_flags; \
- local_save_flags(__ia64_id_flags); \
- (__ia64_id_flags & IA64_PSR_I) == 0; \
-})
-
#ifdef __KERNEL__

#ifdef CONFIG_IA32_SUPPORT
@@ -274,7 +192,7 @@
#define __ARCH_WANT_UNLOCKED_CTXSW
#define ARCH_HAS_PREFETCH_SWITCH_STACK
#define ia64_platform_is(x) (strcmp(x, platform_name) == 0)
-
+#include <linux/irqflags.h>
void cpu_idle_wait(void);

#define arch_align_stack(x) (x)
diff -BruN linux-2.6.31/arch/ia64/Kconfig testing/arch/ia64/Kconfig
--- linux-2.6.31/arch/ia64/Kconfig 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/Kconfig 2009-12-03 11:43:38.000000000 -0800
@@ -143,6 +143,12 @@

endif

+config LOCKDEP_SUPPORT
+ def_bool y
+
+config STACKTRACE_SUPPORT
+ def_bool y
+
choice
prompt "System type"
default IA64_GENERIC
diff -BruN linux-2.6.31/arch/ia64/Kconfig.debug testing/arch/ia64/Kconfig.debug
--- linux-2.6.31/arch/ia64/Kconfig.debug 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/Kconfig.debug 2009-12-03 11:44:16.000000000 -0800
@@ -2,6 +2,9 @@

source "lib/Kconfig.debug"

+config TRACE_IRQFLAGS_SUPPORT
+ def_bool y
+
choice
prompt "Physical memory granularity"
default IA64_GRANULE_64MB
diff -BruN linux-2.6.31/arch/ia64/kernel/entry.S
testing/arch/ia64/kernel/entry.S
--- linux-2.6.31/arch/ia64/kernel/entry.S 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/entry.S 2009-12-03 12:55:53.000000000 -0800
@@ -48,6 +48,7 @@
#include <asm/thread_info.h>
#include <asm/unistd.h>
#include <asm/ftrace.h>
+#include <asm/irqflags.h>

#include "minstate.h"

@@ -897,6 +899,11 @@
cmp.eq p6,p0=r21,r0 // p6 <- pUStk || (preempt_count == 0)
#else
RSM_PSR_I(pUStk, r17, r31)
+#if 0 //Todo: fix lock held when returning to user space
+ ;;
+ LOCKDEP_SYS_EXIT
+ ;;
+#endif
cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
#endif
diff -BruN linux-2.6.31/arch/ia64/kernel/ivt.S testing/arch/ia64/kernel/ivt.S
--- linux-2.6.31/arch/ia64/kernel/ivt.S 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/ivt.S 2009-12-03 11:50:40.000000000 -0800
@@ -855,6 +855,11 @@
mov rp=r3 // I0 set the real return addr
(p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad
call-frame or r15 is a NaT

+#ifdef TRACE_IRQFLAGS_SUPPORT
+ ;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r16) // M2 restore psr.i
(p14) br.call.sptk.many b6=b6 // B invoke syscall-handker
(ignore return addr)
br.cond.spnt.many ia64_trace_syscall // B do syscall-tracing thingamagic
@@ -1555,6 +1560,11 @@
MOV_FROM_ISR(out1)
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r14, r3)
adds r3=8,r2 // set up second base pointer
+#ifdef TRACE_IRQFLAGS_SUPPORT
+ ;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r14) // restore psr.i
movl r14=ia64_leave_kernel
;;
@@ -1582,6 +1592,11 @@

SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r15, r24)
// guarantee that interruption collection is on
+#ifdef TRACE_IRQFLAGS_SUPPORT
+ ;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r15) // restore psr.i
movl r15=ia64_leave_kernel
;;
@@ -1630,6 +1645,11 @@

SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r24)
// guarantee that interruption collection is on
+#ifdef TRACE_IRQFLAGS_SUPPORT
+ ;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r3) // restore psr.i
adds r3=8,r2 // set up second base pointer
;;
@@ -1665,6 +1685,11 @@
// guarantee that interruption collection is on
mov out0=r15
;;
+#ifdef TRACE_IRQFLAGS_SUPPORT
+ ;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r3) // restore psr.i
adds r3=8,r2 // set up second base pointer for SAVE_REST
;;
@@ -1733,7 +1758,11 @@
MOV_FROM_ISR(r14)
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r24)
// guarantee that interruption collection is on
+#ifdef TRACE_IRQFLAGS_SUPPORT
;;
+(p15) br.call.sptk.many rp=trace_hardirqs_on
+ ;;
+#endif
SSM_PSR_I(p15, p15, r3)
adds r3=8,r2 // Base pointer for SAVE_REST
;;
diff -BruN linux-2.6.31/arch/ia64/kernel/Makefile
testing/arch/ia64/kernel/Makefile
--- linux-2.6.31/arch/ia64/kernel/Makefile 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/Makefile 2009-12-02 21:56:56.000000000 -0800
@@ -40,6 +40,7 @@
obj-$(CONFIG_PCI_MSI) += msi_ia64.o
mca_recovery-y += mca_drv.o mca_drv_asm.o
obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
+obj-$(CONFIG_STACKTRACE) += stacktrace.o

obj-$(CONFIG_PARAVIRT) += paravirt.o paravirtentry.o \
paravirt_patch.o
diff -BruN linux-2.6.31/arch/ia64/kernel/process.c
testing/arch/ia64/kernel/process.c
--- linux-2.6.31/arch/ia64/kernel/process.c 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/process.c 2009-12-03 11:51:28.000000000 -0800
@@ -225,14 +225,14 @@
void
default_idle (void)
{
- local_irq_enable();
+ raw_local_irq_enable();
while (!need_resched()) {
if (can_do_pal_halt) {
- local_irq_disable();
+ raw_local_irq_disable();
if (!need_resched()) {
safe_halt();
}
- local_irq_enable();
+ raw_local_irq_enable();
} else
cpu_relax();
}
diff -BruN linux-2.6.31/arch/ia64/kernel/setup.c
testing/arch/ia64/kernel/setup.c
--- linux-2.6.31/arch/ia64/kernel/setup.c 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/setup.c 2009-12-03 23:14:56.000000000 -0800
@@ -1021,7 +1021,11 @@
BUG_ON(current->mm);

ia64_mmu_init(ia64_imva(cpu_data));
+
+ /* Temporarily suppress lockdep WARN_ON irqs disabled*/
+ lockdep_off();
ia64_mca_cpu_init(ia64_imva(cpu_data));
+ lockdep_on();

#ifdef CONFIG_IA32_SUPPORT
ia32_cpu_init();
diff -BruN linux-2.6.31/arch/ia64/kernel/smpboot.c
testing/arch/ia64/kernel/smpboot.c
--- linux-2.6.31/arch/ia64/kernel/smpboot.c 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/smpboot.c 2009-12-02 21:56:56.000000000 -0800
@@ -504,7 +504,7 @@
struct create_idle c_idle = {
.work = __WORK_INITIALIZER(c_idle.work, do_fork_idle),
.cpu = cpu,
- .done = COMPLETION_INITIALIZER(c_idle.done),
+ .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done),
};

c_idle.idle = get_idle_for_cpu(cpu);
diff -BruN linux-2.6.31/arch/ia64/kernel/stacktrace.c
testing/arch/ia64/kernel/stacktrace.c
--- linux-2.6.31/arch/ia64/kernel/stacktrace.c 1969-12-31
16:00:00.000000000 -0800
+++ testing/arch/ia64/kernel/stacktrace.c 2009-12-03 12:33:55.000000000 -0800
@@ -0,0 +1,24 @@
+/*
+ * arch/x86_64/kernel/stacktrace.c
+ *
+ * Stack trace management functions
+ *
+ * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
+ */
+#include <linux/sched.h>
+#include <linux/stacktrace.h>
+#include <linux/module.h>
+#include <asm/stacktrace.h>
+
+/*
+ * Save stack-backtrace addresses into a stack_trace buffer.
+ */
+void save_stack_trace(struct stack_trace *trace)
+{
+}
+EXPORT_SYMBOL(save_stack_trace);
+
+void __ia64_save_stack_nonlocal(struct stack_trace *trace)
+{
+}
+EXPORT_SYMBOL(__ia64_save_stack_nonlocal);
diff -BruN linux-2.6.31/arch/ia64/kernel/time.c testing/arch/ia64/kernel/time.c
--- linux-2.6.31/arch/ia64/kernel/time.c 2009-09-09 15:13:59.000000000 -0700
+++ testing/arch/ia64/kernel/time.c 2009-12-03 11:52:41.000000000 -0800
@@ -210,8 +210,8 @@
/*
* Allow IPIs to interrupt the timer loop.
*/
- local_irq_enable();
- local_irq_disable();
+ raw_local_irq_enable();
+ raw_local_irq_disable();
}

skip_process_time_accounting:
diff -BruN linux-2.6.31/include/linux/lockdep.h testing/include/linux/lockdep.h
--- linux-2.6.31/include/linux/lockdep.h 2009-09-09 15:13:59.000000000 -0700
+++ testing/include/linux/lockdep.h 2009-12-02 21:57:38.000000000 -0800
@@ -162,7 +162,7 @@
u64 chain_key;
};

-#define MAX_LOCKDEP_KEYS_BITS 13
+#define MAX_LOCKDEP_KEYS_BITS 10
/*
* Subtract one because we offset hlock->class_idx by 1 in order
* to make 0 mean no class. This avoids overflowing the class_idx


Attachments:
ia64-lockdep-linux-2.6.31.patch (16.03 kB)

2009-12-04 19:16:19

by Luck, Tony

[permalink] [raw]
Subject: RE: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

Luming,

Can you send the config file that you used to test this.

I turned on a bunch of LOCKDEP related things, but I may have
stumbled into areas that aren't working yet because my kernel
didn't boot (or say anything on the console, even with early
serial uart console enabled).

I'd like to take this patch so we can fix it up with incremental
patches ... but I'd like a better idea of what works now and
what doesn't.

Thanks

-Tony

2009-12-05 03:19:17

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Sat, Dec 5, 2009 at 3:16 AM, Luck, Tony <[email protected]> wrote:
> Luming,
>
> Can you send the config file that you used to test this.

yes, will send my config later when back to office.

>
> I turned on a bunch of LOCKDEP related things, but I may have
> stumbled into areas that aren't working yet because my kernel
> didn't boot (or say anything on the console, even with early
> serial uart console enabled).

Please also send your config to me, let me check
what could make that happen.

>
> I'd like to take this patch so we can fix it up with incremental
> patches ... but I'd like a better idea of what works now and
> what doesn't.
>
> Thanks
>
> -Tony

Thanks.
Luming

2009-12-07 05:56:44

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Sat, Dec 5, 2009 at 11:19 AM, Luming Yu <[email protected]> wrote:
> On Sat, Dec 5, 2009 at 3:16 AM, Luck, Tony <[email protected]> wrote:
>> Luming,
>>
>> Can you send the config file that you used to test this.
>
> yes, will send my config later when back to office.

please check out the attached config.


Attachments:
linux-2.6.31-cr29.config (67.47 kB)

2009-12-07 21:40:29

by Tony Luck

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

> please check out the attached config.

Your config fails for me too (same way, blank screen, nothing on
serial console).

Essentially I applied your patch to 2.6.32 (patch only gave a few
"offset" warnings). Kernel
builds ok, and boots on tiger (using tiger_defconfig).

When I turned on some LOCKDEP bits (see attached config) it fails.
Nothing on the
early uart console to say why. Screen just blanks right away.

-Tony


Attachments:
bad.lockdep.config (42.89 kB)

2009-12-08 12:25:44

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Tue, Dec 8, 2009 at 5:35 AM, Tony Luck <[email protected]> wrote:
>> please check out the attached config.
>
> Your config fails for me too (same way, blank screen, nothing on
> serial console).
>
> Essentially I applied your patch to 2.6.32 (patch only gave a few
> "offset" warnings).   Kernel
> builds ok, and boots on tiger (using tiger_defconfig).
>
> When I turned on some LOCKDEP bits (see attached config) it fails.
> Nothing on the
> early uart console to say why.  Screen just blanks right away.

Hmm, I changed the bad config a bit as below.
Nothing seems to be lockdep releated.

And the resutling 2.6.31 with LOCKDEP bits enabled still
can boot on my system.

But let me try more on other ia64 boxes that I can get access.

Stay tuned.

[root@localhost linux-2.6.31]# diff ../bad.lockdep.config good.config
3,4c3,4
< # Linux kernel version: 2.6.32
< # Mon Dec 7 11:05:28 2009
---
> # Linux kernel version: 2.6.31
> # Tue Dec 8 05:41:56 2009
28a29
> # CONFIG_CLASSIC_RCU is not set
30c31
< # CONFIG_TREE_PREEMPT_RCU is not set
---
> # CONFIG_PREEMPT_RCU is not set
34a36
> # CONFIG_PREEMPT_RCU_TRACE is not set
77c79
< # Kernel Performance Events And Counters
---
> # Performance Counters
81a84
> # CONFIG_STRIP_ASM_SYMS is not set
86a90
> # CONFIG_MARKERS is not set
99c103
< CONFIG_SLOW_WORK=y
---
> # CONFIG_SLOW_WORK is not set
139d142
< # CONFIG_GENERIC_LOCKBREAK is not set
146d148
< CONFIG_HAVE_LEGACY_PER_CPU_AREA=y
212d213
< # CONFIG_KSM is not set
222d222
< CONFIG_ARCH_PROC_KCORE_TEXT=y
251d250
< # CONFIG_PM_RUNTIME is not set
255d253
< # CONFIG_ACPI_POWER_METER is not set
260c258
< # CONFIG_ACPI_DOCK is not set
---
> CONFIG_ACPI_DOCK=y
339d336
< # CONFIG_RDS is not set
369d365
< CONFIG_CFG80211_DEFAULT_PS_VALUE=0
376a373
> CONFIG_MAC80211_DEFAULT_PS_VALUE=0
389d385
< # CONFIG_DEVTMPFS is not set
544d539
< # CONFIG_BE2ISCSI is not set
575a571
> # CONFIG_SCSI_IPR is not set
583d578
< # CONFIG_SCSI_PMCRAID is not set
585d579
< # CONFIG_SCSI_BFA_FC is not set
588c582,642
< # CONFIG_ATA is not set
---
> CONFIG_ATA=m
> CONFIG_ATA_NONSTANDARD=y
> CONFIG_ATA_ACPI=y
> CONFIG_SATA_PMP=y
> # CONFIG_SATA_AHCI is not set
> # CONFIG_SATA_SIL24 is not set
> CONFIG_ATA_SFF=y
> # CONFIG_SATA_SVW is not set
> CONFIG_ATA_PIIX=m
> # CONFIG_SATA_MV is not set
> # CONFIG_SATA_NV is not set
> # CONFIG_PDC_ADMA is not set
> # CONFIG_SATA_QSTOR is not set
> # CONFIG_SATA_PROMISE is not set
> # CONFIG_SATA_SX4 is not set
> # CONFIG_SATA_SIL is not set
> # CONFIG_SATA_SIS is not set
> # CONFIG_SATA_ULI is not set
> # CONFIG_SATA_VIA is not set
> # CONFIG_SATA_VITESSE is not set
> # CONFIG_SATA_INIC162X is not set
> # CONFIG_PATA_ACPI is not set
> # CONFIG_PATA_ALI is not set
> # CONFIG_PATA_AMD is not set
> # CONFIG_PATA_ARTOP is not set
> # CONFIG_PATA_ATIIXP is not set
> # CONFIG_PATA_CMD640_PCI is not set
> # CONFIG_PATA_CMD64X is not set
> # CONFIG_PATA_CS5520 is not set
> # CONFIG_PATA_CS5530 is not set
> # CONFIG_PATA_CYPRESS is not set
> # CONFIG_PATA_EFAR is not set
> # CONFIG_ATA_GENERIC is not set
> # CONFIG_PATA_HPT366 is not set
> # CONFIG_PATA_HPT37X is not set
> # CONFIG_PATA_HPT3X2N is not set
> # CONFIG_PATA_HPT3X3 is not set
> # CONFIG_PATA_IT821X is not set
> # CONFIG_PATA_IT8213 is not set
> # CONFIG_PATA_JMICRON is not set
> # CONFIG_PATA_TRIFLEX is not set
> # CONFIG_PATA_MARVELL is not set
> # CONFIG_PATA_MPIIX is not set
> # CONFIG_PATA_OLDPIIX is not set
> # CONFIG_PATA_NETCELL is not set
> # CONFIG_PATA_NINJA32 is not set
> # CONFIG_PATA_NS87410 is not set
> # CONFIG_PATA_NS87415 is not set
> # CONFIG_PATA_OPTI is not set
> # CONFIG_PATA_OPTIDMA is not set
> # CONFIG_PATA_PDC_OLD is not set
> # CONFIG_PATA_RADISYS is not set
> # CONFIG_PATA_RZ1000 is not set
> # CONFIG_PATA_SC1200 is not set
> # CONFIG_PATA_SERVERWORKS is not set
> # CONFIG_PATA_PDC2027X is not set
> # CONFIG_PATA_SIL680 is not set
> # CONFIG_PATA_SIS is not set
> # CONFIG_PATA_VIA is not set
> # CONFIG_PATA_WINBOND is not set
> # CONFIG_PATA_SCH is not set
704d757
< # CONFIG_KS8851_MLL is not set
714c767
< # CONFIG_IGB is not set
---
> CONFIG_IGB=m
752c805,808
< CONFIG_WLAN=y
---
>
> #
> # Wireless LAN
> #
804d859
< # CONFIG_KEYBOARD_ADP5588 is not set
806d860
< # CONFIG_QT2160 is not set
808d861
< # CONFIG_KEYBOARD_MAX7359 is not set
810d862
< # CONFIG_KEYBOARD_OPENCORES is not set
821d872
< # CONFIG_MOUSE_PS2_SENTELIC is not set
869a921,922
> # CONFIG_SX is not set
> # CONFIG_RIO is not set
911d963
< CONFIG_I2C_COMPAT=y
939,943d990
< # ACPI drivers
< #
< # CONFIG_I2C_SCMI is not set
<
< #
970a1018,1020
> # CONFIG_SENSORS_PCF8574 is not set
> # CONFIG_PCF8575 is not set
> # CONFIG_SENSORS_PCA9539 is not set
992,996d1041
< # CONFIG_HWMON_DEBUG_CHIP is not set
<
< #
< # Native drivers
< #
1046d1090
< # CONFIG_SENSORS_TMP421 is not set
1058,1061d1101
<
< #
< # ACPI drivers
< #
1062a1103
> # CONFIG_HWMON_DEBUG_CHIP is not set
1081d1121
< # CONFIG_MFD_WM831X is not set
1093d1132
< CONFIG_VGA_ARB=y
1095,1096d1133
< CONFIG_DRM_KMS_HELPER=m
< CONFIG_DRM_TTM=m
1177a1215
> CONFIG_HID_DEBUG=y
1201d1238
< CONFIG_HID_TWINHAN=y
1255d1291
< # CONFIG_USB_ISP1362_HCD is not set
1386d1421
< # CONFIG_NILFS2_FS is not set
1453a1489
> # CONFIG_NILFS2_FS is not set
1556d1591
< # CONFIG_STRIP_ASM_SYMS is not set
1595d1629
< # CONFIG_DEBUG_CREDENTIALS is not set
1602d1635
< # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
1646c1679
< # CONFIG_CRYPTO_FIPS is not set
---
> CONFIG_CRYPTO_FIPS=y
1689d1721
< # CONFIG_CRYPTO_VMAC is not set
1695d1726
< # CONFIG_CRYPTO_GHASH is not set
1741a1773
> CONFIG_HAVE_KVM_IRQCHIP=y

2009-12-09 06:45:00

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

>
> But let me try more on other ia64 boxes that I can get access.
>
> Stay tuned.

I might have reproduced the problem on a HP ia64 system
with -32 kernel as the following info. But -31 kernel with
lockdep code enabled just works. ....debugging...

CPI: SSDT 000000003fdf66c8 000E0 (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf67b8 0013C (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf68f8 000E0 (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf69e8 0013C (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf6b28 000E0 (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf6c18 0013C (v01 HP BL870c 00000006 INTL 20050309)
ACPI: SSDT 000000003fdf6d58 000E0 (v01 HP BL870c 00000006 INTL 20050309)
ACPI: Local APIC address c0000000fee00000
SMP: Allowing 16 CPUs, 8 hotplug CPUs
Initial ramdisk at: 0xe0000100fe9d8000 (5607915 bytes)
SAL 3.20: HP version 3.11
SAL Platform features: None
SAL: AP wakeup using external interrupt vector 0xff
ACPI: Local APIC address c0000000fee00000
Unable to handle kernel paging request at virtual address a0000009019b0328
swapper[0]: Oops 8813272891392 [1]
Modules linked in:

Pid: 0, CPU 0, comm: swapper
psr : 00001010084a2018 ifs : 8000000000000409 ip :
[<a0000001000e8ff0>] Not tainted (2.6.32)
ip is at save_trace+0xb0/0x1e0
unat: 0000000000000000 pfs : 0000000000000409 rsc : 0000000000000003
rnat: 000000001ad27480 bsps: 000000000001003e pr : 656960155aa6a559
ldrs: 0000000000000000 ccv : 0000000001e600f3 fpsr: 0009804c8a70433f
csd : 0000000000000000 ssd : 0000000000000000
b0 : a0000001000e8fc0 b6 : a000000100a6c440 b7 : e00000003f81f3a0
f6 : 000000000000000000000 f7 : 1003e0000000000000000
f8 : 1003e0000000000000000 f9 : 1003e0000000000000001
f10 : 10004c3ffffffff3c0000 f11 : 1003e0000000000000031
r1 : a00000010132c4b0 r2 : a000000100e07d60 r3 : 000000000000007c
r8 : a0000001018f2520 r9 : a0000009019b0328 r10 : 00000000ffffffff
r11 : a0000001019b0330 r12 : a000000100e07d60 r13 : a000000100e00000
r14 : a0000001018f2af0 r15 : 000000000003fffe r16 : ffffffffffffffff
r17 : 0000000000000001 r18 : 0000000000000000 r19 : 0000000000000000
r20 : a0000001019b0330 r21 : a000000101130a00 r22 : a0000001018f2c58
r23 : 0000000000000003 r24 : 0000000000040000 r25 : 0000000000040000
r26 : 0000000000000000 r27 : a0000001018f2b20 r28 : 0000000000001000
r29 : 0000000000000000 r30 : a000000100e00e00 r31 : a000000100e00dd8
Unable to handle kernel NULL pointer dereference (address 0000000000000000)
swapper[0]: Oops 8813272891392 [2]
Modules linked in:

Pid: 0, CPU 0, comm: swapper
psr : 0000101008022018 ifs : 800000000000048e ip :
[<a0000001001e1a60>] Not tainted (2.6.32)
ip is at kmem_cache_alloc+0xe0/0x3c0
unat: 0000000000000000 pfs : 000000000000048e rsc : 0000000000000003
rnat: 0000000000000000 bsps: 0000000000000000 pr : 656960155aa65965
ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c0270033f
csd : 0000000000000000 ssd : 0000000000000000
b0 : a0000001001e19f0 b6 : a000000100042420 b7 : a00000010000c9b0
f6 : 1003ea877512c4d0b873a f7 : 1003e9e3779b97f4a7c16
f8 : 1003e0a000000100015f7 f9 : 1003e0000000000000001
f10 : 10004c3ffffffff3c0000 f11 : 1003e0000000000000031
r1 : a00000010132c4b0 r2 : 0000000012000000 r3 : a000000100e00014
r8 : 0000000000000002 r9 : 00000000003fff2f r10 : a000000101151a60
r11 : a000000101151a60 r12 : a000000100e07230 r13 : a000000100e00000
r14 : 0000000000000000 r15 : 0000000000200000 r16 : 0000000000000000
r17 : 0000000000000000 r18 : a000000100e01984 r19 : a000000100e072ac
r20 : a000000100e072a4 r21 : 0000000000000000 r22 : a000000100e072a0
r23 : a000000100e072a4 r24 : 0000000000000001 r25 : 0000000000000000
r26 : a000000100e072a0 r27 : 0000000000000000 r28 : a000000100e072a8
r29 : 000000007fffffff r30 : a00000010110a030 r31 : 0000000000000002

2009-12-09 08:59:36

by Luming Yu

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Wed, Dec 9, 2009 at 2:45 PM, Luming Yu <[email protected]> wrote:
>>
>> But let me try more on other ia64 boxes that I can get access.
>>
>> Stay tuned.
>
> I might have reproduced the problem on a HP ia64 system
> with -32 kernel as the following info. But -31 kernel with
> lockdep code enabled just works. ....debugging...

ah, I seem to have found the change in -32 against -31 that causes the trouble.

Commenting out the change make -32 Lockdep kernel boot.

Tony, please let me know whether you can reproduce..

kernel/lockdep.c
static int save_trace(struct stack_trace *trace)
{
trace->nr_entries = 0;
trace->max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries;
trace->entries = stack_trace + nr_stack_trace_entries;

trace->skip = 3;

save_stack_trace(trace);
#if 0

/*
* Some daft arches put -1 at the end to indicate its a full trace.
*
* <rant> this is buggy anyway, since it takes a whole extra entry so a
* complete trace that maxes out the entries provided will be reported
* as incomplete, friggin useless </rant>
*/
if (trace->entries[trace->nr_entries-1] == ULONG_MAX)
trace->nr_entries--;
#endif

2009-12-09 18:11:20

by Luck, Tony

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Wed, Dec 9, 2009 at 12:52 AM, Luming Yu <[email protected]> wrote:
> Commenting out the change make -32 Lockdep kernel boot.
>
> Tony, please let me know whether you can reproduce..

Yes. Commenting this out makes the system bootable for me.

> kernel/lockdep.c
> static int save_trace(struct stack_trace *trace)
> {
> ? ? ? ?trace->nr_entries = 0;
> ? ? ? ?trace->max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries;
> ? ? ? ?trace->entries = stack_trace + nr_stack_trace_entries;
>
> ? ? ? ?trace->skip = 3;
>
> ? ? ? ?save_stack_trace(trace);
> #if 0
>
> ? ? ? ?/*
> ? ? ? ? * Some daft arches put -1 at the end to indicate its a full trace.
> ? ? ? ? *
> ? ? ? ? * <rant> this is buggy anyway, since it takes a whole extra entry so a
> ? ? ? ? * complete trace that maxes out the entries provided will be reported
> ? ? ? ? * as incomplete, friggin useless </rant>
> ? ? ? ? */
> ? ? ? ?if (trace->entries[trace->nr_entries-1] == ULONG_MAX)
> ? ? ? ? ? ? ? ?trace->nr_entries--;
> #endif

This happens because ia64 save_stack_trace() is currently an empty stub, so it
doesn't set trace->nr_entries.

Options:
1) Add trace->nr_entries = 1; to ia64 stub.
2) Change the generic code to defend against an unexpected failure in
save_stack_trace()

if (trace->nr_entries > 0 &&
trace->entries[trace->nr_entries-1] == ULONG_MAX)
trace->nr_entries--;
3) Delete the code in the "daft"[1] architectures, and drop this hunk
from the generic code.

-Tony

[1] arm, parisc, s390, sh, x86

2009-12-09 18:22:54

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [RFC PATCH] Add TRACE_IRQFLAGS_SUPPORT, LOCKDEP_SUPPORT then enable ftrace for ia64

On Wed, 2009-12-09 at 10:11 -0800, Tony Luck wrote:
> On Wed, Dec 9, 2009 at 12:52 AM, Luming Yu <[email protected]> wrote:
> > Commenting out the change make -32 Lockdep kernel boot.
> >
> > Tony, please let me know whether you can reproduce..
>
> Yes. Commenting this out makes the system bootable for me.
>
> > kernel/lockdep.c
> > static int save_trace(struct stack_trace *trace)
> > {
> > trace->nr_entries = 0;
> > trace->max_entries = MAX_STACK_TRACE_ENTRIES - nr_stack_trace_entries;
> > trace->entries = stack_trace + nr_stack_trace_entries;
> >
> > trace->skip = 3;
> >
> > save_stack_trace(trace);
> > #if 0
> >
> > /*
> > * Some daft arches put -1 at the end to indicate its a full trace.
> > *
> > * <rant> this is buggy anyway, since it takes a whole extra entry so a
> > * complete trace that maxes out the entries provided will be reported
> > * as incomplete, friggin useless </rant>
> > */
> > if (trace->entries[trace->nr_entries-1] == ULONG_MAX)
> > trace->nr_entries--;
> > #endif
>
> This happens because ia64 save_stack_trace() is currently an empty stub, so it
> doesn't set trace->nr_entries.
>
> Options:
> 1) Add trace->nr_entries = 1; to ia64 stub.
> 2) Change the generic code to defend against an unexpected failure in
> save_stack_trace()
>
> if (trace->nr_entries > 0 &&
> trace->entries[trace->nr_entries-1] == ULONG_MAX)
> trace->nr_entries--;
> 3) Delete the code in the "daft"[1] architectures, and drop this hunk
> from the generic code.

I'm thinking 2 and 3 together sound like a plan :-)