From: Ingo Molnar <mingo@elte.hu>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Roland McGrath <roland@redhat.com>, linux-kernel@vger.kernel.org
Subject: Re: [FOR REVIEW, PATCH 2/2] introduce "struct wait_opts" to simplify do_wait() pathes
Date: Wed, 6 May 2009 09:27:56 +0200 [thread overview]
Message-ID: <20090506072756.GA17457@elte.hu> (raw)
In-Reply-To: <20090506053324.GA31988@redhat.com>
* Oleg Nesterov <oleg@redhat.com> wrote:
> Introduce "struct wait_opts" which holds the parameters for misc
> helpers in do_wait() pathes.
>
> This adds 17 lines to kernel/exit.c, but saves 256 bytes from .o
> and imho makes the code much more readable.
>
> (untested, not signed)
>
> kernel/exit.c | 211 +++++++++++++++++++++++++++++++---------------------------
> 1 file changed, 114 insertions(+), 97 deletions(-)
> +struct wait_opts {
> + enum pid_type wtype;
> + struct pid *wpid;
> + int wflags;
> +
> + struct siginfo __user *winfo;
> + int __user *wstat;
> + struct rusage __user *wrusage;
> +
> + int notask_error;
> +};
Nice idea!
One small nit with the definition above: when using vertical spacing
(which really looks nice) we tend to put the asterix to the type
itself, not to the variable. I.e.:
enum pid_type wtype;
struct pid * wpid;
int wflags;
( This is done to separate the field name from the type - the
pointer nature of the field is part of the type, not part of the
name. )
It's impressive how well the function prototypes get compressed and
cleaned up by this helper structure:
> -static int eligible_child(enum pid_type type, struct pid *pid, int options,
> - struct task_struct *p)
> +static int eligible_child(struct wait_opts *wopts, struct task_struct *p)
> -static int wait_noreap_copyout(struct task_struct *p, pid_t pid, uid_t uid,
> - int why, int status,
> - struct siginfo __user *infop,
> - struct rusage __user *rusagep)
> +static int wait_noreap_copyout(struct wait_opts *wopts, struct task_struct *p,
> + pid_t pid, uid_t uid, int why, int status)
> -static int wait_task_zombie(struct task_struct *p, int options,
> - struct siginfo __user *infop,
> - int __user *stat_addr, struct rusage __user *ru)
> +static int wait_task_zombie(struct wait_opts *wopts, struct task_struct *p)
> -static int wait_task_stopped(int ptrace, struct task_struct *p,
> - int options, struct siginfo __user *infop,
> - int __user *stat_addr, struct rusage __user *ru)
> +static int wait_task_stopped(struct wait_opts *wopts,
> + int ptrace, struct task_struct *p)
> -static int wait_task_continued(struct task_struct *p, int options,
> - struct siginfo __user *infop,
> - int __user *stat_addr, struct rusage __user *ru)
> +static int wait_task_continued(struct wait_opts *wopts, struct task_struct *p)
> -static int wait_consider_task(struct task_struct *parent, int ptrace,
> - struct task_struct *p, int *notask_error,
> - enum pid_type type, struct pid *pid, int options,
> - struct siginfo __user *infop,
> - int __user *stat_addr, struct rusage __user *ru)
> +static int wait_consider_task(struct wait_opts *wopts, struct task_struct *parent,
> + int ptrace, struct task_struct *p)
> -static int do_wait_thread(struct task_struct *tsk, int *notask_error,
> - enum pid_type type, struct pid *pid, int options,
> - struct siginfo __user *infop, int __user *stat_addr,
> - struct rusage __user *ru)
> +static int do_wait_thread(struct wait_opts *wopts, struct task_struct *tsk)
> -static int ptrace_do_wait(struct task_struct *tsk, int *notask_error,
> - enum pid_type type, struct pid *pid, int options,
> - struct siginfo __user *infop, int __user *stat_addr,
> - struct rusage __user *ru)
> +static int ptrace_do_wait(struct wait_opts *wopts, struct task_struct *tsk)
> -static long do_wait(enum pid_type type, struct pid *pid, int options,
> - struct siginfo __user *infop, int __user *stat_addr,
> - struct rusage __user *ru)
> +static long do_wait(struct wait_opts *wopts)
One small (style) detail here as well:
> - ret = do_wait(type, pid, options, infop, NULL, ru);
> +
> + wopts.wtype = type;
> + wopts.wpid = pid;
> + wopts.wflags = options;
> +
> + wopts.winfo = infop;
> + wopts.wstat = NULL;
> + wopts.wrusage = ru;
> +
> + ret = do_wait(&wopts);
it makes sense to write this as:
> + wopts.wtype = type;
> + wopts.wpid = pid;
> + wopts.wflags = options;
> +
> + wopts.winfo = infop;
> + wopts.wstat = NULL;
> + wopts.wrusage = ru;
> +
> + ret = do_wait(&wopts);
(and in other places as well). Vertical spacing for assignments
looks messy if done for 1-3 assignment lines, but in the case above
we've got 6 of them so it has a nice vertical structure already that
helps readability.
Regarding the patch itself: i guess we could do it as-is - but if
you think there's regression risks, a safer approach would be to
create 5-6 patches to build up all the structure parameters one by
one. Such a series is a lot easier to check (and a lot easier to
bisect to).
Anyway ... provided you give it some testing:
Reviewed-by: Ingo Molnar <mingo@elte.hu>
Ingo
next prev parent reply other threads:[~2009-05-06 7:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-06 5:33 [FOR REVIEW, PATCH 2/2] introduce "struct wait_opts" to simplify do_wait() pathes Oleg Nesterov
2009-05-06 7:27 ` Ingo Molnar [this message]
2009-05-07 6:41 ` Oleg Nesterov
2009-05-07 7:54 ` Ingo Molnar
2009-05-09 16:15 ` Oleg Nesterov
2009-05-11 10:53 ` Andy Whitcroft
2009-05-11 12:43 ` Ingo Molnar
2009-05-06 20:09 ` Roland McGrath
2009-05-07 6:45 ` Oleg Nesterov
2009-05-07 7:20 ` Roland McGrath
2009-05-07 7:40 ` Oleg Nesterov
2009-05-07 7:49 ` 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=20090506072756.GA17457@elte.hu \
--to=mingo@elte.hu \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=roland@redhat.com \
/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