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]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to