public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
To: David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
Cc: Linus Torvalds
	<torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Roland McGrath <roland-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Martin Schwidefsky
	<schwidefsky-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>,
	linux-s390-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
	linux-ia64-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-arch-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 2/4] set_restore_sigmask TIF_SIGPENDING
Date: Wed, 9 Apr 2008 15:39:39 +0400	[thread overview]
Message-ID: <20080409113939.GA99@tv-sign.ru> (raw)
In-Reply-To: <1207739787.27048.57.camel-Fexsq3y4057IgHVZqg5X0TlWvGAXklZc@public.gmane.org>

On 04/09, David Woodhouse wrote:
>
> On Tue, 2008-04-08 at 15:35 +0400, Oleg Nesterov wrote:
> > Why do we need any flag? It looks a bit ugly. Isn't it better to introduce
> > the new magic ERESTART_XXX which means ERESTARTNOHAND + restore-sigmask ?
> > 
> > We only need this flag as an implicit parameter to the arch dependent do_signal()
> > which we can't call directly, and thus it must imply TIF_SIGPENDING, and it
> > is not valid after do_signal() (should be cleared). This all looks like
> > ERESTART_ magic, why should we add something else ?
> > 
> > See also http://marc.info/?l=linux-kernel&m=113734458516136
> > 
> > Of course, probably it is too late to change the implementation even if
> > I am right, the question is: what I am missed?
> 
> Q: When ppoll() is interrupted by a signal, what signal mask should be
> active when the signal handler is active?
> 
> I believe that the signal handler should run with the temporary sigmask
> which was set by ppoll(), and the original sigmask should be restored
> only when the handler completes -- and that's what we achieve with
> TIF_RESTORE_SIGMASK.

Yes sure.

> So a signal which was originally enabled but is temporarily disabled by
> the mask passed to ppoll() will not be able to interrupt the handler for
> the signal which interrupted ppoll().
> 
> Your version will restore the original signal mask _before_ invoking the
> signal handler which interrupted ppoll()

Why do you think so?

Please look at the "patch" below,

	--- arch/x86/kernel/signal_32.c	2008-02-15 16:58:38.000000000 +0300
	+++ -	2008-04-09 15:16:05.393510662 +0400
	@@ -526,10 +526,14 @@ handle_signal(unsigned long sig, siginfo
	 {
		int ret;
	 
	+	oldset = &current->blocked;
	+
		/* Are we from a system call? */
		if (regs->orig_ax >= 0) {
			/* If so, check system call restarting.. */
			switch (regs->ax) {
	+			case -ERESTART_XXX:
	+				oldset = &current->saved_sigmask;
				case -ERESTART_RESTARTBLOCK:
				case -ERESTARTNOHAND:
					regs->ax = -EINTR;

We also need a similar change in do_signal(). Now,

	--- fs/select.c	2008-02-15 16:59:15.000000000 +0300
	+++ -	2008-04-09 15:19:29.015991911 +0400
	@@ -805,9 +805,8 @@ asmlinkage long sys_ppoll(struct pollfd 
			if (sigmask) {
				memcpy(&current->saved_sigmask, &sigsaved,
						sizeof(sigsaved));
	-			set_thread_flag(TIF_RESTORE_SIGMASK);
			}
	-		ret = -ERESTARTNOHAND;
	+		ret = -ERESTART_XXX;
		} else if (sigmask)
			sigprocmask(SIG_SETMASK, &sigsaved, NULL);

Perhaps I missed something else, though. Not that I really think it worth
changing, but I'll try to make a proof of concept patch on Weekend, on top
of Roland's cleanups.

As I see it, the main disadvantage of ERESTART_ approach is that we need 2
new ERESTART_ codes, one for ERESTARTNOHAND, another for ERESTART_RESTARTBLOCK.
And yes, while I personally think this is "more clean", it is very subjective.

Oleg.

WARNING: multiple messages have this Message-ID (diff)
From: Oleg Nesterov <oleg@tv-sign.ru>
To: David Woodhouse <dwmw2@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Roland McGrath <roland@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	linux-s390@vger.kernel.org, tony.luck@intel.com,
	linux-ia64@vger.kernel.org, linux-arch@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/4] set_restore_sigmask TIF_SIGPENDING
Date: Wed, 9 Apr 2008 15:39:39 +0400	[thread overview]
Message-ID: <20080409113939.GA99@tv-sign.ru> (raw)
Message-ID: <20080409113939.obw95NT2CmfoSYKU5TU2hzDhcFuiFp3_jJZgQvmcF3Q@z> (raw)
In-Reply-To: <1207739787.27048.57.camel@shinybook.infradead.org>

On 04/09, David Woodhouse wrote:
>
> On Tue, 2008-04-08 at 15:35 +0400, Oleg Nesterov wrote:
> > Why do we need any flag? It looks a bit ugly. Isn't it better to introduce
> > the new magic ERESTART_XXX which means ERESTARTNOHAND + restore-sigmask ?
> > 
> > We only need this flag as an implicit parameter to the arch dependent do_signal()
> > which we can't call directly, and thus it must imply TIF_SIGPENDING, and it
> > is not valid after do_signal() (should be cleared). This all looks like
> > ERESTART_ magic, why should we add something else ?
> > 
> > See also http://marc.info/?l=linux-kernel&m=113734458516136
> > 
> > Of course, probably it is too late to change the implementation even if
> > I am right, the question is: what I am missed?
> 
> Q: When ppoll() is interrupted by a signal, what signal mask should be
> active when the signal handler is active?
> 
> I believe that the signal handler should run with the temporary sigmask
> which was set by ppoll(), and the original sigmask should be restored
> only when the handler completes -- and that's what we achieve with
> TIF_RESTORE_SIGMASK.

Yes sure.

> So a signal which was originally enabled but is temporarily disabled by
> the mask passed to ppoll() will not be able to interrupt the handler for
> the signal which interrupted ppoll().
> 
> Your version will restore the original signal mask _before_ invoking the
> signal handler which interrupted ppoll()

Why do you think so?

Please look at the "patch" below,

	--- arch/x86/kernel/signal_32.c	2008-02-15 16:58:38.000000000 +0300
	+++ -	2008-04-09 15:16:05.393510662 +0400
	@@ -526,10 +526,14 @@ handle_signal(unsigned long sig, siginfo
	 {
		int ret;
	 
	+	oldset = &current->blocked;
	+
		/* Are we from a system call? */
		if (regs->orig_ax >= 0) {
			/* If so, check system call restarting.. */
			switch (regs->ax) {
	+			case -ERESTART_XXX:
	+				oldset = &current->saved_sigmask;
				case -ERESTART_RESTARTBLOCK:
				case -ERESTARTNOHAND:
					regs->ax = -EINTR;

We also need a similar change in do_signal(). Now,

	--- fs/select.c	2008-02-15 16:59:15.000000000 +0300
	+++ -	2008-04-09 15:19:29.015991911 +0400
	@@ -805,9 +805,8 @@ asmlinkage long sys_ppoll(struct pollfd 
			if (sigmask) {
				memcpy(&current->saved_sigmask, &sigsaved,
						sizeof(sigsaved));
	-			set_thread_flag(TIF_RESTORE_SIGMASK);
			}
	-		ret = -ERESTARTNOHAND;
	+		ret = -ERESTART_XXX;
		} else if (sigmask)
			sigprocmask(SIG_SETMASK, &sigsaved, NULL);

Perhaps I missed something else, though. Not that I really think it worth
changing, but I'll try to make a proof of concept patch on Weekend, on top
of Roland's cleanups.

As I see it, the main disadvantage of ERESTART_ approach is that we need 2
new ERESTART_ codes, one for ERESTARTNOHAND, another for ERESTART_RESTARTBLOCK.
And yes, while I personally think this is "more clean", it is very subjective.

Oleg.


  parent reply	other threads:[~2008-04-09 11:39 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-29  0:12 [PATCH 1/4] set_restore_sigmask Roland McGrath
2008-03-29  0:12 ` Roland McGrath
     [not found] ` <20080329001230.D013726FA1D-nL1rrgvulkcB9AHHLWeGtNQXobZC6xk2@public.gmane.org>
2008-03-29  0:13   ` [PATCH 2/4] set_restore_sigmask TIF_SIGPENDING Roland McGrath
2008-03-29  0:13     ` Roland McGrath
     [not found]     ` <20080329001341.7F93826FA1D-nL1rrgvulkcB9AHHLWeGtNQXobZC6xk2@public.gmane.org>
2008-03-29  0:53       ` Linus Torvalds
2008-03-29  0:53         ` Linus Torvalds
     [not found]         ` <alpine.LFD.1.00.0803281746480.14670-5CScLwifNT1QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
2008-03-29  2:24           ` Roland McGrath
2008-03-29  2:24             ` Roland McGrath
2008-03-29  2:52             ` Linus Torvalds
2008-03-29  2:52               ` Linus Torvalds
     [not found]               ` <alpine.LFD.1.00.0803281942440.14670-5CScLwifNT1QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
2008-03-29  3:12                 ` Roland McGrath
2008-03-29  3:12                   ` Roland McGrath
     [not found]             ` <20080329022408.0DD4726FA1D-nL1rrgvulkcB9AHHLWeGtNQXobZC6xk2@public.gmane.org>
2008-03-29  3:11               ` [PATCH 1/2] HAVE_SET_RESTORE_SIGMASK Roland McGrath
2008-03-29  3:11                 ` Roland McGrath
2008-04-09 11:45                 ` David Woodhouse
2008-04-09 11:45                   ` David Woodhouse
2008-04-10 20:32                   ` Russell King
2008-04-10 20:32                     ` Russell King
     [not found]                     ` <20080410203250.GA21589-f404yB8NqCZvn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2008-04-11 13:40                       ` David Woodhouse
2008-04-11 13:40                         ` David Woodhouse
2008-03-29  3:14             ` Roland McGrath
2008-03-29  3:14               ` Roland McGrath
2008-03-29  3:14               ` [PATCH 2/2] x86 TS_RESTORE_SIGMASK Roland McGrath
2008-03-29  3:14                 ` Roland McGrath
2008-03-31 13:01                 ` Ingo Molnar
2008-03-31 13:01                   ` Ingo Molnar
2008-03-31 19:30                   ` Roland McGrath
2008-03-31 19:30                     ` Roland McGrath
2008-03-30 10:53           ` [PATCH 2/4] set_restore_sigmask TIF_SIGPENDING Paul Mackerras
2008-03-30 10:53             ` Paul Mackerras
2008-04-08 11:35           ` Oleg Nesterov
2008-04-08 11:35             ` Oleg Nesterov
     [not found]             ` <20080408113519.GA227-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2008-04-08 14:53               ` Linus Torvalds
2008-04-08 14:53                 ` Linus Torvalds
2008-04-08 19:51               ` Roland McGrath
2008-04-08 19:51                 ` Roland McGrath
2008-04-09 11:16             ` David Woodhouse
2008-04-09 11:16               ` David Woodhouse
     [not found]               ` <1207739787.27048.57.camel-Fexsq3y4057IgHVZqg5X0TlWvGAXklZc@public.gmane.org>
2008-04-09 11:39                 ` Oleg Nesterov [this message]
2008-04-09 11:39                   ` Oleg Nesterov
2008-04-09 12:57                   ` Petr Tesarik
2008-04-09 12:57                     ` Petr Tesarik
     [not found]                   ` <20080409113939.GA99-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2008-04-09 16:14                     ` David Woodhouse
2008-04-09 16:14                       ` David Woodhouse
2008-04-09 16:22                       ` Oleg Nesterov
2008-04-09 16:22                         ` Oleg Nesterov
2008-04-09 18:40                         ` David Woodhouse
2008-04-09 18:40                           ` David Woodhouse
2008-03-29  0:14   ` [PATCH 3/4] s390 renumber TIF_RESTORE_SIGMASK Roland McGrath
2008-03-29  0:14     ` Roland McGrath
2008-03-31  7:53     ` Martin Schwidefsky
2008-03-31  7:53       ` Martin Schwidefsky
2008-03-29  0:14 ` [PATCH 4/4] ia64 " Roland McGrath
2008-03-29  0:14   ` Roland McGrath

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=20080409113939.GA99@tv-sign.ru \
    --to=oleg-6lxkizvqkoavjsylp49lxw@public.gmane.org \
    --cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
    --cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=linux-arch-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-ia64-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-s390-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=roland-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=schwidefsky-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org \
    --cc=tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
    /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