git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge master.kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
[pandora-kernel.git]
/
kernel
/
futex.c
diff --git
a/kernel/futex.c
b/kernel/futex.c
index
b364e00
..
95989a3
100644
(file)
--- a/
kernel/futex.c
+++ b/
kernel/futex.c
@@
-282,9
+282,9
@@
static inline int get_futex_value_locked(u32 *dest, u32 __user *from)
{
int ret;
{
int ret;
-
inc_preempt_count
();
+
pagefault_disable
();
ret = __copy_from_user_inatomic(dest, from, sizeof(u32));
ret = __copy_from_user_inatomic(dest, from, sizeof(u32));
-
dec_preempt_count
();
+
pagefault_enable
();
return ret ? -EFAULT : 0;
}
return ret ? -EFAULT : 0;
}
@@
-324,12
+324,11
@@
static int refill_pi_state_cache(void)
if (likely(current->pi_state_cache))
return 0;
if (likely(current->pi_state_cache))
return 0;
- pi_state = k
m
alloc(sizeof(*pi_state), GFP_KERNEL);
+ pi_state = k
z
alloc(sizeof(*pi_state), GFP_KERNEL);
if (!pi_state)
return -ENOMEM;
if (!pi_state)
return -ENOMEM;
- memset(pi_state, 0, sizeof(*pi_state));
INIT_LIST_HEAD(&pi_state->list);
/* pi_mutex gets initialized later */
pi_state->owner = NULL;
INIT_LIST_HEAD(&pi_state->list);
/* pi_mutex gets initialized later */
pi_state->owner = NULL;
@@
-553,7
+552,7
@@
static void wake_futex(struct futex_q *q)
* at the end of wake_up_all() does not prevent this store from
* moving.
*/
* at the end of wake_up_all() does not prevent this store from
* moving.
*/
- wmb();
+
smp_
wmb();
q->lock_ptr = NULL;
}
q->lock_ptr = NULL;
}
@@
-585,9
+584,9
@@
static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
if (!(uval & FUTEX_OWNER_DIED)) {
newval = FUTEX_WAITERS | new_owner->pid;
if (!(uval & FUTEX_OWNER_DIED)) {
newval = FUTEX_WAITERS | new_owner->pid;
-
inc_preempt_count
();
+
pagefault_disable
();
curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
-
dec_preempt_count
();
+
pagefault_enable
();
if (curval == -EFAULT)
return -EFAULT;
if (curval != uval)
if (curval == -EFAULT)
return -EFAULT;
if (curval != uval)
@@
-618,9
+617,9
@@
static int unlock_futex_pi(u32 __user *uaddr, u32 uval)
* There is no waiter, so we unlock the futex. The owner died
* bit has not to be preserved here. We are the owner:
*/
* There is no waiter, so we unlock the futex. The owner died
* bit has not to be preserved here. We are the owner:
*/
-
inc_preempt_count
();
+
pagefault_disable
();
oldval = futex_atomic_cmpxchg_inatomic(uaddr, uval, 0);
oldval = futex_atomic_cmpxchg_inatomic(uaddr, uval, 0);
-
dec_preempt_count
();
+
pagefault_enable
();
if (oldval == -EFAULT)
return oldval;
if (oldval == -EFAULT)
return oldval;
@@
-1158,9
+1157,9
@@
static int futex_lock_pi(u32 __user *uaddr, int detect, unsigned long sec,
*/
newval = current->pid;
*/
newval = current->pid;
-
inc_preempt_count
();
+
pagefault_disable
();
curval = futex_atomic_cmpxchg_inatomic(uaddr, 0, newval);
curval = futex_atomic_cmpxchg_inatomic(uaddr, 0, newval);
-
dec_preempt_count
();
+
pagefault_enable
();
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
@@
-1183,9
+1182,9
@@
static int futex_lock_pi(u32 __user *uaddr, int detect, unsigned long sec,
uval = curval;
newval = uval | FUTEX_WAITERS;
uval = curval;
newval = uval | FUTEX_WAITERS;
-
inc_preempt_count
();
+
pagefault_disable
();
curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
-
dec_preempt_count
();
+
pagefault_enable
();
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
@@
-1215,10
+1214,10
@@
static int futex_lock_pi(u32 __user *uaddr, int detect, unsigned long sec,
newval = current->pid |
FUTEX_OWNER_DIED | FUTEX_WAITERS;
newval = current->pid |
FUTEX_OWNER_DIED | FUTEX_WAITERS;
-
inc_preempt_count
();
+
pagefault_disable
();
curval = futex_atomic_cmpxchg_inatomic(uaddr,
uval, newval);
curval = futex_atomic_cmpxchg_inatomic(uaddr,
uval, newval);
-
dec_preempt_count
();
+
pagefault_enable
();
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
if (unlikely(curval == -EFAULT))
goto uaddr_faulted;
@@
-1390,9
+1389,9
@@
retry_locked:
* anyone else up:
*/
if (!(uval & FUTEX_OWNER_DIED)) {
* anyone else up:
*/
if (!(uval & FUTEX_OWNER_DIED)) {
-
inc_preempt_count
();
+
pagefault_disable
();
uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0);
uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0);
-
dec_preempt_count
();
+
pagefault_enable
();
}
if (unlikely(uval == -EFAULT))
}
if (unlikely(uval == -EFAULT))
@@
-1493,7
+1492,7
@@
static unsigned int futex_poll(struct file *filp,
return ret;
}
return ret;
}
-static struct file_operations futex_fops = {
+static
const
struct file_operations futex_fops = {
.release = futex_close,
.poll = futex_poll,
};
.release = futex_close,
.poll = futex_poll,
};
@@
-1507,6
+1506,13
@@
static int futex_fd(u32 __user *uaddr, int signal)
struct futex_q *q;
struct file *filp;
int ret, err;
struct futex_q *q;
struct file *filp;
int ret, err;
+ static unsigned long printk_interval;
+
+ if (printk_timed_ratelimit(&printk_interval, 60 * 60 * 1000)) {
+ printk(KERN_WARNING "Process `%s' used FUTEX_FD, which "
+ "will be removed from the kernel in June 2007\n",
+ current->comm);
+ }
ret = -EINVAL;
if (!valid_signal(signal))
ret = -EINVAL;
if (!valid_signal(signal))
@@
-1851,10
+1857,16
@@
static struct file_system_type futex_fs_type = {
static int __init init(void)
{
static int __init init(void)
{
- unsigned int i;
+ int i = register_filesystem(&futex_fs_type);
+
+ if (i)
+ return i;
- register_filesystem(&futex_fs_type);
futex_mnt = kern_mount(&futex_fs_type);
futex_mnt = kern_mount(&futex_fs_type);
+ if (IS_ERR(futex_mnt)) {
+ unregister_filesystem(&futex_fs_type);
+ return PTR_ERR(futex_mnt);
+ }
for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
INIT_LIST_HEAD(&futex_queues[i].chain);
for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
INIT_LIST_HEAD(&futex_queues[i].chain);