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: Fri, 24 Mar 2006 01:37:54 +0100 [thread overview]
Message-ID: <200603240137.56798.blaisorblade@yahoo.it> (raw)
In-Reply-To: <20060323184551.GA5398@ccure.user-mode-linux.org>
[-- Attachment #1: Type: text/plain, Size: 3630 bytes --]
On Thursday 23 March 2006 19:45, Jeff Dike wrote:
> On Tue, Mar 21, 2006 at 02:21:40AM +0100, Blaisorblade wrote:
> > 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.
> OK, this is all done, I think.
> What do you think about this?
Yep, it seems it looks good. But 1 bug still and two suggestions.
See also attached patch (it misses one of the suggestions because it's late
and I'm going to sleep).
> Index: linux-2.6.15/arch/um/os-Linux/sigio.c
> ===================================================================
> --- linux-2.6.15.orig/arch/um/os-Linux/sigio.c 2006-03-23
> 12:55:27.000000000 -0500 +++
> linux-2.6.15/arch/um/os-Linux/sigio.c 2006-03-23 13:41:11.000000000 -0500
> @@ -269,42 +269,41 @@ void write_sigio_workaround(void)
> /* Did we race? Don't try to optimize this, please, it's not so likely
> * to happen, and no more than once at the boot. */
> if(write_sigio_pid != -1)
> - goto out_unlock;
> + goto out_free;
>
> - write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
> - CLONE_FILES | CLONE_VM, &stack, 0);
> -
> - if (write_sigio_pid < 0)
> - goto out_clear;
> + current_poll = ((struct pollfds) { .poll = p,
> + .used = 1,
> + .size = 1 });
>
> if (write_sigio_irq(l_write_sigio_fds[0]))
> - goto out_kill;
> + goto out_free;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Here you're not clearing current_poll!
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> - /* Success, finally. */
> 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 });
> + write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
> + CLONE_FILES | CLONE_VM, &stack, 0);
>
> - sigio_unlock();
> - return;
> + if (write_sigio_pid < 0)
> + goto out_clear;
>
> - out_kill:
> - l_write_sigio_pid = write_sigio_pid;
> - write_sigio_pid = -1;
> sigio_unlock();
> - /* Going to call waitpid, avoid holding the lock. */
> - os_kill_process(l_write_sigio_pid, 1);
> - goto out_free;
> + return;
>
> out_clear:
> write_sigio_pid = -1;
> - out_unlock:
> - sigio_unlock();
> + current_poll = ((struct pollfds) { .poll = NULL,
> + .size = 0,
> + .used = 0 });
> + write_sigio_fds[0] = -1;
> + write_sigio_fds[1] = -1;
> +
> + sigio_private[0] = -1;
> + sigio_private[1] = -1;
> +
If possible (there should be such array constructors) this shouldn't be
redundant / duplicated with the initial declarations.
Like write_sigio_fds = (int[]) {-1,-1} and having a common macro like
#define SIGIO_FDS_INIT {-1,-1}
static int write_sigio_fds[2] = SIGIO_FDS_INIT;
...
write_sigio_fds = (int[]) SIGIO_FDS_INIT
(we _will_ get one copy wrong, if we can :-)).
If sending to 2.6.16 this can be kept separate or they could maybe complain
"ah, no extra changes, just the fix!".
Btw, this one is not attached.
> out_free:
> kfree(p);
> + sigio_unlock();
p is a local variable, so sigio_unlock can be done before kfree(p).
> out_close2:
> close(l_sigio_private[0]);
> close(l_sigio_private[1]);
--
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
[-- Attachment #2: uml-fix-sigio-startup-race-hang-fix.patch --]
[-- Type: text/x-diff, Size: 1076 bytes --]
Index: linux-2.6.git/arch/um/kernel/sigio_user.c
===================================================================
--- linux-2.6.git.orig/arch/um/kernel/sigio_user.c
+++ linux-2.6.git/arch/um/kernel/sigio_user.c
@@ -398,7 +398,7 @@ void write_sigio_workaround(void)
.size = 1 });
if (write_sigio_irq(l_write_sigio_fds[0]))
- goto out_free;
+ goto out_clear_poll;
memcpy(write_sigio_fds, l_write_sigio_fds, sizeof(l_write_sigio_fds));
memcpy(sigio_private, l_sigio_private, sizeof(l_sigio_private));
@@ -414,18 +414,20 @@ void write_sigio_workaround(void)
out_clear:
write_sigio_pid = -1;
- current_poll = ((struct pollfds) { .poll = NULL,
- .size = 0,
- .used = 0 });
+
write_sigio_fds[0] = -1;
write_sigio_fds[1] = -1;
sigio_private[0] = -1;
sigio_private[1] = -1;
+ out_clear_poll:
+ current_poll = ((struct pollfds) { .poll = NULL,
+ .size = 0,
+ .used = 0 });
out_free:
- kfree(p);
sigio_unlock();
+ kfree(p);
out_close2:
os_close_file(l_sigio_private[0]);
os_close_file(l_sigio_private[1]);
next prev parent reply other threads:[~2006-03-24 0:38 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
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 [this message]
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=200603240137.56798.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