On Fri, 2015-01-16 at 21:54 +0100, Michael Kerrisk (man-pages) wrote: > On 01/16/2015 04:20 PM, Thomas Gleixner wrote: > > On Fri, 16 Jan 2015, Michael Kerrisk (man-pages) wrote: > > > >> Hello Thomas, > >> > >> On 01/15/2015 11:23 PM, Thomas Gleixner wrote: > >>> On Thu, 15 Jan 2015, Michael Kerrisk (man-pages) wrote: > >>>>> [EINVAL] uaddr equal uaddr2. Requeue to same futex. > >>>> > >>>> ??? I added this, but does this error not occur only for PI requeues? > >>> > >>> It's equally wrong for normal futexes. And its actually the same code > >>> checking for this for all variants. > >> > >> I don't understand "equally wrong" in your reply, I'm sorry. Do you > >> mean: > >> > >> a) This error text should be there for both normal and PI requeues > > > > It is there for both. The requeue code has that check independent of > > the requeue type (normal/pi). It never makes sense to requeue > > something to itself whether normal or pi futex. We added this for PI, > > because there it is harmful, but we did not special case it. So normal > > futexes get the same treatment. > > Hello Thomas, > > Color me stupid, but I can't see this in futex_requeue(). Where is that > check that is "independent of the requeue type (normal/pi)"? > > When I look through futex_requeue(), all the likely looking sources > of EINVAL are governed by a check on the 'requeue_pi' argument. Yeah, its not very straightforward, I was also scratching my head. First we do: if (requeue_pi) { /* * Requeue PI only works on two distinct uaddrs. This * check is only valid for private futexes. See below. */ if (uaddr1 == uaddr2) return -EINVAL; Then: /* * The check above which compares uaddrs is not sufficient for * shared futexes. We need to compare the keys: */ if (requeue_pi && match_futex(&key1, &key2)) { ret = -EINVAL; goto out_put_keys; } I wonder why we're checking for requeue_pi again, when, at least according to the comments, it should be for shared. I guess it would make sense depending on the mappings as the keys are the only true way of determining if both futexes are the same, so perhaps: if ((requeue_pi || (flags & FLAGS_SHARED)) && match_futex()) That would also align with the retry labels. Thanks, Davidlohr -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html