public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Unify sys_tkill() and sys_tgkill()
@ 2005-09-24  2:18 Vadim Lobanov
  2005-09-24 14:52 ` Jesper Juhl
  0 siblings, 1 reply; 7+ messages in thread
From: Vadim Lobanov @ 2005-09-24  2:18 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel

Hi,

The majority of the sys_tkill() and sys_tgkill() function code is
duplicated between the two of them. This patch pulls the duplication out
into a separate function -- do_tkill() -- and lets sys_tkill() and
sys_tgkill() be simple wrappers around it. This should make it easier to
maintain in light of future changes.

Diffed against 2.6.14-rc2.

Signed-off-by: Vadim Lobanov <vlobanov@speakeasy.net>

diff -Npru a/kernel/signal.c b/kernel/signal.c
--- a/kernel/signal.c	2005-09-22 18:32:48.000000000 -0700
+++ b/kernel/signal.c	2005-09-23 18:51:58.000000000 -0700
@@ -2262,26 +2262,13 @@ sys_kill(int pid, int sig)
 	return kill_something_info(sig, &info, pid);
 }

-/**
- *  sys_tgkill - send signal to one specific thread
- *  @tgid: the thread group ID of the thread
- *  @pid: the PID of the thread
- *  @sig: signal to be sent
- *
- *  This syscall also checks the tgid and returns -ESRCH even if the PID
- *  exists but it's not belonging to the target process anymore. This
- *  method solves the problem of threads exiting and PIDs getting reused.
- */
-asmlinkage long sys_tgkill(int tgid, int pid, int sig)
+static int do_tkill(int tgid, int pid, int sig)
 {
-	struct siginfo info;
 	int error;
+	struct siginfo info;
 	struct task_struct *p;

-	/* This is only valid for single tasks */
-	if (pid <= 0 || tgid <= 0)
-		return -EINVAL;
-
+	error = -ESRCH;
 	info.si_signo = sig;
 	info.si_errno = 0;
 	info.si_code = SI_TKILL;
@@ -2290,8 +2277,7 @@ asmlinkage long sys_tgkill(int tgid, int

 	read_lock(&tasklist_lock);
 	p = find_task_by_pid(pid);
-	error = -ESRCH;
-	if (p && (p->tgid == tgid)) {
+	if (p && ((tgid <= 0) || (p->tgid == tgid))) {
 		error = check_kill_permission(sig, &info, p);
 		/*
 		 * The null signal is a permissions and process existence
@@ -2305,47 +2291,40 @@ asmlinkage long sys_tgkill(int tgid, int
 		}
 	}
 	read_unlock(&tasklist_lock);
+
 	return error;
 }

+/**
+ *  sys_tgkill - send signal to one specific thread
+ *  @tgid: the thread group ID of the thread
+ *  @pid: the PID of the thread
+ *  @sig: signal to be sent
+ *
+ *  This syscall also checks the tgid and returns -ESRCH even if the PID
+ *  exists but it's not belonging to the target process anymore. This
+ *  method solves the problem of threads exiting and PIDs getting reused.
+ */
+asmlinkage long sys_tgkill(int tgid, int pid, int sig)
+{
+	/* This is only valid for single tasks */
+	if (pid <= 0 || tgid <= 0)
+		return -EINVAL;
+
+	return (do_tkill(tgid, pid, sig));
+}
+
 /*
  *  Send a signal to only one task, even if it's a CLONE_THREAD task.
  */
 asmlinkage long
 sys_tkill(int pid, int sig)
 {
-	struct siginfo info;
-	int error;
-	struct task_struct *p;
-
 	/* This is only valid for single tasks */
 	if (pid <= 0)
 		return -EINVAL;

-	info.si_signo = sig;
-	info.si_errno = 0;
-	info.si_code = SI_TKILL;
-	info.si_pid = current->tgid;
-	info.si_uid = current->uid;
-
-	read_lock(&tasklist_lock);
-	p = find_task_by_pid(pid);
-	error = -ESRCH;
-	if (p) {
-		error = check_kill_permission(sig, &info, p);
-		/*
-		 * The null signal is a permissions and process existence
-		 * probe.  No signal is actually delivered.
-		 */
-		if (!error && sig && p->sighand) {
-			spin_lock_irq(&p->sighand->siglock);
-			handle_stop_signal(sig, p);
-			error = specific_send_sig_info(sig, &info, p);
-			spin_unlock_irq(&p->sighand->siglock);
-		}
-	}
-	read_unlock(&tasklist_lock);
-	return error;
+	return (do_tkill(0, pid, sig));
 }

 asmlinkage long

^ permalink raw reply	[flat|nested] 7+ messages in thread
* Serious time drift - clock running fast
@ 2005-09-18 13:11 Marc Perkel
  0 siblings, 0 replies; 7+ messages in thread
From: Marc Perkel @ 2005-09-18 13:11 UTC (permalink / raw)
  To: LKML

Not sure what the problem is but it seem kernel related. If it's not - 
please forgive me.

I'm running and AMD Athlon 64 X2 on an Asus board with NVidia chipset. 
The software clock gains several seconds every minute. I'm running the 
2.6.13 kernel. NTPD doesn't help. It sets the time when it starts but I 
suspect the drift is too great for it to lock on. How can setting the 
clock be so hard?

Using these settings:

CONFIG_X86_64=y
CONFIG_64BIT=y
CONFIG_X86=y
CONFIG_MMU=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_X86_CMPXCHG=y
CONFIG_EARLY_PRINTK=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y

Falling asleep .... ZZZzzzzzZZZZzzzzzz

Help!


-- 
Marc Perkel - marc@perkel.com

Spam Filter: http://www.junkemailfilter.com
    My Blog: http://marc.perkel.com


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2005-09-24 19:15 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-24  2:18 [PATCH] Unify sys_tkill() and sys_tgkill() Vadim Lobanov
2005-09-24 14:52 ` Jesper Juhl
2005-09-24 16:03   ` Serious time drift - clock running fast Howard Chu
2005-09-24 16:38   ` [PATCH] Unify sys_tkill() and sys_tgkill() Jörn Engel
2005-09-24 19:15     ` Jesper Juhl
2005-09-24 17:47   ` Vadim Lobanov
  -- strict thread matches above, loose matches on Subject: below --
2005-09-18 13:11 Serious time drift - clock running fast Marc Perkel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox