All of lore.kernel.org
 help / color / mirror / Atom feed
From: Edward Falk <efalk@google.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] Fix x86_64 _spin_lock_irqsave()
Date: Wed, 23 Aug 2006 19:57:01 -0700	[thread overview]
Message-ID: <44ED157D.6050607@google.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 279 bytes --]

Add spin_lock_string_flags and _raw_spin_lock_flags() to 
asm-x86_64/spinlock.h so that _spin_lock_irqsave() has the same 
semantics on x86_64 as it does on i386 and does *not* have interrupts 
disabled while it is waiting for the lock.

This fix is courtesy of Michael Davidson

[-- Attachment #2: 2012926.patch --]
[-- Type: text/plain, Size: 1665 bytes --]

Change 2012926 by md@md-test on 2006/01/23 18:28:12

	Add spin_lock_string_flags and _raw_spin_lock_flags() to
	asm-x86_64/spinlock.h so that _spin_lock_irqsave() has the
	same semantics on x86_64 as it does on i386 and does *not*
	have interrupts disabled while it is waiting for the lock.
	
	PRESUBMIT=passed
	
	R=mbligh mikew
	OCL=2010261

diff -uprN linux-2.6.17/include/asm-x86_64/spinlock.h 2012926/include/asm-x86_64/spinlock.h
--- linux-2.6.17/include/asm-x86_64/spinlock.h	2006-06-17 18:49:35.000000000 -0700
+++ 2012926/include/asm-x86_64/spinlock.h	2006-07-12 16:09:50.000000000 -0700
@@ -32,6 +32,23 @@
 	"jmp 1b\n" \
 	LOCK_SECTION_END
 
+#define __raw_spin_lock_string_flags \
+	"\n1:\t" \
+	"lock ; decb %0\n\t" \
+	"js 2f\n\t" \
+	LOCK_SECTION_START("") \
+	"2:\t" \
+	"test $0x200, %1\n\t" \
+	"jz 3f\n\t" \
+	"sti\n\t" \
+	"3:\t" \
+	"rep;nop\n\t" \
+	"cmpb $0, %0\n\t" \
+	"jle 3b\n\t" \
+	"cli\n\t" \
+	"jmp 1b\n" \
+	LOCK_SECTION_END
+
 #define __raw_spin_unlock_string \
 	"movl $1,%0" \
 		:"=m" (lock->slock) : : "memory"
@@ -43,8 +60,6 @@ static inline void __raw_spin_lock(raw_s
 		:"=m" (lock->slock) : : "memory");
 }
 
-#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
-
 static inline int __raw_spin_trylock(raw_spinlock_t *lock)
 {
 	int oldval;
@@ -57,6 +72,13 @@ static inline int __raw_spin_trylock(raw
 	return oldval > 0;
 }
 
+static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
+{
+	__asm__ __volatile__(
+		__raw_spin_lock_string_flags
+		:"=m" (lock->slock) : "r" (flags) : "memory");
+}
+
 static inline void __raw_spin_unlock(raw_spinlock_t *lock)
 {
 	__asm__ __volatile__(

             reply	other threads:[~2006-08-24  2:57 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-24  2:57 Edward Falk [this message]
2006-08-24  3:10 ` [PATCH] Fix x86_64 _spin_lock_irqsave() Nick Piggin
2006-08-24  4:48   ` Andrew Morton
2006-08-24 15:53     ` Martin Bligh
2006-08-26  7:52       ` Keith Owens
2006-08-24  6:45 ` Andi Kleen
2006-08-24 11:04   ` Suleiman Souhlal
2006-08-24 11:13     ` Arjan van de Ven
2006-08-24 11:32     ` Andi Kleen
2006-08-24 12:33       ` Suleiman Souhlal
2006-08-24 13:21         ` Arjan van de Ven
2006-08-24 13:44           ` Suleiman Souhlal
2006-08-25  4:38   ` Andrew Morton
2006-08-25  5:33     ` Nick Piggin
2006-08-25  6:21     ` Andi Kleen

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=44ED157D.6050607@google.com \
    --to=efalk@google.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.