But this way you throw away a lot of functionality, make the existence of two pointers pointless, cause pthread_self() to change across fork and force NPTL to copy thread state. How about instead doing a verify_area in copy_process, putting the child_settid address and the tid in two child registers and assigning it in assembly in ret_from_fork? Alternatively you could also manually call the copy-on-write handler functions but this adds complexity for little gain.