From: Jeff Dike <jdike@addtoit.com>
To: Blaisorblade <blaisorblade@yahoo.it>
Cc: user-mode-linux-devel@lists.sourceforge.net,
Werner Almesberger <wa@almesberger.net>,
Rob Landley <rob@landley.net>
Subject: Re: [uml-devel] Occasional hang starting up.
Date: Thu, 23 Mar 2006 21:26:45 -0500 [thread overview]
Message-ID: <20060324022645.GC8104@ccure.user-mode-linux.org> (raw)
In-Reply-To: <200603240137.56798.blaisorblade@yahoo.it>
[-- Attachment #1: Type: text/plain, Size: 765 bytes --]
On Fri, Mar 24, 2006 at 01:37:54AM +0100, Blaisorblade wrote:
> 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).
I merged that patch.
> 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
I tried this - I couldn't get anything like that to compile. I always
got an "incompatible types in assignment" error.
Below is the latest version.
Jeff
[-- Attachment #2: sigio-race --]
[-- Type: text/plain, Size: 2349 bytes --]
# This fixes a race in the starting of write_sigio_thread.
# Previously, some of the data needed by the thread was initialized
# after the clone. If the thread ean immediately, it would see the
# uninitialized data, including an empty pollfds, which would cause it
# to hang.
# We move the data initialization to before the clone, and adjust the
# error paths and cleanup accordingly.
#
# Signed-off-by: Jeff Dike <jdike@addtoit.com>
Index: linux-2.6.16/arch/um/os-Linux/sigio.c
===================================================================
--- linux-2.6.16.orig/arch/um/os-Linux/sigio.c 2006-03-23 17:30:27.000000000 -0500
+++ linux-2.6.16/arch/um/os-Linux/sigio.c 2006-03-23 17:44:11.000000000 -0500
@@ -270,42 +270,40 @@ 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;
- /* 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;
out_free:
kfree(p);
+ sigio_unlock();
out_close2:
close(l_sigio_private[0]);
close(l_sigio_private[1]);
prev parent reply other threads:[~2006-03-24 2:26 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
2006-03-24 2:26 ` Jeff Dike [this message]
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=20060324022645.GC8104@ccure.user-mode-linux.org \
--to=jdike@addtoit.com \
--cc=blaisorblade@yahoo.it \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.