On Tuesday 21 March 2006 02:00, Jeff Dike wrote:
> On Fri, Mar 17, 2006 at 08:36:58PM +0100, Blaisorblade wrote:
> > 2) write_sigio_thread should do a "down" on a semaphore/mutex and the
> > first update_thread should "up" it. As usually, this semaphore would be
> > indeed implemented as a pipe.

> Is there anything wrong with this:

> Index: linux-2.6.15/arch/um/os-Linux/sigio.c
> ===================================================================
> --- linux-2.6.15.orig/arch/um/os-Linux/sigio.c        2006-03-20
> 19:48:51.000000000 -0500 +++
> linux-2.6.15/arch/um/os-Linux/sigio.c 2006-03-20 19:49:55.000000000 -0500
> @@ -271,6 +271,10 @@ void write_sigio_workaround(void)
>       if(write_sigio_pid != -1)
>               goto out_unlock;
>
> +     current_poll = ((struct pollfds) { .poll        = p,
> +                                        .used        = 1,
> +                                        .size        = 1 });
> +
>       write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
>                                           CLONE_FILES | CLONE_VM, &stack, 0);
>
> @@ -284,10 +288,6 @@ void write_sigio_workaround(void)
>       memcpy(write_sigio_fds, l_write_sigio_fds, sizeof(l_write_sigio_fds));
>       memcpy(sigio_private, l_sigio_private, sizeof(l_sigio_private));
>
> -     current_poll = ((struct pollfds) { .poll        = p,
> -                                        .used        = 1,
> -                                        .size        = 1 });
> -
>       sigio_unlock();
>       return;
>
> That seems to me to fix the basic problem - the thread is using data
> that hasn't been set up yet, and I don't see that moving it up breaks
> anything.

>                               Jeff

Ok, this is conceptually correct, and looking at 2.6.14 code this bug wasn't 
there, so _I_ introduced it, while cleaning it up. Sorry. Beyond, my idea of 
adding the semaphore was incorrect (it would work only if 
write_sigio_workaround did the up()).

However, while I overlooked this, you overlooked what I did:
*) you must also move the setting of write_sigio_fds and sigio_private above, 
or we'll get the same problem again in different places of 
write_sigio_thread.

*) you must update the exit path. I've taken care so that only if everything 
succeed the result is stored, and to hold the lock for the minimum time 
needed (particularly not while doing any allocation). I'm not sure whether 
the first property is needed, but it would be conservative to do so to 
preserve coherence of data structures.

In particular: if we store an fd != -1, some function may later close it (say 
when the console is closed); if we closed it in the exit path, then we're 
closing an unrelated fd and getting a bug.

So, if the thread startup fails, you _must_ clear again current_poll, 
write_sigio_fds and sigio_private.
-- 
Inform me of my mistakes, so I can keep imitating Homer Simpson's "Doh!".
Paolo Giarrusso, aka Blaisorblade (Skype ID "PaoloGiarrusso", ICQ 215621894)
http://www.user-mode-linux.org/~blaisorblade

        

        
                
___________________________________ 
Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB 
http://mail.yahoo.it



-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to