]> err.no Git - linux-2.6/blobdiff - include/linux/futex.h
Merge git://oss.sgi.com:8090/xfs/xfs-2.6
[linux-2.6] / include / linux / futex.h
index 966a5b3da439b40232c269f44026733db5a76244..820125c628c1364478cfcc513275214aa9da628a 100644 (file)
@@ -12,6 +12,9 @@
 #define FUTEX_REQUEUE          3
 #define FUTEX_CMP_REQUEUE      4
 #define FUTEX_WAKE_OP          5
+#define FUTEX_LOCK_PI          6
+#define FUTEX_UNLOCK_PI                7
+#define FUTEX_TRYLOCK_PI       8
 
 /*
  * Support for robust futexes: the kernel cleans up held futexes at
@@ -90,19 +93,54 @@ struct robust_list_head {
  */
 #define ROBUST_LIST_LIMIT      2048
 
-long do_futex(unsigned long uaddr, int op, int val,
-               unsigned long timeout, unsigned long uaddr2, int val2,
-               int val3);
+#ifdef __KERNEL__
+long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout,
+             u32 __user *uaddr2, u32 val2, u32 val3);
 
-extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr);
+extern int
+handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
+
+/*
+ * Futexes are matched on equal values of this key.
+ * The key type depends on whether it's a shared or private mapping.
+ * Don't rearrange members without looking at hash_futex().
+ *
+ * offset is aligned to a multiple of sizeof(u32) (== 4) by definition.
+ * We set bit 0 to indicate if it's an inode-based key.
+ */
+union futex_key {
+       struct {
+               unsigned long pgoff;
+               struct inode *inode;
+               int offset;
+       } shared;
+       struct {
+               unsigned long address;
+               struct mm_struct *mm;
+               int offset;
+       } private;
+       struct {
+               unsigned long word;
+               void *ptr;
+               int offset;
+       } both;
+};
+int get_futex_key(u32 __user *uaddr, union futex_key *key);
+void get_futex_key_refs(union futex_key *key);
+void drop_futex_key_refs(union futex_key *key);
 
 #ifdef CONFIG_FUTEX
 extern void exit_robust_list(struct task_struct *curr);
+extern void exit_pi_state_list(struct task_struct *curr);
 #else
 static inline void exit_robust_list(struct task_struct *curr)
 {
 }
+static inline void exit_pi_state_list(struct task_struct *curr)
+{
+}
 #endif
+#endif /* __KERNEL__ */
 
 #define FUTEX_OP_SET           0       /* *(int *)UADDR2 = OPARG; */
 #define FUTEX_OP_ADD           1       /* *(int *)UADDR2 += OPARG; */