tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: updating COMPAT_LINUX for linux 2.6.x support (take 2)
On Sat, Jun 05, 2010 at 12:02:35AM +0100, Mindaugas Rasiukevicius wrote:
> Hello,
>
> Chuck Silvers <chuq%chuq.com@localhost> wrote:
> >
> > I rewrote my COMPAT_LINUX changes using the 1-proc-many-LWPs model.
> > the patch is at:
> >
> > ftp://ftp.netbsd.org/pub/NetBSD/misc/chs/linux/diff.linux-nptl-take2.23
> >
>
> I like this patch a lot! Especially good clean-ups, as a result.
> Few comments:
>
> - Thanks for implementing ucas_*() for extra architectures. This is
> planned to be used for POSIX shared synchronisation primitives, thus
> become a public API. In the longer term, LINUX_UCAS_INT_UP should be
> moved to generic code or, preferably, die.
sure, I was just being a bit lazy.
> - From proc_alloc():
>
> - /* allocate next free pid */
> + p->p_pid = proc_alloc_pid(p);
> + kdtrace_proc_ctor(NULL, p);
> + mutex_exit(proc_lock);
> + return p;
>
> The kdtrace_proc_ctor() should not allocate memory with proc_lock held.
> Neither it needs to be called late - I fixed this on HEAD, so proc_lock
> can now be released by proc_alloc_pid().
ok, I like that better too. I also changed proc_alloc_pid() to
set p->p_pid while proc_lock is still held (if it wasn't set already).
> - From linux_clone_nptl():
>
> + lwp_lock(l2);
> + if ((l->l_flag & (LW_WREBOOT | LW_WSUSPEND | LW_WEXIT)) == 0) {
> + if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0)
> + l2->l_stat = LSSTOP;
> + else {
>
> This needs lwp_unlock_to(l2, spc->spc_lwplock), as LSSTOP state is protected
> by this lock. This is also broken in sys__lwp_create() - will fix it shortly.
I'll take your word for it... I haven't learned all the scheduler goop,
I just copied it from sys__lwp_create() (as you noticed).
I've updated it with the new code.
> - From sys_obreak():
>
> + new = round_page((vaddr_t)SCARG(uap, nsize));
> + if (new == 0) {
> + return ENOMEM;
> + }
>
> IIRC, some architectures check for zero from assembly in libc stubs, before
> going to the syscall.
that check was there before, I just moved it earlier in the function.
it looks like all of the netbsd libc stubs check the value against
"end" or "_end" before calling the syscall, so we should be able to
remove it for native processes. a bunch of other emulations use this
same function though, and I don't see a lot of benefit in trying to
make this more specific.
-Chuck
Home |
Main Index |
Thread Index |
Old Index