1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47#include <linux/slab.h>
48#include <linux/poll.h>
49#include <linux/fs.h>
50#include <linux/file.h>
51#include <linux/jhash.h>
52#include <linux/init.h>
53#include <linux/futex.h>
54#include <linux/mount.h>
55#include <linux/pagemap.h>
56#include <linux/syscalls.h>
57#include <linux/signal.h>
58#include <linux/export.h>
59#include <linux/magic.h>
60#include <linux/pid.h>
61#include <linux/nsproxy.h>
62#include <linux/ptrace.h>
63#include <linux/sched/rt.h>
64#include <linux/sched/wake_q.h>
65#include <linux/sched/mm.h>
66#include <linux/hugetlb.h>
67#include <linux/freezer.h>
68#include <linux/memblock.h>
69#include <linux/fault-inject.h>
70
71#include <asm/futex.h>
72
73#include "locking/rtmutex_common.h"
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
177int __read_mostly futex_cmpxchg_enabled;
178#endif
179
180
181
182
183
184#ifdef CONFIG_MMU
185# define FLAGS_SHARED 0x01
186#else
187
188
189
190
191# define FLAGS_SHARED 0x00
192#endif
193#define FLAGS_CLOCKRT 0x02
194#define FLAGS_HAS_TIMEOUT 0x04
195
196
197
198
199struct futex_pi_state {
200
201
202
203
204 struct list_head list;
205
206
207
208
209 struct rt_mutex pi_mutex;
210
211 struct task_struct *owner;
212 atomic_t refcount;
213
214 union futex_key key;
215} __randomize_layout;
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239struct futex_q {
240 struct plist_node list;
241
242 struct task_struct *task;
243 spinlock_t *lock_ptr;
244 union futex_key key;
245 struct futex_pi_state *pi_state;
246 struct rt_mutex_waiter *rt_waiter;
247 union futex_key *requeue_pi_key;
248 u32 bitset;
249} __randomize_layout;
250
251static const struct futex_q futex_q_init = {
252
253 .key = FUTEX_KEY_INIT,
254 .bitset = FUTEX_BITSET_MATCH_ANY
255};
256
257
258
259
260
261
262struct futex_hash_bucket {
263 atomic_t waiters;
264 spinlock_t lock;
265 struct plist_head chain;
266} ____cacheline_aligned_in_smp;
267
268
269
270
271
272
273static struct {
274 struct futex_hash_bucket *queues;
275 unsigned long hashsize;
276} __futex_data __read_mostly __aligned(2*sizeof(long));
277#define futex_queues (__futex_data.queues)
278#define futex_hashsize (__futex_data.hashsize)
279
280
281
282
283
284#ifdef CONFIG_FAIL_FUTEX
285
286static struct {
287 struct fault_attr attr;
288
289 bool ignore_private;
290} fail_futex = {
291 .attr = FAULT_ATTR_INITIALIZER,
292 .ignore_private = false,
293};
294
295static int __init setup_fail_futex(char *str)
296{
297 return setup_fault_attr(&fail_futex.attr, str);
298}
299__setup("fail_futex=", setup_fail_futex);
300
301static bool should_fail_futex(bool fshared)
302{
303 if (fail_futex.ignore_private && !fshared)
304 return false;
305
306 return should_fail(&fail_futex.attr, 1);
307}
308
309#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
310
311static int __init fail_futex_debugfs(void)
312{
313 umode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
314 struct dentry *dir;
315
316 dir = fault_create_debugfs_attr("fail_futex", NULL,
317 &fail_futex.attr);
318 if (IS_ERR(dir))
319 return PTR_ERR(dir);
320
321 if (!debugfs_create_bool("ignore-private", mode, dir,
322 &fail_futex.ignore_private)) {
323 debugfs_remove_recursive(dir);
324 return -ENOMEM;
325 }
326
327 return 0;
328}
329
330late_initcall(fail_futex_debugfs);
331
332#endif
333
334#else
335static inline bool should_fail_futex(bool fshared)
336{
337 return false;
338}
339#endif
340
341static inline void futex_get_mm(union futex_key *key)
342{
343 mmgrab(key->private.mm);
344
345
346
347
348
349 smp_mb__after_atomic();
350}
351
352
353
354
355static inline void hb_waiters_inc(struct futex_hash_bucket *hb)
356{
357#ifdef CONFIG_SMP
358 atomic_inc(&hb->waiters);
359
360
361
362 smp_mb__after_atomic();
363#endif
364}
365
366
367
368
369
370static inline void hb_waiters_dec(struct futex_hash_bucket *hb)
371{
372#ifdef CONFIG_SMP
373 atomic_dec(&hb->waiters);
374#endif
375}
376
377static inline int hb_waiters_pending(struct futex_hash_bucket *hb)
378{
379#ifdef CONFIG_SMP
380 return atomic_read(&hb->waiters);
381#else
382 return 1;
383#endif
384}
385
386
387
388
389
390
391
392
393static struct futex_hash_bucket *hash_futex(union futex_key *key)
394{
395 u32 hash = jhash2((u32*)&key->both.word,
396 (sizeof(key->both.word)+sizeof(key->both.ptr))/4,
397 key->both.offset);
398 return &futex_queues[hash & (futex_hashsize - 1)];
399}
400
401
402
403
404
405
406
407
408
409static inline int match_futex(union futex_key *key1, union futex_key *key2)
410{
411 return (key1 && key2
412 && key1->both.word == key2->both.word
413 && key1->both.ptr == key2->both.ptr
414 && key1->both.offset == key2->both.offset);
415}
416
417
418
419
420
421
422static void get_futex_key_refs(union futex_key *key)
423{
424 if (!key->both.ptr)
425 return;
426
427
428
429
430
431
432 if (!IS_ENABLED(CONFIG_MMU)) {
433 smp_mb();
434 return;
435 }
436
437 switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) {
438 case FUT_OFF_INODE:
439 ihold(key->shared.inode);
440 break;
441 case FUT_OFF_MMSHARED:
442 futex_get_mm(key);
443 break;
444 default:
445
446
447
448
449
450 smp_mb();
451 }
452}
453
454
455
456
457
458
459
460static void drop_futex_key_refs(union futex_key *key)
461{
462 if (!key->both.ptr) {
463
464 WARN_ON_ONCE(1);
465 return;
466 }
467
468 if (!IS_ENABLED(CONFIG_MMU))
469 return;
470
471 switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) {
472 case FUT_OFF_INODE:
473 iput(key->shared.inode);
474 break;
475 case FUT_OFF_MMSHARED:
476 mmdrop(key->private.mm);
477 break;
478 }
479}
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499static int
500get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
501{
502 unsigned long address = (unsigned long)uaddr;
503 struct mm_struct *mm = current->mm;
504 struct page *page, *tail;
505 struct address_space *mapping;
506 int err, ro = 0;
507
508
509
510
511 key->both.offset = address % PAGE_SIZE;
512 if (unlikely((address % sizeof(u32)) != 0))
513 return -EINVAL;
514 address -= key->both.offset;
515
516 if (unlikely(!access_ok(rw, uaddr, sizeof(u32))))
517 return -EFAULT;
518
519 if (unlikely(should_fail_futex(fshared)))
520 return -EFAULT;
521
522
523
524
525
526
527
528
529 if (!fshared) {
530 key->private.mm = mm;
531 key->private.address = address;
532 get_futex_key_refs(key);
533 return 0;
534 }
535
536again:
537
538 if (unlikely(should_fail_futex(fshared)))
539 return -EFAULT;
540
541 err = get_user_pages_fast(address, 1, 1, &page);
542
543
544
545
546 if (err == -EFAULT && rw == VERIFY_READ) {
547 err = get_user_pages_fast(address, 1, 0, &page);
548 ro = 1;
549 }
550 if (err < 0)
551 return err;
552 else
553 err = 0;
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573 tail = page;
574 page = compound_head(page);
575 mapping = READ_ONCE(page->mapping);
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592 if (unlikely(!mapping)) {
593 int shmem_swizzled;
594
595
596
597
598
599
600 lock_page(page);
601 shmem_swizzled = PageSwapCache(page) || page->mapping;
602 unlock_page(page);
603 put_page(page);
604
605 if (shmem_swizzled)
606 goto again;
607
608 return -EFAULT;
609 }
610
611
612
613
614
615
616
617
618
619
620
621 if (PageAnon(page)) {
622
623
624
625
626 if (unlikely(should_fail_futex(fshared)) || ro) {
627 err = -EFAULT;
628 goto out;
629 }
630
631 key->both.offset |= FUT_OFF_MMSHARED;
632 key->private.mm = mm;
633 key->private.address = address;
634
635 get_futex_key_refs(key);
636
637 } else {
638 struct inode *inode;
639
640
641
642
643
644
645
646
647
648
649
650
651 rcu_read_lock();
652
653 if (READ_ONCE(page->mapping) != mapping) {
654 rcu_read_unlock();
655 put_page(page);
656
657 goto again;
658 }
659
660 inode = READ_ONCE(mapping->host);
661 if (!inode) {
662 rcu_read_unlock();
663 put_page(page);
664
665 goto again;
666 }
667
668
669
670
671
672
673
674
675
676
677
678
679
680 if (!atomic_inc_not_zero(&inode->i_count)) {
681 rcu_read_unlock();
682 put_page(page);
683
684 goto again;
685 }
686
687
688 if (WARN_ON_ONCE(inode->i_mapping != mapping)) {
689 err = -EFAULT;
690 rcu_read_unlock();
691 iput(inode);
692
693 goto out;
694 }
695
696 key->both.offset |= FUT_OFF_INODE;
697 key->shared.inode = inode;
698 key->shared.pgoff = basepage_index(tail);
699 rcu_read_unlock();
700 }
701
702out:
703 put_page(page);
704 return err;
705}
706
707static inline void put_futex_key(union futex_key *key)
708{
709 drop_futex_key_refs(key);
710}
711
712
713
714
715
716
717
718
719
720
721
722
723
724static int fault_in_user_writeable(u32 __user *uaddr)
725{
726 struct mm_struct *mm = current->mm;
727 int ret;
728
729 down_read(&mm->mmap_sem);
730 ret = fixup_user_fault(current, mm, (unsigned long)uaddr,
731 FAULT_FLAG_WRITE, NULL);
732 up_read(&mm->mmap_sem);
733
734 return ret < 0 ? ret : 0;
735}
736
737
738
739
740
741
742
743
744static struct futex_q *futex_top_waiter(struct futex_hash_bucket *hb,
745 union futex_key *key)
746{
747 struct futex_q *this;
748
749 plist_for_each_entry(this, &hb->chain, list) {
750 if (match_futex(&this->key, key))
751 return this;
752 }
753 return NULL;
754}
755
756static int cmpxchg_futex_value_locked(u32 *curval, u32 __user *uaddr,
757 u32 uval, u32 newval)
758{
759 int ret;
760
761 pagefault_disable();
762 ret = futex_atomic_cmpxchg_inatomic(curval, uaddr, uval, newval);
763 pagefault_enable();
764
765 return ret;
766}
767
768static int get_futex_value_locked(u32 *dest, u32 __user *from)
769{
770 int ret;
771
772 pagefault_disable();
773 ret = __get_user(*dest, from);
774 pagefault_enable();
775
776 return ret ? -EFAULT : 0;
777}
778
779
780
781
782
783static int refill_pi_state_cache(void)
784{
785 struct futex_pi_state *pi_state;
786
787 if (likely(current->pi_state_cache))
788 return 0;
789
790 pi_state = kzalloc(sizeof(*pi_state), GFP_KERNEL);
791
792 if (!pi_state)
793 return -ENOMEM;
794
795 INIT_LIST_HEAD(&pi_state->list);
796
797 pi_state->owner = NULL;
798 atomic_set(&pi_state->refcount, 1);
799 pi_state->key = FUTEX_KEY_INIT;
800
801 current->pi_state_cache = pi_state;
802
803 return 0;
804}
805
806static struct futex_pi_state *alloc_pi_state(void)
807{
808 struct futex_pi_state *pi_state = current->pi_state_cache;
809
810 WARN_ON(!pi_state);
811 current->pi_state_cache = NULL;
812
813 return pi_state;
814}
815
816static void get_pi_state(struct futex_pi_state *pi_state)
817{
818 WARN_ON_ONCE(!atomic_inc_not_zero(&pi_state->refcount));
819}
820
821
822
823
824
825static void put_pi_state(struct futex_pi_state *pi_state)
826{
827 if (!pi_state)
828 return;
829
830 if (!atomic_dec_and_test(&pi_state->refcount))
831 return;
832
833
834
835
836
837 if (pi_state->owner) {
838 struct task_struct *owner;
839
840 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
841 owner = pi_state->owner;
842 if (owner) {
843 raw_spin_lock(&owner->pi_lock);
844 list_del_init(&pi_state->list);
845 raw_spin_unlock(&owner->pi_lock);
846 }
847 rt_mutex_proxy_unlock(&pi_state->pi_mutex, owner);
848 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
849 }
850
851 if (current->pi_state_cache) {
852 kfree(pi_state);
853 } else {
854
855
856
857
858
859 pi_state->owner = NULL;
860 atomic_set(&pi_state->refcount, 1);
861 current->pi_state_cache = pi_state;
862 }
863}
864
865#ifdef CONFIG_FUTEX_PI
866
867
868
869
870
871
872void exit_pi_state_list(struct task_struct *curr)
873{
874 struct list_head *next, *head = &curr->pi_state_list;
875 struct futex_pi_state *pi_state;
876 struct futex_hash_bucket *hb;
877 union futex_key key = FUTEX_KEY_INIT;
878
879 if (!futex_cmpxchg_enabled)
880 return;
881
882
883
884
885
886 raw_spin_lock_irq(&curr->pi_lock);
887 while (!list_empty(head)) {
888 next = head->next;
889 pi_state = list_entry(next, struct futex_pi_state, list);
890 key = pi_state->key;
891 hb = hash_futex(&key);
892
893
894
895
896
897
898
899
900
901
902
903 if (!atomic_inc_not_zero(&pi_state->refcount)) {
904 raw_spin_unlock_irq(&curr->pi_lock);
905 cpu_relax();
906 raw_spin_lock_irq(&curr->pi_lock);
907 continue;
908 }
909 raw_spin_unlock_irq(&curr->pi_lock);
910
911 spin_lock(&hb->lock);
912 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
913 raw_spin_lock(&curr->pi_lock);
914
915
916
917
918 if (head->next != next) {
919
920 raw_spin_unlock(&pi_state->pi_mutex.wait_lock);
921 spin_unlock(&hb->lock);
922 put_pi_state(pi_state);
923 continue;
924 }
925
926 WARN_ON(pi_state->owner != curr);
927 WARN_ON(list_empty(&pi_state->list));
928 list_del_init(&pi_state->list);
929 pi_state->owner = NULL;
930
931 raw_spin_unlock(&curr->pi_lock);
932 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
933 spin_unlock(&hb->lock);
934
935 rt_mutex_futex_unlock(&pi_state->pi_mutex);
936 put_pi_state(pi_state);
937
938 raw_spin_lock_irq(&curr->pi_lock);
939 }
940 raw_spin_unlock_irq(&curr->pi_lock);
941}
942
943#endif
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033static int attach_to_pi_state(u32 __user *uaddr, u32 uval,
1034 struct futex_pi_state *pi_state,
1035 struct futex_pi_state **ps)
1036{
1037 pid_t pid = uval & FUTEX_TID_MASK;
1038 u32 uval2;
1039 int ret;
1040
1041
1042
1043
1044 if (unlikely(!pi_state))
1045 return -EINVAL;
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059 WARN_ON(!atomic_read(&pi_state->refcount));
1060
1061
1062
1063
1064
1065 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
1066
1067
1068
1069
1070
1071
1072
1073 if (get_futex_value_locked(&uval2, uaddr))
1074 goto out_efault;
1075
1076 if (uval != uval2)
1077 goto out_eagain;
1078
1079
1080
1081
1082 if (uval & FUTEX_OWNER_DIED) {
1083
1084
1085
1086
1087
1088 if (!pi_state->owner) {
1089
1090
1091
1092
1093 if (pid)
1094 goto out_einval;
1095
1096
1097
1098 goto out_attach;
1099 }
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109 if (!pid)
1110 goto out_attach;
1111 } else {
1112
1113
1114
1115
1116 if (!pi_state->owner)
1117 goto out_einval;
1118 }
1119
1120
1121
1122
1123
1124
1125 if (pid != task_pid_vnr(pi_state->owner))
1126 goto out_einval;
1127
1128out_attach:
1129 get_pi_state(pi_state);
1130 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
1131 *ps = pi_state;
1132 return 0;
1133
1134out_einval:
1135 ret = -EINVAL;
1136 goto out_error;
1137
1138out_eagain:
1139 ret = -EAGAIN;
1140 goto out_error;
1141
1142out_efault:
1143 ret = -EFAULT;
1144 goto out_error;
1145
1146out_error:
1147 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
1148 return ret;
1149}
1150
1151static int handle_exit_race(u32 __user *uaddr, u32 uval,
1152 struct task_struct *tsk)
1153{
1154 u32 uval2;
1155
1156
1157
1158
1159 if (tsk && !(tsk->flags & PF_EXITPIDONE))
1160 return -EAGAIN;
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190 if (get_futex_value_locked(&uval2, uaddr))
1191 return -EFAULT;
1192
1193
1194 if (uval2 != uval)
1195 return -EAGAIN;
1196
1197
1198
1199
1200
1201
1202 return -ESRCH;
1203}
1204
1205
1206
1207
1208
1209static int attach_to_pi_owner(u32 __user *uaddr, u32 uval, union futex_key *key,
1210 struct futex_pi_state **ps)
1211{
1212 pid_t pid = uval & FUTEX_TID_MASK;
1213 struct futex_pi_state *pi_state;
1214 struct task_struct *p;
1215
1216
1217
1218
1219
1220
1221
1222
1223 if (!pid)
1224 return -EAGAIN;
1225 p = find_get_task_by_vpid(pid);
1226 if (!p)
1227 return handle_exit_race(uaddr, uval, NULL);
1228
1229 if (unlikely(p->flags & PF_KTHREAD)) {
1230 put_task_struct(p);
1231 return -EPERM;
1232 }
1233
1234
1235
1236
1237
1238
1239
1240 raw_spin_lock_irq(&p->pi_lock);
1241 if (unlikely(p->flags & PF_EXITING)) {
1242
1243
1244
1245
1246
1247 int ret = handle_exit_race(uaddr, uval, p);
1248
1249 raw_spin_unlock_irq(&p->pi_lock);
1250 put_task_struct(p);
1251 return ret;
1252 }
1253
1254
1255
1256
1257
1258
1259
1260 pi_state = alloc_pi_state();
1261
1262
1263
1264
1265
1266 rt_mutex_init_proxy_locked(&pi_state->pi_mutex, p);
1267
1268
1269 pi_state->key = *key;
1270
1271 WARN_ON(!list_empty(&pi_state->list));
1272 list_add(&pi_state->list, &p->pi_state_list);
1273
1274
1275
1276
1277 pi_state->owner = p;
1278 raw_spin_unlock_irq(&p->pi_lock);
1279
1280 put_task_struct(p);
1281
1282 *ps = pi_state;
1283
1284 return 0;
1285}
1286
1287static int lookup_pi_state(u32 __user *uaddr, u32 uval,
1288 struct futex_hash_bucket *hb,
1289 union futex_key *key, struct futex_pi_state **ps)
1290{
1291 struct futex_q *top_waiter = futex_top_waiter(hb, key);
1292
1293
1294
1295
1296
1297 if (top_waiter)
1298 return attach_to_pi_state(uaddr, uval, top_waiter->pi_state, ps);
1299
1300
1301
1302
1303
1304 return attach_to_pi_owner(uaddr, uval, key, ps);
1305}
1306
1307static int lock_pi_update_atomic(u32 __user *uaddr, u32 uval, u32 newval)
1308{
1309 u32 uninitialized_var(curval);
1310
1311 if (unlikely(should_fail_futex(true)))
1312 return -EFAULT;
1313
1314 if (unlikely(cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)))
1315 return -EFAULT;
1316
1317
1318 return curval != uval ? -EAGAIN : 0;
1319}
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339static int futex_lock_pi_atomic(u32 __user *uaddr, struct futex_hash_bucket *hb,
1340 union futex_key *key,
1341 struct futex_pi_state **ps,
1342 struct task_struct *task, int set_waiters)
1343{
1344 u32 uval, newval, vpid = task_pid_vnr(task);
1345 struct futex_q *top_waiter;
1346 int ret;
1347
1348
1349
1350
1351
1352 if (get_futex_value_locked(&uval, uaddr))
1353 return -EFAULT;
1354
1355 if (unlikely(should_fail_futex(true)))
1356 return -EFAULT;
1357
1358
1359
1360
1361 if ((unlikely((uval & FUTEX_TID_MASK) == vpid)))
1362 return -EDEADLK;
1363
1364 if ((unlikely(should_fail_futex(true))))
1365 return -EDEADLK;
1366
1367
1368
1369
1370
1371 top_waiter = futex_top_waiter(hb, key);
1372 if (top_waiter)
1373 return attach_to_pi_state(uaddr, uval, top_waiter->pi_state, ps);
1374
1375
1376
1377
1378
1379
1380
1381 if (!(uval & FUTEX_TID_MASK)) {
1382
1383
1384
1385
1386 newval = uval & FUTEX_OWNER_DIED;
1387 newval |= vpid;
1388
1389
1390 if (set_waiters)
1391 newval |= FUTEX_WAITERS;
1392
1393 ret = lock_pi_update_atomic(uaddr, uval, newval);
1394
1395 return ret < 0 ? ret : 1;
1396 }
1397
1398
1399
1400
1401
1402
1403 newval = uval | FUTEX_WAITERS;
1404 ret = lock_pi_update_atomic(uaddr, uval, newval);
1405 if (ret)
1406 return ret;
1407
1408
1409
1410
1411
1412 return attach_to_pi_owner(uaddr, newval, key, ps);
1413}
1414
1415
1416
1417
1418
1419
1420
1421static void __unqueue_futex(struct futex_q *q)
1422{
1423 struct futex_hash_bucket *hb;
1424
1425 if (WARN_ON_SMP(!q->lock_ptr) || WARN_ON(plist_node_empty(&q->list)))
1426 return;
1427 lockdep_assert_held(q->lock_ptr);
1428
1429 hb = container_of(q->lock_ptr, struct futex_hash_bucket, lock);
1430 plist_del(&q->list, &hb->chain);
1431 hb_waiters_dec(hb);
1432}
1433
1434
1435
1436
1437
1438
1439
1440static void mark_wake_futex(struct wake_q_head *wake_q, struct futex_q *q)
1441{
1442 struct task_struct *p = q->task;
1443
1444 if (WARN(q->pi_state || q->rt_waiter, "refusing to wake PI futex\n"))
1445 return;
1446
1447
1448
1449
1450
1451 wake_q_add(wake_q, p);
1452 __unqueue_futex(q);
1453
1454
1455
1456
1457
1458
1459
1460 smp_store_release(&q->lock_ptr, NULL);
1461}
1462
1463
1464
1465
1466static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_state)
1467{
1468 u32 uninitialized_var(curval), newval;
1469 struct task_struct *new_owner;
1470 bool postunlock = false;
1471 DEFINE_WAKE_Q(wake_q);
1472 int ret = 0;
1473
1474 new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
1475 if (WARN_ON_ONCE(!new_owner)) {
1476
1477
1478
1479
1480
1481
1482
1483
1484 ret = -EAGAIN;
1485 goto out_unlock;
1486 }
1487
1488
1489
1490
1491
1492
1493 newval = FUTEX_WAITERS | task_pid_vnr(new_owner);
1494
1495 if (unlikely(should_fail_futex(true)))
1496 ret = -EFAULT;
1497
1498 if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) {
1499 ret = -EFAULT;
1500
1501 } else if (curval != uval) {
1502
1503
1504
1505
1506
1507
1508 if ((FUTEX_TID_MASK & curval) == uval)
1509 ret = -EAGAIN;
1510 else
1511 ret = -EINVAL;
1512 }
1513
1514 if (ret)
1515 goto out_unlock;
1516
1517
1518
1519
1520
1521
1522 raw_spin_lock(&pi_state->owner->pi_lock);
1523 WARN_ON(list_empty(&pi_state->list));
1524 list_del_init(&pi_state->list);
1525 raw_spin_unlock(&pi_state->owner->pi_lock);
1526
1527 raw_spin_lock(&new_owner->pi_lock);
1528 WARN_ON(!list_empty(&pi_state->list));
1529 list_add(&pi_state->list, &new_owner->pi_state_list);
1530 pi_state->owner = new_owner;
1531 raw_spin_unlock(&new_owner->pi_lock);
1532
1533 postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
1534
1535out_unlock:
1536 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
1537
1538 if (postunlock)
1539 rt_mutex_postunlock(&wake_q);
1540
1541 return ret;
1542}
1543
1544
1545
1546
1547static inline void
1548double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
1549{
1550 if (hb1 <= hb2) {
1551 spin_lock(&hb1->lock);
1552 if (hb1 < hb2)
1553 spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING);
1554 } else {
1555 spin_lock(&hb2->lock);
1556 spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING);
1557 }
1558}
1559
1560static inline void
1561double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
1562{
1563 spin_unlock(&hb1->lock);
1564 if (hb1 != hb2)
1565 spin_unlock(&hb2->lock);
1566}
1567
1568
1569
1570
1571static int
1572futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset)
1573{
1574 struct futex_hash_bucket *hb;
1575 struct futex_q *this, *next;
1576 union futex_key key = FUTEX_KEY_INIT;
1577 int ret;
1578 DEFINE_WAKE_Q(wake_q);
1579
1580 if (!bitset)
1581 return -EINVAL;
1582
1583 ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_READ);
1584 if (unlikely(ret != 0))
1585 goto out;
1586
1587 hb = hash_futex(&key);
1588
1589
1590 if (!hb_waiters_pending(hb))
1591 goto out_put_key;
1592
1593 spin_lock(&hb->lock);
1594
1595 plist_for_each_entry_safe(this, next, &hb->chain, list) {
1596 if (match_futex (&this->key, &key)) {
1597 if (this->pi_state || this->rt_waiter) {
1598 ret = -EINVAL;
1599 break;
1600 }
1601
1602
1603 if (!(this->bitset & bitset))
1604 continue;
1605
1606 mark_wake_futex(&wake_q, this);
1607 if (++ret >= nr_wake)
1608 break;
1609 }
1610 }
1611
1612 spin_unlock(&hb->lock);
1613 wake_up_q(&wake_q);
1614out_put_key:
1615 put_futex_key(&key);
1616out:
1617 return ret;
1618}
1619
1620static int futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr)
1621{
1622 unsigned int op = (encoded_op & 0x70000000) >> 28;
1623 unsigned int cmp = (encoded_op & 0x0f000000) >> 24;
1624 int oparg = sign_extend32((encoded_op & 0x00fff000) >> 12, 11);
1625 int cmparg = sign_extend32(encoded_op & 0x00000fff, 11);
1626 int oldval, ret;
1627
1628 if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) {
1629 if (oparg < 0 || oparg > 31) {
1630 char comm[sizeof(current->comm)];
1631
1632
1633
1634
1635 pr_info_ratelimited("futex_wake_op: %s tries to shift op by %d; fix this program\n",
1636 get_task_comm(comm, current), oparg);
1637 oparg &= 31;
1638 }
1639 oparg = 1 << oparg;
1640 }
1641
1642 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
1643 return -EFAULT;
1644
1645 ret = arch_futex_atomic_op_inuser(op, oparg, &oldval, uaddr);
1646 if (ret)
1647 return ret;
1648
1649 switch (cmp) {
1650 case FUTEX_OP_CMP_EQ:
1651 return oldval == cmparg;
1652 case FUTEX_OP_CMP_NE:
1653 return oldval != cmparg;
1654 case FUTEX_OP_CMP_LT:
1655 return oldval < cmparg;
1656 case FUTEX_OP_CMP_GE:
1657 return oldval >= cmparg;
1658 case FUTEX_OP_CMP_LE:
1659 return oldval <= cmparg;
1660 case FUTEX_OP_CMP_GT:
1661 return oldval > cmparg;
1662 default:
1663 return -ENOSYS;
1664 }
1665}
1666
1667
1668
1669
1670
1671static int
1672futex_wake_op(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2,
1673 int nr_wake, int nr_wake2, int op)
1674{
1675 union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT;
1676 struct futex_hash_bucket *hb1, *hb2;
1677 struct futex_q *this, *next;
1678 int ret, op_ret;
1679 DEFINE_WAKE_Q(wake_q);
1680
1681retry:
1682 ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ);
1683 if (unlikely(ret != 0))
1684 goto out;
1685 ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE);
1686 if (unlikely(ret != 0))
1687 goto out_put_key1;
1688
1689 hb1 = hash_futex(&key1);
1690 hb2 = hash_futex(&key2);
1691
1692retry_private:
1693 double_lock_hb(hb1, hb2);
1694 op_ret = futex_atomic_op_inuser(op, uaddr2);
1695 if (unlikely(op_ret < 0)) {
1696
1697 double_unlock_hb(hb1, hb2);
1698
1699#ifndef CONFIG_MMU
1700
1701
1702
1703
1704 ret = op_ret;
1705 goto out_put_keys;
1706#endif
1707
1708 if (unlikely(op_ret != -EFAULT)) {
1709 ret = op_ret;
1710 goto out_put_keys;
1711 }
1712
1713 ret = fault_in_user_writeable(uaddr2);
1714 if (ret)
1715 goto out_put_keys;
1716
1717 if (!(flags & FLAGS_SHARED))
1718 goto retry_private;
1719
1720 put_futex_key(&key2);
1721 put_futex_key(&key1);
1722 goto retry;
1723 }
1724
1725 plist_for_each_entry_safe(this, next, &hb1->chain, list) {
1726 if (match_futex (&this->key, &key1)) {
1727 if (this->pi_state || this->rt_waiter) {
1728 ret = -EINVAL;
1729 goto out_unlock;
1730 }
1731 mark_wake_futex(&wake_q, this);
1732 if (++ret >= nr_wake)
1733 break;
1734 }
1735 }
1736
1737 if (op_ret > 0) {
1738 op_ret = 0;
1739 plist_for_each_entry_safe(this, next, &hb2->chain, list) {
1740 if (match_futex (&this->key, &key2)) {
1741 if (this->pi_state || this->rt_waiter) {
1742 ret = -EINVAL;
1743 goto out_unlock;
1744 }
1745 mark_wake_futex(&wake_q, this);
1746 if (++op_ret >= nr_wake2)
1747 break;
1748 }
1749 }
1750 ret += op_ret;
1751 }
1752
1753out_unlock:
1754 double_unlock_hb(hb1, hb2);
1755 wake_up_q(&wake_q);
1756out_put_keys:
1757 put_futex_key(&key2);
1758out_put_key1:
1759 put_futex_key(&key1);
1760out:
1761 return ret;
1762}
1763
1764
1765
1766
1767
1768
1769
1770
1771static inline
1772void requeue_futex(struct futex_q *q, struct futex_hash_bucket *hb1,
1773 struct futex_hash_bucket *hb2, union futex_key *key2)
1774{
1775
1776
1777
1778
1779
1780 if (likely(&hb1->chain != &hb2->chain)) {
1781 plist_del(&q->list, &hb1->chain);
1782 hb_waiters_dec(hb1);
1783 hb_waiters_inc(hb2);
1784 plist_add(&q->list, &hb2->chain);
1785 q->lock_ptr = &hb2->lock;
1786 }
1787 get_futex_key_refs(key2);
1788 q->key = *key2;
1789}
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805static inline
1806void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key,
1807 struct futex_hash_bucket *hb)
1808{
1809 get_futex_key_refs(key);
1810 q->key = *key;
1811
1812 __unqueue_futex(q);
1813
1814 WARN_ON(!q->rt_waiter);
1815 q->rt_waiter = NULL;
1816
1817 q->lock_ptr = &hb->lock;
1818
1819 wake_up_state(q->task, TASK_NORMAL);
1820}
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842static int futex_proxy_trylock_atomic(u32 __user *pifutex,
1843 struct futex_hash_bucket *hb1,
1844 struct futex_hash_bucket *hb2,
1845 union futex_key *key1, union futex_key *key2,
1846 struct futex_pi_state **ps, int set_waiters)
1847{
1848 struct futex_q *top_waiter = NULL;
1849 u32 curval;
1850 int ret, vpid;
1851
1852 if (get_futex_value_locked(&curval, pifutex))
1853 return -EFAULT;
1854
1855 if (unlikely(should_fail_futex(true)))
1856 return -EFAULT;
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866 top_waiter = futex_top_waiter(hb1, key1);
1867
1868
1869 if (!top_waiter)
1870 return 0;
1871
1872
1873 if (!match_futex(top_waiter->requeue_pi_key, key2))
1874 return -EINVAL;
1875
1876
1877
1878
1879
1880
1881 vpid = task_pid_vnr(top_waiter->task);
1882 ret = futex_lock_pi_atomic(pifutex, hb2, key2, ps, top_waiter->task,
1883 set_waiters);
1884 if (ret == 1) {
1885 requeue_pi_wake_futex(top_waiter, key2, hb2);
1886 return vpid;
1887 }
1888 return ret;
1889}
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909static int futex_requeue(u32 __user *uaddr1, unsigned int flags,
1910 u32 __user *uaddr2, int nr_wake, int nr_requeue,
1911 u32 *cmpval, int requeue_pi)
1912{
1913 union futex_key key1 = FUTEX_KEY_INIT, key2 = FUTEX_KEY_INIT;
1914 int drop_count = 0, task_count = 0, ret;
1915 struct futex_pi_state *pi_state = NULL;
1916 struct futex_hash_bucket *hb1, *hb2;
1917 struct futex_q *this, *next;
1918 DEFINE_WAKE_Q(wake_q);
1919
1920 if (nr_wake < 0 || nr_requeue < 0)
1921 return -EINVAL;
1922
1923
1924
1925
1926
1927
1928
1929 if (!IS_ENABLED(CONFIG_FUTEX_PI) && requeue_pi)
1930 return -ENOSYS;
1931
1932 if (requeue_pi) {
1933
1934
1935
1936
1937 if (uaddr1 == uaddr2)
1938 return -EINVAL;
1939
1940
1941
1942
1943
1944 if (refill_pi_state_cache())
1945 return -ENOMEM;
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956 if (nr_wake != 1)
1957 return -EINVAL;
1958 }
1959
1960retry:
1961 ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ);
1962 if (unlikely(ret != 0))
1963 goto out;
1964 ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2,
1965 requeue_pi ? VERIFY_WRITE : VERIFY_READ);
1966 if (unlikely(ret != 0))
1967 goto out_put_key1;
1968
1969
1970
1971
1972
1973 if (requeue_pi && match_futex(&key1, &key2)) {
1974 ret = -EINVAL;
1975 goto out_put_keys;
1976 }
1977
1978 hb1 = hash_futex(&key1);
1979 hb2 = hash_futex(&key2);
1980
1981retry_private:
1982 hb_waiters_inc(hb2);
1983 double_lock_hb(hb1, hb2);
1984
1985 if (likely(cmpval != NULL)) {
1986 u32 curval;
1987
1988 ret = get_futex_value_locked(&curval, uaddr1);
1989
1990 if (unlikely(ret)) {
1991 double_unlock_hb(hb1, hb2);
1992 hb_waiters_dec(hb2);
1993
1994 ret = get_user(curval, uaddr1);
1995 if (ret)
1996 goto out_put_keys;
1997
1998 if (!(flags & FLAGS_SHARED))
1999 goto retry_private;
2000
2001 put_futex_key(&key2);
2002 put_futex_key(&key1);
2003 goto retry;
2004 }
2005 if (curval != *cmpval) {
2006 ret = -EAGAIN;
2007 goto out_unlock;
2008 }
2009 }
2010
2011 if (requeue_pi && (task_count - nr_wake < nr_requeue)) {
2012
2013
2014
2015
2016
2017
2018 ret = futex_proxy_trylock_atomic(uaddr2, hb1, hb2, &key1,
2019 &key2, &pi_state, nr_requeue);
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030 if (ret > 0) {
2031 WARN_ON(pi_state);
2032 drop_count++;
2033 task_count++;
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046 ret = lookup_pi_state(uaddr2, ret, hb2, &key2, &pi_state);
2047 }
2048
2049 switch (ret) {
2050 case 0:
2051
2052 break;
2053
2054
2055 case -EFAULT:
2056 double_unlock_hb(hb1, hb2);
2057 hb_waiters_dec(hb2);
2058 put_futex_key(&key2);
2059 put_futex_key(&key1);
2060 ret = fault_in_user_writeable(uaddr2);
2061 if (!ret)
2062 goto retry;
2063 goto out;
2064 case -EAGAIN:
2065
2066
2067
2068
2069
2070
2071 double_unlock_hb(hb1, hb2);
2072 hb_waiters_dec(hb2);
2073 put_futex_key(&key2);
2074 put_futex_key(&key1);
2075 cond_resched();
2076 goto retry;
2077 default:
2078 goto out_unlock;
2079 }
2080 }
2081
2082 plist_for_each_entry_safe(this, next, &hb1->chain, list) {
2083 if (task_count - nr_wake >= nr_requeue)
2084 break;
2085
2086 if (!match_futex(&this->key, &key1))
2087 continue;
2088
2089
2090
2091
2092
2093
2094
2095
2096 if ((requeue_pi && !this->rt_waiter) ||
2097 (!requeue_pi && this->rt_waiter) ||
2098 this->pi_state) {
2099 ret = -EINVAL;
2100 break;
2101 }
2102
2103
2104
2105
2106
2107
2108 if (++task_count <= nr_wake && !requeue_pi) {
2109 mark_wake_futex(&wake_q, this);
2110 continue;
2111 }
2112
2113
2114 if (requeue_pi && !match_futex(this->requeue_pi_key, &key2)) {
2115 ret = -EINVAL;
2116 break;
2117 }
2118
2119
2120
2121
2122
2123 if (requeue_pi) {
2124
2125
2126
2127
2128
2129 get_pi_state(pi_state);
2130 this->pi_state = pi_state;
2131 ret = rt_mutex_start_proxy_lock(&pi_state->pi_mutex,
2132 this->rt_waiter,
2133 this->task);
2134 if (ret == 1) {
2135
2136
2137
2138
2139
2140
2141
2142
2143 requeue_pi_wake_futex(this, &key2, hb2);
2144 drop_count++;
2145 continue;
2146 } else if (ret) {
2147
2148
2149
2150
2151
2152
2153
2154
2155 this->pi_state = NULL;
2156 put_pi_state(pi_state);
2157
2158
2159
2160
2161 break;
2162 }
2163 }
2164 requeue_futex(this, hb1, hb2, &key2);
2165 drop_count++;
2166 }
2167
2168
2169
2170
2171
2172
2173 put_pi_state(pi_state);
2174
2175out_unlock:
2176 double_unlock_hb(hb1, hb2);
2177 wake_up_q(&wake_q);
2178 hb_waiters_dec(hb2);
2179
2180
2181
2182
2183
2184
2185
2186 while (--drop_count >= 0)
2187 drop_futex_key_refs(&key1);
2188
2189out_put_keys:
2190 put_futex_key(&key2);
2191out_put_key1:
2192 put_futex_key(&key1);
2193out:
2194 return ret ? ret : task_count;
2195}
2196
2197
2198static inline struct futex_hash_bucket *queue_lock(struct futex_q *q)
2199 __acquires(&hb->lock)
2200{
2201 struct futex_hash_bucket *hb;
2202
2203 hb = hash_futex(&q->key);
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213 hb_waiters_inc(hb);
2214
2215 q->lock_ptr = &hb->lock;
2216
2217 spin_lock(&hb->lock);
2218 return hb;
2219}
2220
2221static inline void
2222queue_unlock(struct futex_hash_bucket *hb)
2223 __releases(&hb->lock)
2224{
2225 spin_unlock(&hb->lock);
2226 hb_waiters_dec(hb);
2227}
2228
2229static inline void __queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
2230{
2231 int prio;
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241 prio = min(current->normal_prio, MAX_RT_PRIO);
2242
2243 plist_node_init(&q->list, prio);
2244 plist_add(&q->list, &hb->chain);
2245 q->task = current;
2246}
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
2261 __releases(&hb->lock)
2262{
2263 __queue_me(q, hb);
2264 spin_unlock(&hb->lock);
2265}
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278static int unqueue_me(struct futex_q *q)
2279{
2280 spinlock_t *lock_ptr;
2281 int ret = 0;
2282
2283
2284retry:
2285
2286
2287
2288
2289
2290 lock_ptr = READ_ONCE(q->lock_ptr);
2291 if (lock_ptr != NULL) {
2292 spin_lock(lock_ptr);
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306 if (unlikely(lock_ptr != q->lock_ptr)) {
2307 spin_unlock(lock_ptr);
2308 goto retry;
2309 }
2310 __unqueue_futex(q);
2311
2312 BUG_ON(q->pi_state);
2313
2314 spin_unlock(lock_ptr);
2315 ret = 1;
2316 }
2317
2318 drop_futex_key_refs(&q->key);
2319 return ret;
2320}
2321
2322
2323
2324
2325
2326
2327static void unqueue_me_pi(struct futex_q *q)
2328 __releases(q->lock_ptr)
2329{
2330 __unqueue_futex(q);
2331
2332 BUG_ON(!q->pi_state);
2333 put_pi_state(q->pi_state);
2334 q->pi_state = NULL;
2335
2336 spin_unlock(q->lock_ptr);
2337}
2338
2339static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
2340 struct task_struct *argowner)
2341{
2342 struct futex_pi_state *pi_state = q->pi_state;
2343 u32 uval, uninitialized_var(curval), newval;
2344 struct task_struct *oldowner, *newowner;
2345 u32 newtid;
2346 int ret;
2347
2348 lockdep_assert_held(q->lock_ptr);
2349
2350 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
2351
2352 oldowner = pi_state->owner;
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377retry:
2378 if (!argowner) {
2379 if (oldowner != current) {
2380
2381
2382
2383
2384 ret = 0;
2385 goto out_unlock;
2386 }
2387
2388 if (__rt_mutex_futex_trylock(&pi_state->pi_mutex)) {
2389
2390 ret = 0;
2391 goto out_unlock;
2392 }
2393
2394
2395
2396
2397 newowner = rt_mutex_owner(&pi_state->pi_mutex);
2398 BUG_ON(!newowner);
2399 } else {
2400 WARN_ON_ONCE(argowner != current);
2401 if (oldowner == current) {
2402
2403
2404
2405
2406 ret = 0;
2407 goto out_unlock;
2408 }
2409 newowner = argowner;
2410 }
2411
2412 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS;
2413
2414 if (!pi_state->owner)
2415 newtid |= FUTEX_OWNER_DIED;
2416
2417 if (get_futex_value_locked(&uval, uaddr))
2418 goto handle_fault;
2419
2420 for (;;) {
2421 newval = (uval & FUTEX_OWNER_DIED) | newtid;
2422
2423 if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval))
2424 goto handle_fault;
2425 if (curval == uval)
2426 break;
2427 uval = curval;
2428 }
2429
2430
2431
2432
2433
2434 if (pi_state->owner != NULL) {
2435 raw_spin_lock(&pi_state->owner->pi_lock);
2436 WARN_ON(list_empty(&pi_state->list));
2437 list_del_init(&pi_state->list);
2438 raw_spin_unlock(&pi_state->owner->pi_lock);
2439 }
2440
2441 pi_state->owner = newowner;
2442
2443 raw_spin_lock(&newowner->pi_lock);
2444 WARN_ON(!list_empty(&pi_state->list));
2445 list_add(&pi_state->list, &newowner->pi_state_list);
2446 raw_spin_unlock(&newowner->pi_lock);
2447 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
2448
2449 return 0;
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464handle_fault:
2465 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
2466 spin_unlock(q->lock_ptr);
2467
2468 ret = fault_in_user_writeable(uaddr);
2469
2470 spin_lock(q->lock_ptr);
2471 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
2472
2473
2474
2475
2476 if (pi_state->owner != oldowner) {
2477 ret = 0;
2478 goto out_unlock;
2479 }
2480
2481 if (ret)
2482 goto out_unlock;
2483
2484 goto retry;
2485
2486out_unlock:
2487 raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
2488 return ret;
2489}
2490
2491static long futex_wait_restart(struct restart_block *restart);
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508static int fixup_owner(u32 __user *uaddr, struct futex_q *q, int locked)
2509{
2510 int ret = 0;
2511
2512 if (locked) {
2513
2514
2515
2516
2517
2518
2519
2520
2521 if (q->pi_state->owner != current)
2522 ret = fixup_pi_state_owner(uaddr, q, current);
2523 goto out;
2524 }
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534 if (q->pi_state->owner == current) {
2535 ret = fixup_pi_state_owner(uaddr, q, NULL);
2536 goto out;
2537 }
2538
2539
2540
2541
2542
2543 if (rt_mutex_owner(&q->pi_state->pi_mutex) == current) {
2544 printk(KERN_ERR "fixup_owner: ret = %d pi-mutex: %p "
2545 "pi-state %p\n", ret,
2546 q->pi_state->pi_mutex.owner,
2547 q->pi_state->owner);
2548 }
2549
2550out:
2551 return ret ? ret : locked;
2552}
2553
2554
2555
2556
2557
2558
2559
2560static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
2561 struct hrtimer_sleeper *timeout)
2562{
2563
2564
2565
2566
2567
2568
2569 set_current_state(TASK_INTERRUPTIBLE);
2570 queue_me(q, hb);
2571
2572
2573 if (timeout)
2574 hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS);
2575
2576
2577
2578
2579
2580 if (likely(!plist_node_empty(&q->list))) {
2581
2582
2583
2584
2585
2586 if (!timeout || timeout->task)
2587 freezable_schedule();
2588 }
2589 __set_current_state(TASK_RUNNING);
2590}
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609static int futex_wait_setup(u32 __user *uaddr, u32 val, unsigned int flags,
2610 struct futex_q *q, struct futex_hash_bucket **hb)
2611{
2612 u32 uval;
2613 int ret;
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633retry:
2634 ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key, VERIFY_READ);
2635 if (unlikely(ret != 0))
2636 return ret;
2637
2638retry_private:
2639 *hb = queue_lock(q);
2640
2641 ret = get_futex_value_locked(&uval, uaddr);
2642
2643 if (ret) {
2644 queue_unlock(*hb);
2645
2646 ret = get_user(uval, uaddr);
2647 if (ret)
2648 goto out;
2649
2650 if (!(flags & FLAGS_SHARED))
2651 goto retry_private;
2652
2653 put_futex_key(&q->key);
2654 goto retry;
2655 }
2656
2657 if (uval != val) {
2658 queue_unlock(*hb);
2659 ret = -EWOULDBLOCK;
2660 }
2661
2662out:
2663 if (ret)
2664 put_futex_key(&q->key);
2665 return ret;
2666}
2667
2668static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
2669 ktime_t *abs_time, u32 bitset)
2670{
2671 struct hrtimer_sleeper timeout, *to = NULL;
2672 struct restart_block *restart;
2673 struct futex_hash_bucket *hb;
2674 struct futex_q q = futex_q_init;
2675 int ret;
2676
2677 if (!bitset)
2678 return -EINVAL;
2679 q.bitset = bitset;
2680
2681 if (abs_time) {
2682 to = &timeout;
2683
2684 hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
2685 CLOCK_REALTIME : CLOCK_MONOTONIC,
2686 HRTIMER_MODE_ABS);
2687 hrtimer_init_sleeper(to, current);
2688 hrtimer_set_expires_range_ns(&to->timer, *abs_time,
2689 current->timer_slack_ns);
2690 }
2691
2692retry:
2693
2694
2695
2696
2697 ret = futex_wait_setup(uaddr, val, flags, &q, &hb);
2698 if (ret)
2699 goto out;
2700
2701
2702 futex_wait_queue_me(hb, &q, to);
2703
2704
2705 ret = 0;
2706
2707 if (!unqueue_me(&q))
2708 goto out;
2709 ret = -ETIMEDOUT;
2710 if (to && !to->task)
2711 goto out;
2712
2713
2714
2715
2716
2717 if (!signal_pending(current))
2718 goto retry;
2719
2720 ret = -ERESTARTSYS;
2721 if (!abs_time)
2722 goto out;
2723
2724 restart = ¤t->restart_block;
2725 restart->fn = futex_wait_restart;
2726 restart->futex.uaddr = uaddr;
2727 restart->futex.val = val;
2728 restart->futex.time = *abs_time;
2729 restart->futex.bitset = bitset;
2730 restart->futex.flags = flags | FLAGS_HAS_TIMEOUT;
2731
2732 ret = -ERESTART_RESTARTBLOCK;
2733
2734out:
2735 if (to) {
2736 hrtimer_cancel(&to->timer);
2737 destroy_hrtimer_on_stack(&to->timer);
2738 }
2739 return ret;
2740}
2741
2742
2743static long futex_wait_restart(struct restart_block *restart)
2744{
2745 u32 __user *uaddr = restart->futex.uaddr;
2746 ktime_t t, *tp = NULL;
2747
2748 if (restart->futex.flags & FLAGS_HAS_TIMEOUT) {
2749 t = restart->futex.time;
2750 tp = &t;
2751 }
2752 restart->fn = do_no_restart_syscall;
2753
2754 return (long)futex_wait(uaddr, restart->futex.flags,
2755 restart->futex.val, tp, restart->futex.bitset);
2756}
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768static int futex_lock_pi(u32 __user *uaddr, unsigned int flags,
2769 ktime_t *time, int trylock)
2770{
2771 struct hrtimer_sleeper timeout, *to = NULL;
2772 struct futex_pi_state *pi_state = NULL;
2773 struct rt_mutex_waiter rt_waiter;
2774 struct futex_hash_bucket *hb;
2775 struct futex_q q = futex_q_init;
2776 int res, ret;
2777
2778 if (!IS_ENABLED(CONFIG_FUTEX_PI))
2779 return -ENOSYS;
2780
2781 if (refill_pi_state_cache())
2782 return -ENOMEM;
2783
2784 if (time) {
2785 to = &timeout;
2786 hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME,
2787 HRTIMER_MODE_ABS);
2788 hrtimer_init_sleeper(to, current);
2789 hrtimer_set_expires(&to->timer, *time);
2790 }
2791
2792retry:
2793 ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, VERIFY_WRITE);
2794 if (unlikely(ret != 0))
2795 goto out;
2796
2797retry_private:
2798 hb = queue_lock(&q);
2799
2800 ret = futex_lock_pi_atomic(uaddr, hb, &q.key, &q.pi_state, current, 0);
2801 if (unlikely(ret)) {
2802
2803
2804
2805
2806 switch (ret) {
2807 case 1:
2808
2809 ret = 0;
2810 goto out_unlock_put_key;
2811 case -EFAULT:
2812 goto uaddr_faulted;
2813 case -EAGAIN:
2814
2815
2816
2817
2818
2819
2820 queue_unlock(hb);
2821 put_futex_key(&q.key);
2822 cond_resched();
2823 goto retry;
2824 default:
2825 goto out_unlock_put_key;
2826 }
2827 }
2828
2829 WARN_ON(!q.pi_state);
2830
2831
2832
2833
2834 __queue_me(&q, hb);
2835
2836 if (trylock) {
2837 ret = rt_mutex_futex_trylock(&q.pi_state->pi_mutex);
2838
2839 ret = ret ? 0 : -EWOULDBLOCK;
2840 goto no_block;
2841 }
2842
2843 rt_mutex_init_waiter(&rt_waiter);
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857 raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock);
2858 spin_unlock(q.lock_ptr);
2859 ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current);
2860 raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock);
2861
2862 if (ret) {
2863 if (ret == 1)
2864 ret = 0;
2865
2866 spin_lock(q.lock_ptr);
2867 goto no_block;
2868 }
2869
2870
2871 if (unlikely(to))
2872 hrtimer_start_expires(&to->timer, HRTIMER_MODE_ABS);
2873
2874 ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter);
2875
2876 spin_lock(q.lock_ptr);
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886 if (ret && !rt_mutex_cleanup_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter))
2887 ret = 0;
2888
2889no_block:
2890
2891
2892
2893
2894 res = fixup_owner(uaddr, &q, !ret);
2895
2896
2897
2898
2899 if (res)
2900 ret = (res < 0) ? res : 0;
2901
2902
2903
2904
2905
2906 if (ret && (rt_mutex_owner(&q.pi_state->pi_mutex) == current)) {
2907 pi_state = q.pi_state;
2908 get_pi_state(pi_state);
2909 }
2910
2911
2912 unqueue_me_pi(&q);
2913
2914 if (pi_state) {
2915 rt_mutex_futex_unlock(&pi_state->pi_mutex);
2916 put_pi_state(pi_state);
2917 }
2918
2919 goto out_put_key;
2920
2921out_unlock_put_key:
2922 queue_unlock(hb);
2923
2924out_put_key:
2925 put_futex_key(&q.key);
2926out:
2927 if (to) {
2928 hrtimer_cancel(&to->timer);
2929 destroy_hrtimer_on_stack(&to->timer);
2930 }
2931 return ret != -EINTR ? ret : -ERESTARTNOINTR;
2932
2933uaddr_faulted:
2934 queue_unlock(hb);
2935
2936 ret = fault_in_user_writeable(uaddr);
2937 if (ret)
2938 goto out_put_key;
2939
2940 if (!(flags & FLAGS_SHARED))
2941 goto retry_private;
2942
2943 put_futex_key(&q.key);
2944 goto retry;
2945}
2946
2947
2948
2949
2950
2951
2952static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags)
2953{
2954 u32 uninitialized_var(curval), uval, vpid = task_pid_vnr(current);
2955 union futex_key key = FUTEX_KEY_INIT;
2956 struct futex_hash_bucket *hb;
2957 struct futex_q *top_waiter;
2958 int ret;
2959
2960 if (!IS_ENABLED(CONFIG_FUTEX_PI))
2961 return -ENOSYS;
2962
2963retry:
2964 if (get_user(uval, uaddr))
2965 return -EFAULT;
2966
2967
2968
2969 if ((uval & FUTEX_TID_MASK) != vpid)
2970 return -EPERM;
2971
2972 ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_WRITE);
2973 if (ret)
2974 return ret;
2975
2976 hb = hash_futex(&key);
2977 spin_lock(&hb->lock);
2978
2979
2980
2981
2982
2983
2984 top_waiter = futex_top_waiter(hb, &key);
2985 if (top_waiter) {
2986 struct futex_pi_state *pi_state = top_waiter->pi_state;
2987
2988 ret = -EINVAL;
2989 if (!pi_state)
2990 goto out_unlock;
2991
2992
2993
2994
2995
2996 if (pi_state->owner != current)
2997 goto out_unlock;
2998
2999 get_pi_state(pi_state);
3000
3001
3002
3003
3004
3005
3006 raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
3007 spin_unlock(&hb->lock);
3008
3009
3010 ret = wake_futex_pi(uaddr, uval, pi_state);
3011
3012 put_pi_state(pi_state);
3013
3014
3015
3016
3017 if (!ret)
3018 goto out_putkey;
3019
3020
3021
3022
3023 if (ret == -EFAULT)
3024 goto pi_faulted;
3025
3026
3027
3028
3029 if (ret == -EAGAIN) {
3030 put_futex_key(&key);
3031 goto retry;
3032 }
3033
3034
3035
3036
3037 goto out_putkey;
3038 }
3039
3040
3041
3042
3043
3044
3045
3046
3047 if (cmpxchg_futex_value_locked(&curval, uaddr, uval, 0)) {
3048 spin_unlock(&hb->lock);
3049 goto pi_faulted;
3050 }
3051
3052
3053
3054
3055 ret = (curval == uval) ? 0 : -EAGAIN;
3056
3057out_unlock:
3058 spin_unlock(&hb->lock);
3059out_putkey:
3060 put_futex_key(&key);
3061 return ret;
3062
3063pi_faulted:
3064 put_futex_key(&key);
3065
3066 ret = fault_in_user_writeable(uaddr);
3067 if (!ret)
3068 goto retry;
3069
3070 return ret;
3071}
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089static inline
3090int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb,
3091 struct futex_q *q, union futex_key *key2,
3092 struct hrtimer_sleeper *timeout)
3093{
3094 int ret = 0;
3095
3096
3097
3098
3099
3100
3101
3102
3103 if (!match_futex(&q->key, key2)) {
3104 WARN_ON(q->lock_ptr && (&hb->lock != q->lock_ptr));
3105
3106
3107
3108
3109 plist_del(&q->list, &hb->chain);
3110 hb_waiters_dec(hb);
3111
3112
3113 ret = -EWOULDBLOCK;
3114 if (timeout && !timeout->task)
3115 ret = -ETIMEDOUT;
3116 else if (signal_pending(current))
3117 ret = -ERESTARTNOINTR;
3118 }
3119 return ret;
3120}
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
3163 u32 val, ktime_t *abs_time, u32 bitset,
3164 u32 __user *uaddr2)
3165{
3166 struct hrtimer_sleeper timeout, *to = NULL;
3167 struct futex_pi_state *pi_state = NULL;
3168 struct rt_mutex_waiter rt_waiter;
3169 struct futex_hash_bucket *hb;
3170 union futex_key key2 = FUTEX_KEY_INIT;
3171 struct futex_q q = futex_q_init;
3172 int res, ret;
3173
3174 if (!IS_ENABLED(CONFIG_FUTEX_PI))
3175 return -ENOSYS;
3176
3177 if (uaddr == uaddr2)
3178 return -EINVAL;
3179
3180 if (!bitset)
3181 return -EINVAL;
3182
3183 if (abs_time) {
3184 to = &timeout;
3185 hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
3186 CLOCK_REALTIME : CLOCK_MONOTONIC,
3187 HRTIMER_MODE_ABS);
3188 hrtimer_init_sleeper(to, current);
3189 hrtimer_set_expires_range_ns(&to->timer, *abs_time,
3190 current->timer_slack_ns);
3191 }
3192
3193
3194
3195
3196
3197 rt_mutex_init_waiter(&rt_waiter);
3198
3199 ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE);
3200 if (unlikely(ret != 0))
3201 goto out;
3202
3203 q.bitset = bitset;
3204 q.rt_waiter = &rt_waiter;
3205 q.requeue_pi_key = &key2;
3206
3207
3208
3209
3210
3211 ret = futex_wait_setup(uaddr, val, flags, &q, &hb);
3212 if (ret)
3213 goto out_key2;
3214
3215
3216
3217
3218
3219 if (match_futex(&q.key, &key2)) {
3220 queue_unlock(hb);
3221 ret = -EINVAL;
3222 goto out_put_keys;
3223 }
3224
3225
3226 futex_wait_queue_me(hb, &q, to);
3227
3228 spin_lock(&hb->lock);
3229 ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to);
3230 spin_unlock(&hb->lock);
3231 if (ret)
3232 goto out_put_keys;
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244 if (!q.rt_waiter) {
3245
3246
3247
3248
3249 if (q.pi_state && (q.pi_state->owner != current)) {
3250 spin_lock(q.lock_ptr);
3251 ret = fixup_pi_state_owner(uaddr2, &q, current);
3252 if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) {
3253 pi_state = q.pi_state;
3254 get_pi_state(pi_state);
3255 }
3256
3257
3258
3259
3260 put_pi_state(q.pi_state);
3261 spin_unlock(q.lock_ptr);
3262 }
3263 } else {
3264 struct rt_mutex *pi_mutex;
3265
3266
3267
3268
3269
3270
3271 WARN_ON(!q.pi_state);
3272 pi_mutex = &q.pi_state->pi_mutex;
3273 ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter);
3274
3275 spin_lock(q.lock_ptr);
3276 if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter))
3277 ret = 0;
3278
3279 debug_rt_mutex_free_waiter(&rt_waiter);
3280
3281
3282
3283
3284 res = fixup_owner(uaddr2, &q, !ret);
3285
3286
3287
3288
3289 if (res)
3290 ret = (res < 0) ? res : 0;
3291
3292
3293
3294
3295
3296
3297 if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) {
3298 pi_state = q.pi_state;
3299 get_pi_state(pi_state);
3300 }
3301
3302
3303 unqueue_me_pi(&q);
3304 }
3305
3306 if (pi_state) {
3307 rt_mutex_futex_unlock(&pi_state->pi_mutex);
3308 put_pi_state(pi_state);
3309 }
3310
3311 if (ret == -EINTR) {
3312
3313
3314
3315
3316
3317
3318
3319 ret = -EWOULDBLOCK;
3320 }
3321
3322out_put_keys:
3323 put_futex_key(&q.key);
3324out_key2:
3325 put_futex_key(&key2);
3326
3327out:
3328 if (to) {
3329 hrtimer_cancel(&to->timer);
3330 destroy_hrtimer_on_stack(&to->timer);
3331 }
3332 return ret;
3333}
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head,
3356 size_t, len)
3357{
3358 if (!futex_cmpxchg_enabled)
3359 return -ENOSYS;
3360
3361
3362
3363 if (unlikely(len != sizeof(*head)))
3364 return -EINVAL;
3365
3366 current->robust_list = head;
3367
3368 return 0;
3369}
3370
3371
3372
3373
3374
3375
3376
3377SYSCALL_DEFINE3(get_robust_list, int, pid,
3378 struct robust_list_head __user * __user *, head_ptr,
3379 size_t __user *, len_ptr)
3380{
3381 struct robust_list_head __user *head;
3382 unsigned long ret;
3383 struct task_struct *p;
3384
3385 if (!futex_cmpxchg_enabled)
3386 return -ENOSYS;
3387
3388 rcu_read_lock();
3389
3390 ret = -ESRCH;
3391 if (!pid)
3392 p = current;
3393 else {
3394 p = find_task_by_vpid(pid);
3395 if (!p)
3396 goto err_unlock;
3397 }
3398
3399 ret = -EPERM;
3400 if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS))
3401 goto err_unlock;
3402
3403 head = p->robust_list;
3404 rcu_read_unlock();
3405
3406 if (put_user(sizeof(*head), len_ptr))
3407 return -EFAULT;
3408 return put_user(head, head_ptr);
3409
3410err_unlock:
3411 rcu_read_unlock();
3412
3413 return ret;
3414}
3415
3416
3417
3418
3419
3420int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi)
3421{
3422 u32 uval, uninitialized_var(nval), mval;
3423
3424retry:
3425 if (get_user(uval, uaddr))
3426 return -1;
3427
3428 if ((uval & FUTEX_TID_MASK) == task_pid_vnr(curr)) {
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439 mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED;
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449 if (cmpxchg_futex_value_locked(&nval, uaddr, uval, mval)) {
3450 if (fault_in_user_writeable(uaddr))
3451 return -1;
3452 goto retry;
3453 }
3454 if (nval != uval)
3455 goto retry;
3456
3457
3458
3459
3460
3461 if (!pi && (uval & FUTEX_WAITERS))
3462 futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY);
3463 }
3464 return 0;
3465}
3466
3467
3468
3469
3470static inline int fetch_robust_entry(struct robust_list __user **entry,
3471 struct robust_list __user * __user *head,
3472 unsigned int *pi)
3473{
3474 unsigned long uentry;
3475
3476 if (get_user(uentry, (unsigned long __user *)head))
3477 return -EFAULT;
3478
3479 *entry = (void __user *)(uentry & ~1UL);
3480 *pi = uentry & 1;
3481
3482 return 0;
3483}
3484
3485
3486
3487
3488
3489
3490
3491void exit_robust_list(struct task_struct *curr)
3492{
3493 struct robust_list_head __user *head = curr->robust_list;
3494 struct robust_list __user *entry, *next_entry, *pending;
3495 unsigned int limit = ROBUST_LIST_LIMIT, pi, pip;
3496 unsigned int uninitialized_var(next_pi);
3497 unsigned long futex_offset;
3498 int rc;
3499
3500 if (!futex_cmpxchg_enabled)
3501 return;
3502
3503
3504
3505
3506
3507 if (fetch_robust_entry(&entry, &head->list.next, &pi))
3508 return;
3509
3510
3511
3512 if (get_user(futex_offset, &head->futex_offset))
3513 return;
3514
3515
3516
3517
3518 if (fetch_robust_entry(&pending, &head->list_op_pending, &pip))
3519 return;
3520
3521 next_entry = NULL;
3522 while (entry != &head->list) {
3523
3524
3525
3526
3527 rc = fetch_robust_entry(&next_entry, &entry->next, &next_pi);
3528
3529
3530
3531
3532 if (entry != pending)
3533 if (handle_futex_death((void __user *)entry + futex_offset,
3534 curr, pi))
3535 return;
3536 if (rc)
3537 return;
3538 entry = next_entry;
3539 pi = next_pi;
3540
3541
3542
3543 if (!--limit)
3544 break;
3545
3546 cond_resched();
3547 }
3548
3549 if (pending)
3550 handle_futex_death((void __user *)pending + futex_offset,
3551 curr, pip);
3552}
3553
3554long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
3555 u32 __user *uaddr2, u32 val2, u32 val3)
3556{
3557 int cmd = op & FUTEX_CMD_MASK;
3558 unsigned int flags = 0;
3559
3560 if (!(op & FUTEX_PRIVATE_FLAG))
3561 flags |= FLAGS_SHARED;
3562
3563 if (op & FUTEX_CLOCK_REALTIME) {
3564 flags |= FLAGS_CLOCKRT;
3565 if (cmd != FUTEX_WAIT && cmd != FUTEX_WAIT_BITSET && \
3566 cmd != FUTEX_WAIT_REQUEUE_PI)
3567 return -ENOSYS;
3568 }
3569
3570 switch (cmd) {
3571 case FUTEX_LOCK_PI:
3572 case FUTEX_UNLOCK_PI:
3573 case FUTEX_TRYLOCK_PI:
3574 case FUTEX_WAIT_REQUEUE_PI:
3575 case FUTEX_CMP_REQUEUE_PI:
3576 if (!futex_cmpxchg_enabled)
3577 return -ENOSYS;
3578 }
3579
3580 switch (cmd) {
3581 case FUTEX_WAIT:
3582 val3 = FUTEX_BITSET_MATCH_ANY;
3583
3584 case FUTEX_WAIT_BITSET:
3585 return futex_wait(uaddr, flags, val, timeout, val3);
3586 case FUTEX_WAKE:
3587 val3 = FUTEX_BITSET_MATCH_ANY;
3588
3589 case FUTEX_WAKE_BITSET:
3590 return futex_wake(uaddr, flags, val, val3);
3591 case FUTEX_REQUEUE:
3592 return futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0);
3593 case FUTEX_CMP_REQUEUE:
3594 return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0);
3595 case FUTEX_WAKE_OP:
3596 return futex_wake_op(uaddr, flags, uaddr2, val, val2, val3);
3597 case FUTEX_LOCK_PI:
3598 return futex_lock_pi(uaddr, flags, timeout, 0);
3599 case FUTEX_UNLOCK_PI:
3600 return futex_unlock_pi(uaddr, flags);
3601 case FUTEX_TRYLOCK_PI:
3602 return futex_lock_pi(uaddr, flags, NULL, 1);
3603 case FUTEX_WAIT_REQUEUE_PI:
3604 val3 = FUTEX_BITSET_MATCH_ANY;
3605 return futex_wait_requeue_pi(uaddr, flags, val, timeout, val3,
3606 uaddr2);
3607 case FUTEX_CMP_REQUEUE_PI:
3608 return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1);
3609 }
3610 return -ENOSYS;
3611}
3612
3613
3614SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
3615 struct timespec __user *, utime, u32 __user *, uaddr2,
3616 u32, val3)
3617{
3618 struct timespec ts;
3619 ktime_t t, *tp = NULL;
3620 u32 val2 = 0;
3621 int cmd = op & FUTEX_CMD_MASK;
3622
3623 if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||
3624 cmd == FUTEX_WAIT_BITSET ||
3625 cmd == FUTEX_WAIT_REQUEUE_PI)) {
3626 if (unlikely(should_fail_futex(!(op & FUTEX_PRIVATE_FLAG))))
3627 return -EFAULT;
3628 if (copy_from_user(&ts, utime, sizeof(ts)) != 0)
3629 return -EFAULT;
3630 if (!timespec_valid(&ts))
3631 return -EINVAL;
3632
3633 t = timespec_to_ktime(ts);
3634 if (cmd == FUTEX_WAIT)
3635 t = ktime_add_safe(ktime_get(), t);
3636 tp = &t;
3637 }
3638
3639
3640
3641
3642 if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE ||
3643 cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP)
3644 val2 = (u32) (unsigned long) utime;
3645
3646 return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
3647}
3648
3649static void __init futex_detect_cmpxchg(void)
3650{
3651#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
3652 u32 curval;
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664 if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT)
3665 futex_cmpxchg_enabled = 1;
3666#endif
3667}
3668
3669static int __init futex_init(void)
3670{
3671 unsigned int futex_shift;
3672 unsigned long i;
3673
3674#if CONFIG_BASE_SMALL
3675 futex_hashsize = 16;
3676#else
3677 futex_hashsize = roundup_pow_of_two(256 * num_possible_cpus());
3678#endif
3679
3680 futex_queues = alloc_large_system_hash("futex", sizeof(*futex_queues),
3681 futex_hashsize, 0,
3682 futex_hashsize < 256 ? HASH_SMALL : 0,
3683 &futex_shift, NULL,
3684 futex_hashsize, futex_hashsize);
3685 futex_hashsize = 1UL << futex_shift;
3686
3687 futex_detect_cmpxchg();
3688
3689 for (i = 0; i < futex_hashsize; i++) {
3690 atomic_set(&futex_queues[i].waiters, 0);
3691 plist_head_init(&futex_queues[i].chain);
3692 spin_lock_init(&futex_queues[i].lock);
3693 }
3694
3695 return 0;
3696}
3697core_initcall(futex_init);
3698