[PATCH 1/2] kill_something_info: misc cleanups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux