linux-um archives
 help / color / mirror / Atom feed
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]);

  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