From: Blaisorblade <blaisorblade@yahoo.it>
To: user-mode-linux-devel@lists.sourceforge.net
Cc: Jeff Dike <jdike@addtoit.com>,
Werner Almesberger <wa@almesberger.net>,
Rob Landley <rob@landley.net>
Subject: Re: [uml-devel] Occasional hang starting up.
Date: Tue, 21 Mar 2006 02:21:40 +0100 [thread overview]
Message-ID: <200603210221.41654.blaisorblade@yahoo.it> (raw)
In-Reply-To: <20060321010025.GC7860@ccure.user-mode-linux.org>
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
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next prev parent reply other threads:[~2006-03-21 1:21 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-11 18:01 [uml-devel] Occasional hang starting up Rob Landley
2006-03-12 20:33 ` Blaisorblade
2006-03-14 20:22 ` Jeff Dike
2006-03-14 21:31 ` Rob Landley
2006-03-16 14:22 ` Werner Almesberger
2006-03-17 19:36 ` Blaisorblade
2006-03-17 21:27 ` Werner Almesberger
2006-03-17 22:14 ` Blaisorblade
2006-03-17 23:54 ` Werner Almesberger
2006-03-20 10:20 ` Werner Almesberger
2006-03-21 1:00 ` Jeff Dike
2006-03-21 1:21 ` Blaisorblade [this message]
2006-03-23 18:45 ` Jeff Dike
2006-03-23 19:05 ` Werner Almesberger
2006-03-23 20:13 ` Jeff Dike
2006-03-23 21:23 ` Werner Almesberger
2006-03-23 21:43 ` Jeff Dike
2006-03-24 0:37 ` Blaisorblade
2006-03-24 2:26 ` Jeff Dike
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200603210221.41654.blaisorblade@yahoo.it \
--to=blaisorblade@yahoo.it \
--cc=jdike@addtoit.com \
--cc=rob@landley.net \
--cc=user-mode-linux-devel@lists.sourceforge.net \
--cc=wa@almesberger.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox