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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox