Lines Matching refs:the

15  1) a one time call, per thread, to tell the kernel where its list of
18 by the exiting thread.
23 threads in the kernel. Options on the sys_futex(2) system call support
24 waiting on a particular futex, and waking up the next waiter on a
27 For robust_futexes to work, the user code (typically in a library such
28 as glibc linked with the application) has to manage and place the
29 necessary list elements exactly as the kernel expects them. If it fails
31 probably causing deadlock or other such failure of the other threads
32 waiting on the same locks.
35 issue the system call:
40 The pointer 'head' points to a structure in the threads address space
50 exit, if the corresponding sys_set_robust_list() call has been made to
53 The first word in the memory structure at 'head' contains a
55 as described below. If the list is empty, the pointer will point
56 to itself, 'head'. The last 'lock entry' points back to the 'head'.
58 The second word, called 'offset', specifies the offset from the
59 address of the associated 'lock entry', plus or minus, of what will
60 be called the 'lock word', from that 'lock entry'. The 'lock word'
61 is always a 32 bit word, unlike the other words above. The 'lock
62 word' holds 3 flag bits in the upper 3 bits, and the thread id (TID)
63 of the thread holding the lock in the bottom 29 bits. See further
64 below for a description of the flag bits.
67 the address of the 'lock entry', during list insertion and removal,
69 in the middle of a locking or unlocking operation.
71 Each 'lock entry' on the single linked list starting at 'head' consists
72 of just a single word, pointing to the next 'lock entry', or back to
74 entry', at an offset from the 'lock entry' specified by the 'offset'
77 The 'lock word' is always 32 bits, and is intended to be the same 32 bit
78 lock variable used by the futex mechanism, in conjunction with
79 robust_futexes. The kernel will only be able to wakeup the next thread
80 waiting for a lock on a threads exit if that next thread used the futex
81 mechanism to register the address of that 'lock word' with the kernel.
85 'lock entry' on this list, with its associated 'lock word' at the
87 the kernel will walk this list, mark any such locks with a bit
88 indicating their holder died, and wakeup the next thread waiting for
89 that lock using the futex mechanism.
91 When a thread has invoked the above system call to indicate it
92 anticipates using robust_futexes, the kernel stores the passed in 'head'
94 using the system call:
103 long as the 'offset' to the 'lock word' is the same for all
105 it currently holds using the 'lock entry' pointers. It may also have
106 other links between the locks, such as the reverse side of a double
107 linked list, but that doesn't matter to the kernel.
110 pointer known to the kernel, the kernel can provide to a thread the
112 up locks held at the time of (a perhaps unexpectedly) exit.
115 entirely by user level code in the contending threads, and by the
117 only essential involvement in robust_futexes is to remember where the
118 list 'head' is, and to walk the list on thread exit, handling locks
119 still held by the departing thread, as described below.
127 at different times by any of the threads with access to that region. The
128 thread currently holding such a lock, if any, is marked with the threads
129 TID in the lower 29 bits of the 'lock word'.
132 the kernel to correctly handle lock cleanup regardless of when the task
133 exits (perhaps it gets an unexpected signal 9 in the middle of
134 manipulating this list), the user code must observe the following
138 1) set the 'list_op_pending' word to the address of the 'lock entry'
140 2) acquire the futex lock,
141 3) add the lock entry, with its thread id (TID) in the bottom 29 bits
142 of the 'lock word', to the linked list starting at 'head', and
143 4) clear the 'list_op_pending' word.
146 1) set the 'list_op_pending' word to the address of the 'lock entry'
148 2) remove the lock entry for this lock from the 'head' list,
149 3) release the futex lock, and
150 4) clear the 'lock_op_pending' word.
152 On exit, the kernel will consider the address stored in
153 'list_op_pending' and the address of each 'lock word' found by walking
154 the list starting at 'head'. For each such address, if the bottom 29
155 bits of the 'lock word' at offset 'offset' from that address equals the
156 exiting threads TID, then the kernel will do two things:
159 wakeup on that address, which will waken the next thread that has
160 used to the futex mechanism to wait on that address, and
161 2) atomically set bit 30 (0x40000000) in the 'lock word'.
163 In the above, bit 31 was set by futex waiters on that lock to indicate
164 they were waiting, and bit 30 is set by the kernel to indicate that the
165 lock owner died holding the lock.
167 The kernel exit code will silently stop scanning the list further if at
170 1) the 'head' pointer or an subsequent linked list pointer
172 2) the calculated location of the 'lock word' (address plus
173 'offset') is not the valid address of a 32 bit user space
175 3) if the list contains more than 1 million (subject to
178 When the kernel sees a list entry whose 'lock word' doesn't have the
179 current threads TID in the lower 29 bits, it does nothing with that
180 entry, and goes on to the next entry.
182 Bit 29 (0x20000000) of the 'lock word' is reserved for future use.