Index: sys/kern/kern_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_lwp.c,v retrieving revision 1.206 diff -p -u -r1.206 kern_lwp.c --- sys/kern/kern_lwp.c 7 Nov 2019 19:45:18 -0000 1.206 +++ sys/kern/kern_lwp.c 10 Nov 2019 22:45:22 -0000 @@ -902,8 +902,6 @@ lwp_create(lwp_t *l1, proc_t *p2, vaddr_ if ((flags & LWP_PIDLID) != 0) { lid = proc_alloc_pid(p2); l2->l_pflag |= LP_PIDLID; - } else if (p2->p_nlwps == 0) { - lid = l1->l_lid; } else { lid = 0; } @@ -922,20 +920,36 @@ lwp_create(lwp_t *l1, proc_t *p2, vaddr_ sigemptyset(&l2->l_sigpend.sp_set); if (__predict_true(lid == 0)) { - /* - * XXX: l_lid are expected to be unique (for a process) - * if LWP_PIDLID is sometimes set this won't be true. - * Once 2^31 threads have been allocated we have to - * scan to ensure we allocate a unique value. - */ - lid = ++p2->p_nlwpid; - if (__predict_false(lid & LID_SCAN)) { - lid = lwp_find_free_lid(lid, l2, p2); + if (p2->p_nlwps == 0 && l1->l_lid != 1) { + KASSERT(p2->p_nlwpid == 0); + /* + * XXX: When forking (p_nlwps == 0) copy + * the parent LID to keep the expectations + * of our runtime linker. Set LID_SCAN so + * that subsequent calls will search the + * LID space. + * Avoid this when the next LID (p_nlwpid+1) + * (== 1 after fork) is the same as the parent + * LID. + */ + lid = l1->l_lid; p2->p_nlwpid = lid | LID_SCAN; - /* l2 as been inserted into p_lwps in order */ - goto skip_insert; + } else { + /* + * XXX: l_lid are expected to be unique (for a process) + * if LWP_PIDLID is sometimes set this won't be true. + * Once 2^31 threads have been allocated we have to + * scan to ensure we allocate a unique value. + */ + lid = ++p2->p_nlwpid; + if (__predict_false(lid & LID_SCAN)) { + lid = lwp_find_free_lid(lid, l2, p2); + p2->p_nlwpid = lid | LID_SCAN; + /* l2 has been inserted into p_lwps in order */ + goto skip_insert; + } + p2->p_nlwpid = lid; } - p2->p_nlwpid = lid; } LIST_INSERT_HEAD(&p2->p_lwps, l2, l_sibling); skip_insert: