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(¤t->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(¤t->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(¤t->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(¤t->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
next 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.