Messages in this thread Patch in this message | | | Date | Thu, 17 Aug 2023 17:47:43 +0200 | From | Oleg Nesterov <> | Subject | [PATCH] __kill_pgrp_info: simplify the calculation of return value |
| |
On 08/16, Eric W. Biederman wrote: > > > We should be consistent and ensure __kill_pgrp_info uses > > the same code pattern, otherwise it will be difficult to > > see they use the same logic.
Hmm, agreed.
Then I think we should change __kill_pgrp_info() first, then "copy" this pattern into kill_something_info() in a separate patch.
> > I think for both patterns the reader of the code is going to have to > > stop and think about what is going on to understand the logic.
Yes, although to me the current code looks less clear but this is subjective.
But I agree this needs a comment. How about the patch below?
From 753d4edd1f2f21f9f9181b9ff7394ed098d58ff6 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov <oleg@redhat.com> Date: Thu, 17 Aug 2023 17:38:55 +0200 Subject: [PATCH] __kill_pgrp_info: simplify the calculation of return value
No need to calculate/check the "success" variable, we can kill it and update retval in the main loop unless it is zero.
Suggested-by: David Laight <David.Laight@ACULAB.COM> Signed-off-by: Oleg Nesterov <oleg@redhat.com> --- kernel/signal.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c index 128e9bb3d1a2..c0acdfd4c81b 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1460,16 +1460,21 @@ int group_send_sig_info(int sig, struct kernel_siginfo *info, int __kill_pgrp_info(int sig, struct kernel_siginfo *info, struct pid *pgrp) { struct task_struct *p = NULL; - int retval, success; + int ret = -ESRCH; - success = 0; - retval = -ESRCH; do_each_pid_task(pgrp, PIDTYPE_PGID, p) { int err = group_send_sig_info(sig, info, p, PIDTYPE_PGID); - success |= !err; - retval = err; + /* + * If group_send_sig_info() succeeds at least once ret + * becomes 0 and after that the code below has no effect. + * Otherwise we return the last err or -ESRCH if this + * process group is empty. + */ + if (ret) + ret = err; } while_each_pid_task(pgrp, PIDTYPE_PGID, p); - return success ? 0 : retval; + + return ret; } int kill_pid_info(int sig, struct kernel_siginfo *info, struct pid *pid) -- 2.25.1.362.g51ebf55
| |