CC: [email protected] TO: [email protected] tree: https://github.com/zen-kernel/zen-kernel 5.14/futex2 head: fa99bbb4cf0a5c6ed18cf58ecca678e82e008cb9 commit: a7c335592ec4a038fc93fc43ca489071a2cfc33a [4/8] futex2: Implement requeue operation :::::: branch date: 4 days ago :::::: commit date: 4 days ago config: i386-randconfig-c021-20210906 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Julia Lawall <[email protected]> cocci warnings: (new ones prefixed by >>) >> kernel/futex2.c:1024:2-11: second lock on line 1024 kernel/futex2.c:1028:2-11: second lock on line 1028 -- >> kernel/futex2.c:1009:3-9: preceding lock on line 1024 kernel/futex2.c:1009:3-9: preceding lock on line 1028 kernel/futex2.c:1015:3-9: preceding lock on line 1024 kernel/futex2.c:1015:3-9: preceding lock on line 1028 vim +1024 kernel/futex2.c a7c335592ec4a03 André Almeida 2021-02-05 984 a7c335592ec4a03 André Almeida 2021-02-05 985 static inline int __futex_requeue(struct futex_requeue rq1, a7c335592ec4a03 André Almeida 2021-02-05 986 struct futex_requeue rq2, unsigned int nr_wake, a7c335592ec4a03 André Almeida 2021-02-05 987 unsigned int nr_requeue, unsigned int cmpval, a7c335592ec4a03 André Almeida 2021-02-05 988 bool shared1, bool shared2) a7c335592ec4a03 André Almeida 2021-02-05 989 { a7c335592ec4a03 André Almeida 2021-02-05 990 struct futex_waiter w1, w2, *aux, *tmp; a7c335592ec4a03 André Almeida 2021-02-05 991 bool retry = false; a7c335592ec4a03 André Almeida 2021-02-05 992 struct futex_bucket *b1, *b2; a7c335592ec4a03 André Almeida 2021-02-05 993 DEFINE_WAKE_Q(wake_q); a7c335592ec4a03 André Almeida 2021-02-05 994 u32 uval; a7c335592ec4a03 André Almeida 2021-02-05 995 int ret; a7c335592ec4a03 André Almeida 2021-02-05 996 a7c335592ec4a03 André Almeida 2021-02-05 997 b1 = futex_get_bucket(rq1.uaddr, &w1.key, shared1); a7c335592ec4a03 André Almeida 2021-02-05 998 if (IS_ERR(b1)) a7c335592ec4a03 André Almeida 2021-02-05 999 return PTR_ERR(b1); a7c335592ec4a03 André Almeida 2021-02-05 1000 a7c335592ec4a03 André Almeida 2021-02-05 1001 b2 = futex_get_bucket(rq2.uaddr, &w2.key, shared2); a7c335592ec4a03 André Almeida 2021-02-05 1002 if (IS_ERR(b2)) a7c335592ec4a03 André Almeida 2021-02-05 1003 return PTR_ERR(b2); a7c335592ec4a03 André Almeida 2021-02-05 1004 a7c335592ec4a03 André Almeida 2021-02-05 1005 retry: a7c335592ec4a03 André Almeida 2021-02-05 1006 if (shared1 && retry) { a7c335592ec4a03 André Almeida 2021-02-05 1007 b1 = futex_get_bucket(rq1.uaddr, &w1.key, shared1); a7c335592ec4a03 André Almeida 2021-02-05 1008 if (IS_ERR(b1)) a7c335592ec4a03 André Almeida 2021-02-05 @1009 return PTR_ERR(b1); a7c335592ec4a03 André Almeida 2021-02-05 1010 } a7c335592ec4a03 André Almeida 2021-02-05 1011 a7c335592ec4a03 André Almeida 2021-02-05 1012 if (shared2 && retry) { a7c335592ec4a03 André Almeida 2021-02-05 1013 b2 = futex_get_bucket(rq2.uaddr, &w2.key, shared2); a7c335592ec4a03 André Almeida 2021-02-05 1014 if (IS_ERR(b2)) a7c335592ec4a03 André Almeida 2021-02-05 1015 return PTR_ERR(b2); a7c335592ec4a03 André Almeida 2021-02-05 1016 } a7c335592ec4a03 André Almeida 2021-02-05 1017 a7c335592ec4a03 André Almeida 2021-02-05 1018 bucket_inc_waiters(b2); a7c335592ec4a03 André Almeida 2021-02-05 1019 /* a7c335592ec4a03 André Almeida 2021-02-05 1020 * To ensure the locks are taken in the same order for all threads (and a7c335592ec4a03 André Almeida 2021-02-05 1021 * thus avoiding deadlocks), take the "smaller" one first a7c335592ec4a03 André Almeida 2021-02-05 1022 */ a7c335592ec4a03 André Almeida 2021-02-05 1023 if (b1 <= b2) { a7c335592ec4a03 André Almeida 2021-02-05 @1024 spin_lock(&b1->lock); a7c335592ec4a03 André Almeida 2021-02-05 1025 if (b1 < b2) a7c335592ec4a03 André Almeida 2021-02-05 1026 spin_lock_nested(&b2->lock, SINGLE_DEPTH_NESTING); a7c335592ec4a03 André Almeida 2021-02-05 1027 } else { a7c335592ec4a03 André Almeida 2021-02-05 1028 spin_lock(&b2->lock); a7c335592ec4a03 André Almeida 2021-02-05 1029 spin_lock_nested(&b1->lock, SINGLE_DEPTH_NESTING); a7c335592ec4a03 André Almeida 2021-02-05 1030 } a7c335592ec4a03 André Almeida 2021-02-05 1031 a7c335592ec4a03 André Almeida 2021-02-05 1032 ret = futex_get_user(&uval, rq1.uaddr); a7c335592ec4a03 André Almeida 2021-02-05 1033 a7c335592ec4a03 André Almeida 2021-02-05 1034 if (unlikely(ret)) { a7c335592ec4a03 André Almeida 2021-02-05 1035 futex_double_unlock(b1, b2); a7c335592ec4a03 André Almeida 2021-02-05 1036 if (__get_user(uval, (u32 __user *)rq1.uaddr)) a7c335592ec4a03 André Almeida 2021-02-05 1037 return -EFAULT; a7c335592ec4a03 André Almeida 2021-02-05 1038 a7c335592ec4a03 André Almeida 2021-02-05 1039 bucket_dec_waiters(b2); a7c335592ec4a03 André Almeida 2021-02-05 1040 retry = true; a7c335592ec4a03 André Almeida 2021-02-05 1041 goto retry; a7c335592ec4a03 André Almeida 2021-02-05 1042 } a7c335592ec4a03 André Almeida 2021-02-05 1043 a7c335592ec4a03 André Almeida 2021-02-05 1044 if (uval != cmpval) { a7c335592ec4a03 André Almeida 2021-02-05 1045 futex_double_unlock(b1, b2); a7c335592ec4a03 André Almeida 2021-02-05 1046 a7c335592ec4a03 André Almeida 2021-02-05 1047 bucket_dec_waiters(b2); a7c335592ec4a03 André Almeida 2021-02-05 1048 return -EAGAIN; a7c335592ec4a03 André Almeida 2021-02-05 1049 } a7c335592ec4a03 André Almeida 2021-02-05 1050 a7c335592ec4a03 André Almeida 2021-02-05 1051 list_for_each_entry_safe(aux, tmp, &b1->list, list) { a7c335592ec4a03 André Almeida 2021-02-05 1052 if (futex_match(w1.key, aux->key)) { a7c335592ec4a03 André Almeida 2021-02-05 1053 if (ret < nr_wake) { a7c335592ec4a03 André Almeida 2021-02-05 1054 futex_mark_wake(aux, b1, &wake_q); a7c335592ec4a03 André Almeida 2021-02-05 1055 ret++; a7c335592ec4a03 André Almeida 2021-02-05 1056 continue; a7c335592ec4a03 André Almeida 2021-02-05 1057 } a7c335592ec4a03 André Almeida 2021-02-05 1058 a7c335592ec4a03 André Almeida 2021-02-05 1059 if (ret >= nr_wake + nr_requeue) a7c335592ec4a03 André Almeida 2021-02-05 1060 break; a7c335592ec4a03 André Almeida 2021-02-05 1061 a7c335592ec4a03 André Almeida 2021-02-05 1062 aux->key.pointer = w2.key.pointer; a7c335592ec4a03 André Almeida 2021-02-05 1063 aux->key.index = w2.key.index; a7c335592ec4a03 André Almeida 2021-02-05 1064 aux->key.offset = w2.key.offset; a7c335592ec4a03 André Almeida 2021-02-05 1065 a7c335592ec4a03 André Almeida 2021-02-05 1066 if (b1 != b2) { a7c335592ec4a03 André Almeida 2021-02-05 1067 list_del_init_careful(&aux->list); a7c335592ec4a03 André Almeida 2021-02-05 1068 bucket_dec_waiters(b1); a7c335592ec4a03 André Almeida 2021-02-05 1069 a7c335592ec4a03 André Almeida 2021-02-05 1070 list_add_tail(&aux->list, &b2->list); a7c335592ec4a03 André Almeida 2021-02-05 1071 bucket_inc_waiters(b2); a7c335592ec4a03 André Almeida 2021-02-05 1072 } a7c335592ec4a03 André Almeida 2021-02-05 1073 ret++; a7c335592ec4a03 André Almeida 2021-02-05 1074 } a7c335592ec4a03 André Almeida 2021-02-05 1075 } a7c335592ec4a03 André Almeida 2021-02-05 1076 a7c335592ec4a03 André Almeida 2021-02-05 1077 futex_double_unlock(b1, b2); a7c335592ec4a03 André Almeida 2021-02-05 1078 wake_up_q(&wake_q); a7c335592ec4a03 André Almeida 2021-02-05 1079 bucket_dec_waiters(b2); a7c335592ec4a03 André Almeida 2021-02-05 1080 a7c335592ec4a03 André Almeida 2021-02-05 1081 return ret; a7c335592ec4a03 André Almeida 2021-02-05 1082 } a7c335592ec4a03 André Almeida 2021-02-05 1083 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
