From: Zoltan Menyhart <Zoltan.Menyhart_AT_bull.net@nospam.org>
To: linux-ia64@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Who owns those locks ?
Date: Wed, 12 May 2004 11:56:14 +0200 [thread overview]
Message-ID: <40A1F4BE.4A298352@nospam.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 1019 bytes --]
Got a dead lock ?
No idea how you got there ?
Why don't you put the ID of the owner of the lock in the lock word ?
Here is your patch for IA-64.
Doesn't cost any additional instruction, you can have it in your
"production" kernel, too.
The current task pointers are identity mapped memory addresses.
I shift them to the right by 12 bits (these bits are always 0-s).
In that way, addresses up to 16 Tbytes can fit into the lock word.
Interrupt handlers use the current task pointers as IDs, too.
An interrupt handler has to free all the locks it has taken,
therefore using the same ID as the task pre-empted uses, is not
confusing. Locks which are taken with / without interrupt disabling
form two distinct sets.
If you are back into the pre-empted task and should there is a
"left over" lock with the ID of the task => you've got a hint ;-)
In debug mode, you can check if the lock is yours before setting it free:
#define spin_is_mine(x) ((x)->lock == (__u32)((__u64) current >> 12))
Good luck.
Zoltán Menyhárt
[-- Attachment #2: n475 --]
[-- Type: text/plain, Size: 2553 bytes --]
--- 2.6.5.ref/include/asm-ia64/spinlock.h Sun Apr 4 05:36:17 2004
+++ 2.6.5.new/include/asm-ia64/spinlock.h Wed May 12 10:29:38 2004
@@ -45,7 +45,8 @@
asm volatile ("{\n\t"
" mov ar.ccv = r0\n\t"
" mov r28 = ip\n\t"
- " mov r30 = 1;;\n\t"
+ /* " mov r30 = 1;;\n\t" */
+ " shr.u r30 = r13, 12;;\n\t" /* Current task pointer */
"}\n\t"
"cmpxchg4.acq r30 = [%1], r30, ar.ccv\n\t"
"movl r29 = ia64_spinlock_contention_pre3_4;;\n\t"
@@ -57,7 +58,8 @@
asm volatile ("{\n\t"
" mov ar.ccv = r0\n\t"
" mov r28 = ip\n\t"
- " mov r30 = 1;;\n\t"
+ /* " mov r30 = 1;;\n\t" */
+ " shr.u r30 = r13, 12;;\n\t" /* Current task pointer */
"}\n\t"
"cmpxchg4.acq r30 = [%1], r30, ar.ccv;;\n\t"
"cmp4.ne p14, p0 = r30, r0\n"
@@ -68,7 +70,8 @@
# ifdef CONFIG_ITANIUM
/* don't use brl on Itanium... */
/* mis-declare, so we get the entry-point, not it's function descriptor: */
- asm volatile ("mov r30 = 1\n\t"
+ asm volatile (/* " mov r30 = 1;;\n\t" */
+ " shr.u r30 = r13, 12;;\n\t" /* Current task pointer */
"mov ar.ccv = r0;;\n\t"
"cmpxchg4.acq r30 = [%0], r30, ar.ccv\n\t"
"movl r29 = ia64_spinlock_contention;;\n\t"
@@ -77,7 +80,8 @@
"(p14) br.call.spnt.many b6 = b6"
: "=r"(ptr) : "r"(ptr) : IA64_SPINLOCK_CLOBBERS);
# else
- asm volatile ("mov r30 = 1\n\t"
+ asm volatile (/* " mov r30 = 1;;\n\t" */
+ " shr.u r30 = r13, 12;;\n\t" /* Current task pointer */
"mov ar.ccv = r0;;\n\t"
"cmpxchg4.acq r30 = [%0], r30, ar.ccv;;\n\t"
"cmp4.ne p14, p0 = r30, r0\n\t"
@@ -89,14 +93,17 @@
#else /* !ASM_SUPPORTED */
# define _raw_spin_lock(x) \
do { \
- __u32 *ia64_spinlock_ptr = (__u32 *) (x); \
- __u64 ia64_spinlock_val; \
- ia64_spinlock_val = ia64_cmpxchg4_acq(ia64_spinlock_ptr, 1, 0); \
+ __u32 *ia64_spinlock_ptr = (__u32 *) (x); \
+ __u64 ia64_spinlock_val; \
+ __u32 new_spinlock_val = (__u32)((__u64) current >> 12); \
+ \
+ ia64_spinlock_val = ia64_cmpxchg4_acq(ia64_spinlock_ptr, new_spinlock_val, 0); \
if (unlikely(ia64_spinlock_val)) { \
do { \
while (*ia64_spinlock_ptr) \
ia64_barrier(); \
- ia64_spinlock_val = ia64_cmpxchg4_acq(ia64_spinlock_ptr, 1, 0); \
+ ia64_spinlock_val = ia64_cmpxchg4_acq(ia64_spinlock_ptr, \
+ new_spinlock_val, 0); \
} while (ia64_spinlock_val); \
} \
} while (0)
next reply other threads:[~2004-05-12 9:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-12 9:56 Zoltan Menyhart [this message]
2004-05-13 18:43 ` Who owns those locks ? Anton Blanchard
2004-06-03 17:39 ` Bjorn Helgaas
2004-06-07 8:58 ` Zoltan Menyhart
2004-06-07 15:06 ` Bjorn Helgaas
2004-06-08 8:03 ` Zoltan Menyhart
2004-06-08 15:05 ` Bjorn Helgaas
2004-06-08 15:38 ` Zoltan Menyhart
-- strict thread matches above, loose matches on Subject: below --
2004-05-12 10:25 Luck, Tony
2004-05-12 11:06 ` Zoltan Menyhart
2004-05-12 11:43 Luck, Tony
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=40A1F4BE.4A298352@nospam.org \
--to=zoltan.menyhart_at_bull.net@nospam.org \
--cc=Zoltan.Menyhart@bull.net \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox