All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Singleton <dsingleton@mvista.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: robustmutexes@lists.osdl.org, linux-kernel@vger.kernel.org
Subject: Robust Futex update
Date: Wed, 12 Oct 2005 17:00:02 -0700	[thread overview]
Message-ID: <434DA382.1050100@mvista.com> (raw)

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

Ingo,
    here 's a patch for 2.6.14-rc4-rt1 that fixes two things:

1) Deregister futex returns -EBUSY instead of -EINVAL if a thread tries 
to deregister a pthread_mutex that another thread has locked.

2)  Make the fast path robust.  If a pthread_mutex is only locked in 
user space we need to clear the owner when
the thread dies.  This makes both the 'rt_mutex is locked in the kernel' 
and the 'pthread_mutex is only locked in user space'
paths robust.

David

[-- Attachment #2: patch-2.6.14-rc4-rt1-rf1 --]
[-- Type: text/plain, Size: 2226 bytes --]

Index: linux-2.6.13/kernel/futex.c
===================================================================
--- linux-2.6.13.orig/kernel/futex.c
+++ linux-2.6.13/kernel/futex.c
@@ -1354,18 +1354,25 @@ static void find_owned_futex(struct vm_a
 		if (uaddr == 0)
 			continue;
 
+		up(&mapping->robust_sem);
+		up_read(&current->mm->mmap_sem);
+		value = futex_get_user(uaddr);
+		if (this->futex_mutex.mutex_attr & FUTEX_ATTR_ROBUST)
+			value |= FUTEX_OWNER_DIED;
 		if (rt_mutex_owned_by(&this->futex_mutex, ti)) {
-			up(&mapping->robust_sem);
-			up_read(&current->mm->mmap_sem);
-			if (this->futex_mutex.mutex_attr & FUTEX_ATTR_ROBUST) {
-	 			value = futex_get_user(uaddr);
-				value |= FUTEX_OWNER_DIED;
- 				futex_put_user(value, uaddr);
-			}
+			futex_put_user(value, uaddr);
 			up_futex(&this->futex_mutex);
-			down(&mapping->robust_sem);
-			down_read(&current->mm->mmap_sem);
+		} else if ((value & FUTEX_PID) == current->pid) {
+			/*
+			 * this bit is for the fast path.  If the lock is only
+			 * locked in user space wee need to unlock it
+			 * for the exiting thread.
+			 */
+			value &= ~FUTEX_PID;
+			futex_put_user(value, uaddr);
 		}
+		down(&mapping->robust_sem);
+		down_read(&current->mm->mmap_sem);
 	}
 
 	up(&mapping->robust_sem);
@@ -1524,7 +1531,7 @@ static int futex_deregister(unsigned lon
 			if (rt_mutex_owned_by(&this->futex_mutex, ti)) {
 				up_futex(&this->futex_mutex);
 			} else if (rt_mutex_owner(&this->futex_mutex) != NULL) {
-				ret = -EINVAL;
+				ret = -EBUSY;
 				break;
 			}
 			list_del(&this->list);
Index: linux-2.6.13/include/linux/futex.h
===================================================================
--- linux-2.6.13.orig/include/linux/futex.h
+++ linux-2.6.13/include/linux/futex.h
@@ -1,8 +1,6 @@
 #ifndef _LINUX_FUTEX_H
 #define _LINUX_FUTEX_H
 
-#include <linux/fs.h>
-
 /* Second argument to futex syscall */
 
 
Index: linux-2.6.13/kernel/rt.c
===================================================================
--- linux-2.6.13.orig/kernel/rt.c
+++ linux-2.6.13/kernel/rt.c
@@ -47,6 +47,7 @@
 #include <linux/syscalls.h>
 #include <linux/interrupt.h>
 #include <linux/plist.h>
+#include <linux/fs.h>
 #include <linux/futex.h>
 
 #define CAPTURE_LOCK

             reply	other threads:[~2005-10-13  0:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-13  0:00 David Singleton [this message]
2005-10-14  5:35 ` Robust Futex update Ingo Molnar
2005-10-14  5:45 ` Ingo Molnar
2005-10-14 17:40   ` Khem Raj

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=434DA382.1050100@mvista.com \
    --to=dsingleton@mvista.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=robustmutexes@lists.osdl.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.