On top of
        signal-rewrite-kill_something_info-so-it-uses-newer-helpers.patch

- Factor out sending PIDTYPE_PGID wide signals.

- Use is_init(p) instead of "p->pid > 1". We don't hash idle threads anymore,
  no need to worry about p->pid == 0.

- Use "p != current->group_leader" instead of "p->tgid != current->tgid",
  saves one dereference and kills yet another direct pid_t usage.

- Simplify return value calculation for "pid == -1" case, remove "retval"
  variable.

No functional changes.

Signed-off-by: Oleg Nesterov <[EMAIL PROTECTED]>

--- eric-mm1/kernel/signal.c~1_ksi      2006-12-16 20:57:58.000000000 +0300
+++ eric-mm1/kernel/signal.c    2006-12-16 22:08:43.000000000 +0300
@@ -1317,34 +1317,37 @@ EXPORT_SYMBOL_GPL(kill_pid_info_as_uid);
  * POSIX specifies that kill(-1,sig) is unspecified, but what we have
  * is probably wrong.  Should make it like BSD or SYSV.
  */
-
 static int kill_something_info(int sig, struct siginfo *info, int pid)
 {
        int ret;
-       rcu_read_lock();
-       if (!pid) {
-               ret = kill_pgrp_info(sig, info, task_pgrp(current));
-       } else if (pid == -1) {
-               int retval = 0, count = 0;
-               struct task_struct * p;
-
-               read_lock(&tasklist_lock);
-               for_each_process(p) {
-                       if (p->pid > 1 && p->tgid != current->tgid) {
-                               int err = group_send_sig_info(sig, info, p);
-                               ++count;
-                               if (err != -EPERM)
-                                       retval = err;
-                       }
-               }
-               read_unlock(&tasklist_lock);
-               ret = count ? retval : -ESRCH;
-       } else if (pid < 0) {
-               ret = kill_pgrp_info(sig, info, find_pid(-pid));
-       } else {
-               ret = kill_pid_info(sig, info, find_pid(pid));
-       }
-       rcu_read_unlock();
+
+       rcu_read_lock();
+       if (pid > 0) {
+               ret = kill_pid_info(sig, info, find_pid(pid));
+       } else if (pid == -1) {
+               struct task_struct *p;
+               int found = 0;
+
+               ret = 0;
+               read_lock(&tasklist_lock);
+               for_each_process(p)
+                       if (!is_init(p) && p != current->group_leader) {
+                               int err = group_send_sig_info(sig, info, p);
+                               if (err != -EPERM)
+                                       ret = err;
+                               found = 1;
+                       }
+               read_unlock(&tasklist_lock);
+               if (!found)
+                       ret = -ESRCH;
+       } else {
+               struct pid *grp = task_pgrp(current);
+               if (pid != 0)
+                       grp = find_pid(-pid);
+               ret = kill_pgrp_info(sig, info, grp);
+       }
+       rcu_read_unlock();
+
        return ret;
 }
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to