rpms/kernel/devel patch-2.6.26-git13.bz2.sign, NONE, 1.1 .cvsignore, 1.877, 1.878 config-generic, 1.142, 1.143 config-powerpc-generic, 1.23, 1.24 config-x86-generic, 1.45, 1.46 config-x86_64-generic, 1.44, 1.45 kernel.spec, 1.804, 1.805 linux-2.6-powerpc-tracehook.patch, 1.1, 1.2 linux-2.6-sparc64-tracehook.patch, 1.1, 1.2 linux-2.6-tracehook.patch, 1.5, 1.6 linux-2.6-utrace.patch, 1.83, 1.84 linux-2.6-x86-tracehook.patch, 1.1, 1.2 sources, 1.838, 1.839 upstream, 1.755, 1.756 patch-2.6.26-git12.bz2.sign, 1.1, NONE

Roland McGrath (roland) fedora-extras-commits at redhat.com
Sat Jul 26 03:48:28 UTC 2008


Author: roland

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv30116

Modified Files:
	.cvsignore config-generic config-powerpc-generic 
	config-x86-generic config-x86_64-generic kernel.spec 
	linux-2.6-powerpc-tracehook.patch 
	linux-2.6-sparc64-tracehook.patch linux-2.6-tracehook.patch 
	linux-2.6-utrace.patch linux-2.6-x86-tracehook.patch sources 
	upstream 
Added Files:
	patch-2.6.26-git13.bz2.sign 
Removed Files:
	patch-2.6.26-git12.bz2.sign 
Log Message:
* Fri Jul 25 2008 Roland McGrath <roland at redhat.com>
- 2.6.26-git13
- utrace update



--- NEW FILE patch-2.6.26-git13.bz2.sign ---
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: See http://www.kernel.org/signature.html for info

iD8DBQBIiiN8yGugalF9Dw4RAsdqAJ9mrMLQB+RR0uwUFELc9JC9GKF2PwCglcek
V9etYb3apC5uuUhAuvHxsE8=
=h+gH
-----END PGP SIGNATURE-----


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/.cvsignore,v
retrieving revision 1.877
retrieving revision 1.878
diff -u -r1.877 -r1.878
--- .cvsignore	25 Jul 2008 16:21:10 -0000	1.877
+++ .cvsignore	26 Jul 2008 03:47:27 -0000	1.878
@@ -4,4 +4,4 @@
 temp-*
 kernel-2.6.26
 linux-2.6.26.tar.bz2
-patch-2.6.26-git12.bz2
+patch-2.6.26-git13.bz2


Index: config-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/config-generic,v
retrieving revision 1.142
retrieving revision 1.143
diff -u -r1.142 -r1.143
--- config-generic	25 Jul 2008 16:21:10 -0000	1.142
+++ config-generic	26 Jul 2008 03:47:28 -0000	1.143
@@ -420,6 +420,7 @@
 CONFIG_VIRTIO_BALLOON=m
 CONFIG_VIRTIO_NET=m
 CONFIG_HW_RANDOM_VIRTIO=m
+CONFIG_VIRTIO_CONSOLE=m
 
 #
 # SCSI device support
@@ -3631,3 +3632,6 @@
 # FIXME: This should be x86/ia64 only
 # CONFIG_HP_ILO is not set
 
+# CONFIG_GPIOLIB is not set
+
+CONFIG_HP_WMI=m


Index: config-powerpc-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/config-powerpc-generic,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- config-powerpc-generic	21 Jul 2008 19:45:13 -0000	1.23
+++ config-powerpc-generic	26 Jul 2008 03:47:28 -0000	1.24
@@ -248,8 +248,11 @@
 # CONFIG_MT9V022_PCA9536_SWITCH is not set
 # CONFIG_LEDS_GPIO is not set
 # CONFIG_KGDB_CONSOLE is not set
+# CONFIG_GPIO_SYSFS is not set
+# CONFIG_GPIO_MAX732X is not set
 
 CONFIG_MDIO_OF_GPIO=m
 
 CONFIG_SERIO_XILINX_XPS_PS2=m
 
+# CONFIG_PPC_SMLPAR is not set


Index: config-x86-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/config-x86-generic,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- config-x86-generic	25 Jul 2008 16:21:10 -0000	1.45
+++ config-x86-generic	26 Jul 2008 03:47:28 -0000	1.46
@@ -287,6 +287,7 @@
 CONFIG_EDAC_I82975X=m
 CONFIG_EDAC_I3000=m
 CONFIG_EDAC_I5000=m
+CONFIG_EDAC_I5100=m
 CONFIG_EDAC_R82600=m
 
 CONFIG_SCHED_MC=y


Index: config-x86_64-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/config-x86_64-generic,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- config-x86_64-generic	25 Jul 2008 16:21:10 -0000	1.44
+++ config-x86_64-generic	26 Jul 2008 03:47:28 -0000	1.45
@@ -179,6 +179,7 @@
 CONFIG_EDAC_E7XXX=m
 CONFIG_EDAC_E752X=m
 CONFIG_EDAC_I5000=m
+CONFIG_EDAC_I5100=m
 CONFIG_EDAC_I82875P=m
 CONFIG_EDAC_I82860=m
 CONFIG_EDAC_I82975X=m


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.804
retrieving revision 1.805
diff -u -r1.804 -r1.805
--- kernel.spec	25 Jul 2008 16:21:10 -0000	1.804
+++ kernel.spec	26 Jul 2008 03:47:28 -0000	1.805
@@ -45,7 +45,7 @@
 # The rc snapshot level
 %define rcrev 0
 # The git snapshot level
-%define gitrev 12
+%define gitrev 13
 # Set rpm version accordingly
 %define rpmversion 2.6.%{upstream_sublevel}
 %endif
@@ -1696,6 +1696,13 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Fri Jul 25 2008 Roland McGrath <roland at redhat.com>
+- 2.6.26-git13
+- utrace update
+
+* Fri Jul 25 2008 unknown <roland at fedoraproject.org>
+- 2.6.26-git13
+
 * Fri Jul 25 2008 Dave Jones <davej at redhat.com>
 - 2.6.26-git12
 

linux-2.6-powerpc-tracehook.patch:

Index: linux-2.6-powerpc-tracehook.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-powerpc-tracehook.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-powerpc-tracehook.patch	24 Jul 2008 08:28:26 -0000	1.1
+++ linux-2.6-powerpc-tracehook.patch	26 Jul 2008 03:47:28 -0000	1.2
@@ -10,10 +10,10 @@
  9 files changed, 169 insertions(+), 37 deletions(-)
 
 diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
-index 737ebf9..8f2c5c7 100644  
+index fe88418..587da5e 100644  
 --- a/arch/powerpc/Kconfig
 +++ b/arch/powerpc/Kconfig
-@@ -114,6 +114,7 @@ config PPC
+@@ -117,6 +117,7 @@ config PPC
  	select HAVE_KPROBES
  	select HAVE_ARCH_KGDB
  	select HAVE_KRETPROBES
@@ -22,7 +22,7 @@
  	select HAVE_DMA_ATTRS if PPC64
  	select USE_GENERIC_SMP_HELPERS if SMP
 diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
-index da52269..1cbbf70 100644  
+index 81c8324..3e7445e 100644  
 --- a/arch/powerpc/kernel/entry_32.S
 +++ b/arch/powerpc/kernel/entry_32.S
 @@ -343,7 +343,12 @@ syscall_dotrace:
@@ -79,7 +79,7 @@
  	b	.ret_from_except
  
 diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
-index 8feb93e..a704603 100644  
+index a5d0e78..9171316 100644  
 --- a/arch/powerpc/kernel/ptrace.c
 +++ b/arch/powerpc/kernel/ptrace.c
 @@ -22,6 +22,7 @@
@@ -91,7 +91,7 @@
  #include <linux/user.h>
  #include <linux/security.h>
 @@ -706,12 +707,29 @@ void user_enable_single_step(struct task
- 		task->thread.dbcr0 = DBCR0_IDM | DBCR0_IC;
+ 		task->thread.dbcr0 |= DBCR0_IDM | DBCR0_IC;
  		regs->msr |= MSR_DE;
  #else
 +		regs->msr &= ~MSR_BE;
@@ -120,8 +120,8 @@
  void user_disable_single_step(struct task_struct *task)
  {
  	struct pt_regs *regs = task->thread.regs;
-@@ -721,7 +739,7 @@ void user_disable_single_step(struct tas
- 		task->thread.dbcr0 = 0;
+@@ -728,7 +746,7 @@ void user_disable_single_step(struct tas
+ 		task->thread.dbcr0 &= ~(DBCR0_IC | DBCR0_IDM);
  		regs->msr &= ~MSR_DE;
  #else
 -		regs->msr &= ~MSR_SE;
@@ -129,7 +129,7 @@
  #endif
  	}
  	clear_tsk_thread_flag(task, TIF_SINGLESTEP);
-@@ -953,31 +971,24 @@ long arch_ptrace(struct task_struct *chi
+@@ -1013,31 +1031,24 @@ long arch_ptrace(struct task_struct *chi
  	return ret;
  }
  
@@ -175,7 +175,7 @@
  
  	if (unlikely(current->audit_context)) {
  #ifdef CONFIG_PPC64
-@@ -995,16 +1006,19 @@ void do_syscall_trace_enter(struct pt_re
+@@ -1055,16 +1066,19 @@ void do_syscall_trace_enter(struct pt_re
  					    regs->gpr[5] & 0xffffffff,
  					    regs->gpr[6] & 0xffffffff);
  	}
@@ -200,7 +200,7 @@
 +		tracehook_report_syscall_exit(regs, step);
  }
 diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
-index ad55488..e032336 100644  
+index 7aada78..060d2a8 100644  
 --- a/arch/powerpc/kernel/signal.c
 +++ b/arch/powerpc/kernel/signal.c
 @@ -9,7 +9,7 @@
@@ -221,7 +221,7 @@
  {
  	siginfo_t info;
  	int signr;
-@@ -173,11 +173,28 @@ int do_signal(sigset_t *oldset, struct p
+@@ -177,11 +177,28 @@ int do_signal(sigset_t *oldset, struct p
  		 * its frame, and we can clear the TLF_RESTORE_SIGMASK flag.
  		 */
  		current_thread_info()->local_flags &= ~_TLF_RESTORE_SIGMASK;
@@ -384,10 +384,10 @@
 +
 +#endif	/* _ASM_SYSCALL_H */
 diff --git a/include/asm-powerpc/thread_info.h b/include/asm-powerpc/thread_info.h
-index b705c2a..a52d62e 100644  
+index a9db562..9665a26 100644  
 --- a/include/asm-powerpc/thread_info.h
 +++ b/include/asm-powerpc/thread_info.h
-@@ -116,6 +116,7 @@ static inline struct thread_info *curren
+@@ -108,6 +108,7 @@ static inline struct thread_info *curren
  #define TIF_SECCOMP		10	/* secure computing */
  #define TIF_RESTOREALL		11	/* Restore all regs (implies NOERROR) */
  #define TIF_NOERROR		12	/* Force successful syscall return */
@@ -395,7 +395,7 @@
  #define TIF_FREEZE		14	/* Freezing for suspend */
  #define TIF_RUNLATCH		15	/* Is the runlatch enabled? */
  #define TIF_ABI_PENDING		16	/* 32/64 bit switch needed */
-@@ -133,12 +134,14 @@ static inline struct thread_info *curren
+@@ -125,12 +126,14 @@ static inline struct thread_info *curren
  #define _TIF_SECCOMP		(1<<TIF_SECCOMP)
  #define _TIF_RESTOREALL		(1<<TIF_RESTOREALL)
  #define _TIF_NOERROR		(1<<TIF_NOERROR)

linux-2.6-sparc64-tracehook.patch:

Index: linux-2.6-sparc64-tracehook.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-sparc64-tracehook.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-sparc64-tracehook.patch	24 Jul 2008 08:28:26 -0000	1.1
+++ linux-2.6-sparc64-tracehook.patch	26 Jul 2008 03:47:28 -0000	1.2
@@ -250,10 +250,10 @@
 +
 +#endif	/* _ASM_SYSCALL_H */
 diff --git a/include/asm-sparc/thread_info_64.h b/include/asm-sparc/thread_info_64.h
-index c6d2e6c..0ddf16b 100644  
+index 960969d..c0a737d 100644  
 --- a/include/asm-sparc/thread_info_64.h
 +++ b/include/asm-sparc/thread_info_64.h
-@@ -217,7 +217,7 @@ register struct thread_info *current_thr
+@@ -219,7 +219,7 @@ register struct thread_info *current_thr
   *	 nop
   */
  #define TIF_SYSCALL_TRACE	0	/* syscall trace active */
@@ -262,7 +262,7 @@
  #define TIF_SIGPENDING		2	/* signal pending */
  #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
  #define TIF_PERFCTR		4	/* performance counters active */
-@@ -237,6 +237,7 @@ register struct thread_info *current_thr
+@@ -239,6 +239,7 @@ register struct thread_info *current_thr
  #define TIF_POLLING_NRFLAG	14
  
  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
@@ -270,7 +270,7 @@
  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
  #define _TIF_PERFCTR		(1<<TIF_PERFCTR)
-@@ -248,8 +249,9 @@ register struct thread_info *current_thr
+@@ -250,8 +251,9 @@ register struct thread_info *current_thr
  #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
  
  #define _TIF_USER_WORK_MASK	((0xff << TI_FLAG_WSAVED_SHIFT) | \

linux-2.6-tracehook.patch:

Index: linux-2.6-tracehook.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-tracehook.patch,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- linux-2.6-tracehook.patch	24 Jul 2008 08:28:26 -0000	1.5
+++ linux-2.6-tracehook.patch	26 Jul 2008 03:47:28 -0000	1.6
@@ -12,7 +12,7 @@
  include/asm-generic/syscall.h |  141 ++++++++++
  include/linux/ptrace.h        |   72 +++++
  include/linux/sched.h         |   10 +-
- include/linux/tracehook.h     |  575 +++++++++++++++++++++++++++++++++++++++++
+ include/linux/tracehook.h     |  576 +++++++++++++++++++++++++++++++++++++++++
  kernel/exit.c                 |   53 ++---
  kernel/fork.c                 |   74 ++----
  kernel/kthread.c              |    2 +-
@@ -23,13 +23,13 @@
  lib/syscall.c                 |   75 ++++++
  mm/nommu.c                    |    4 +-
  security/selinux/hooks.c      |   22 +--
- 25 files changed, 1084 insertions(+), 188 deletions(-)
+ 25 files changed, 1085 insertions(+), 188 deletions(-)
 
 diff --git a/arch/Kconfig b/arch/Kconfig
-index ad89a33..4641edf 100644  
+index b0fabfa..364c6da 100644  
 --- a/arch/Kconfig
 +++ b/arch/Kconfig
-@@ -37,6 +37,24 @@ config HAVE_KPROBES
+@@ -59,6 +59,24 @@ config HAVE_KPROBES
  config HAVE_KRETPROBES
  	def_bool n
  
@@ -111,10 +111,10 @@
  }
  
 diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
-index 639d2d8..fcfe706 100644  
+index 3b6ff85..655ed8d 100644  
 --- a/fs/binfmt_elf.c
 +++ b/fs/binfmt_elf.c
-@@ -975,12 +975,6 @@ static int load_elf_binary(struct linux_
+@@ -1003,12 +1003,6 @@ static int load_elf_binary(struct linux_
  #endif
  
  	start_thread(regs, elf_entry, bprm->p);
@@ -128,7 +128,7 @@
  out:
  	kfree(loc);
 diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
-index d051a32..1280d5d 100644  
+index 1b59b1e..fdeadab 100644  
 --- a/fs/binfmt_elf_fdpic.c
 +++ b/fs/binfmt_elf_fdpic.c
 @@ -433,13 +433,6 @@ static int load_elf_fdpic_binary(struct 
@@ -173,10 +173,10 @@
  
  	/* error cleanup */
 diff --git a/fs/exec.c b/fs/exec.c
-index fd92343..346db53 100644  
+index 5e55901..b8792a1 100644  
 --- a/fs/exec.c
 +++ b/fs/exec.c
-@@ -43,7 +43,6 @@
+@@ -42,13 +42,13 @@
  #include <linux/module.h>
  #include <linux/namei.h>
  #include <linux/proc_fs.h>
@@ -184,7 +184,6 @@
  #include <linux/mount.h>
  #include <linux/security.h>
  #include <linux/syscalls.h>
-@@ -51,6 +50,7 @@
  #include <linux/tsacct_kern.h>
  #include <linux/cn_proc.h>
  #include <linux/audit.h>
@@ -192,7 +191,7 @@
  
  #include <asm/uaccess.h>
  #include <asm/mmu_context.h>
-@@ -1075,13 +1075,8 @@ EXPORT_SYMBOL(prepare_binprm);
+@@ -1071,13 +1071,8 @@ EXPORT_SYMBOL(prepare_binprm);
  
  static int unsafe_exec(struct task_struct *p)
  {
@@ -208,7 +207,7 @@
  	if (atomic_read(&p->fs->count) > 1 ||
  	    atomic_read(&p->files->count) > 1 ||
  	    atomic_read(&p->sighand->count) > 1)
-@@ -1218,6 +1213,7 @@ int search_binary_handler(struct linux_b
+@@ -1214,6 +1209,7 @@ int search_binary_handler(struct linux_b
  			read_unlock(&binfmt_lock);
  			retval = fn(bprm, regs);
  			if (retval >= 0) {
@@ -244,7 +243,7 @@
  		"State:\t%s\n"
  		"Tgid:\t%d\n"
 diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 58c3e6a..6c950c7 100644  
+index a891fe4..81bce67 100644  
 --- a/fs/proc/base.c
 +++ b/fs/proc/base.c
 @@ -69,6 +69,7 @@
@@ -301,7 +300,7 @@
  /************************************************************************/
  /*                       Here the fs part begins                        */
  /************************************************************************/
-@@ -2420,6 +2445,9 @@ static const struct pid_entry tgid_base_
+@@ -2473,6 +2498,9 @@ static const struct pid_entry tgid_base_
  #ifdef CONFIG_SCHED_DEBUG
  	REG("sched",      S_IRUGO|S_IWUSR, pid_sched),
  #endif
@@ -311,7 +310,7 @@
  	INF("cmdline",    S_IRUGO, pid_cmdline),
  	ONE("stat",       S_IRUGO, tgid_stat),
  	ONE("statm",      S_IRUGO, pid_statm),
-@@ -2752,6 +2780,9 @@ static const struct pid_entry tid_base_s
+@@ -2805,6 +2833,9 @@ static const struct pid_entry tid_base_s
  #ifdef CONFIG_SCHED_DEBUG
  	REG("sched",     S_IRUGO|S_IWUSR, pid_sched),
  #endif
@@ -559,10 +558,10 @@
  
  #endif
 diff --git a/include/linux/sched.h b/include/linux/sched.h
-index dc7e592..fdcd427 100644  
+index 42036ff..99036d5 100644  
 --- a/include/linux/sched.h
 +++ b/include/linux/sched.h
-@@ -1795,7 +1795,7 @@ extern int kill_pid_info_as_uid(int, str
+@@ -1797,7 +1797,7 @@ extern int kill_pid_info_as_uid(int, str
  extern int kill_pgrp(struct pid *pid, int sig, int priv);
  extern int kill_pid(struct pid *pid, int sig, int priv);
  extern int kill_proc_info(int, struct siginfo *, pid_t);
@@ -571,7 +570,7 @@
  extern void force_sig(int, struct task_struct *);
  extern void force_sig_specific(int, struct task_struct *);
  extern int send_sig(int, struct task_struct *, int);
-@@ -1882,9 +1882,13 @@ extern void set_task_comm(struct task_st
+@@ -1883,9 +1883,13 @@ extern void set_task_comm(struct task_st
  extern char *get_task_comm(char *to, struct task_struct *tsk);
  
  #ifdef CONFIG_SMP
@@ -589,10 +588,10 @@
  #define next_task(p)	list_entry(rcu_dereference((p)->tasks.next), struct task_struct, tasks)
 diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
 new file mode 100644
-index ...589f429 100644  
+index ...b187558 100644  
 --- /dev/null
 +++ b/include/linux/tracehook.h
-@@ -0,0 +1,575 @@
+@@ -0,0 +1,576 @@
 +/*
 + * Tracing hooks
 + *
@@ -839,7 +838,7 @@
 + * tracehook_finish_clone - new child created and being attached
 + * @child:		new child task
 + * @clone_flags:	%CLONE_* flags from clone/fork/vfork system call
-+ * @trace:		return value from tracehook_clone_prepare()
++ * @trace:		return value from tracehook_prepare_clone()
 + *
 + * This is called immediately after adding @child to its parent's children list.
 + * The @trace value is that returned by tracehook_prepare_clone().
@@ -854,19 +853,20 @@
 +
 +/**
 + * tracehook_report_clone - in parent, new child is about to start running
-+ * @trace:		return value from tracehook_clone_prepare()
++ * @trace:		return value from tracehook_prepare_clone()
 + * @regs:		parent's user register state
 + * @clone_flags:	flags from parent's system call
 + * @pid:		new child's PID in the parent's namespace
 + * @child:		new child task
 + *
-+ * Called after a child is set up, but before it has been started running.
-+ * The @trace value is that returned by tracehook_clone_prepare().
-+ * This is not a good place to block, because the child has not started yet.
-+ * Suspend the child here if desired, and block in tracehook_clone_complete().
-+ * This must prevent the child from self-reaping if tracehook_clone_complete()
-+ * uses the @child pointer; otherwise it might have died and been released by
-+ * the time tracehook_report_clone_complete() is called.
++ * Called after a child is set up, but before it has been started
++ * running.  @trace is the value returned by tracehook_prepare_clone().
++ * This is not a good place to block, because the child has not started
++ * yet.  Suspend the child here if desired, and then block in
++ * tracehook_report_clone_complete().  This must prevent the child from
++ * self-reaping if tracehook_report_clone_complete() uses the @child
++ * pointer; otherwise it might have died and been released by the time
++ * tracehook_report_report_clone_complete() is called.
 + *
 + * Called with no locks held, but the child cannot run until this returns.
 + */
@@ -885,7 +885,7 @@
 +
 +/**
 + * tracehook_report_clone_complete - new child is running
-+ * @trace:		return value from tracehook_clone_prepare()
++ * @trace:		return value from tracehook_prepare_clone()
 + * @regs:		parent's user register state
 + * @clone_flags:	flags from parent's system call
 + * @pid:		new child's PID in the parent's namespace
@@ -942,7 +942,7 @@
 +}
 +
 +/**
-+ * tracehook_finish_release_task - task is being reaped, clean up tracing
++ * tracehook_finish_release_task - final tracing clean-up
 + * @task:		task in %EXIT_DEAD state
 + *
 + * This is called in release_task() when @task is being in the middle of
@@ -1169,7 +1169,7 @@
 +
 +#endif	/* <linux/tracehook.h> */
 diff --git a/kernel/exit.c b/kernel/exit.c
-index 93d2711..78c6307 100644  
+index ad933bb..6cdf607 100644  
 --- a/kernel/exit.c
 +++ b/kernel/exit.c
 @@ -46,6 +46,7 @@
@@ -1180,7 +1180,7 @@
  
  #include <asm/uaccess.h>
  #include <asm/unistd.h>
-@@ -152,27 +153,17 @@ static void delayed_put_task_struct(stru
+@@ -162,27 +163,17 @@ static void delayed_put_task_struct(stru
  	put_task_struct(container_of(rhp, struct task_struct, rcu));
  }
  
@@ -1210,7 +1210,7 @@
  	__exit_signal(p);
  
  	/*
-@@ -194,6 +185,13 @@ repeat:
+@@ -204,6 +195,13 @@ repeat:
  		 * that case.
  		 */
  		zap_leader = task_detached(leader);
@@ -1224,7 +1224,7 @@
  	}
  
  	write_unlock_irq(&tasklist_lock);
-@@ -863,7 +861,8 @@ static void forget_original_parent(struc
+@@ -887,7 +885,8 @@ static void forget_original_parent(struc
   */
  static void exit_notify(struct task_struct *tsk, int group_dead)
  {
@@ -1234,7 +1234,7 @@
  
  	/*
  	 * This does two things:
-@@ -900,22 +899,11 @@ static void exit_notify(struct task_stru
+@@ -924,22 +923,11 @@ static void exit_notify(struct task_stru
  	    !capable(CAP_KILL))
  		tsk->exit_signal = SIGCHLD;
  
@@ -1262,7 +1262,7 @@
  
  	/* mt-exec, de_thread() is waiting for us */
  	if (thread_group_leader(tsk) &&
-@@ -925,8 +913,10 @@ static void exit_notify(struct task_stru
+@@ -949,8 +937,10 @@ static void exit_notify(struct task_stru
  
  	write_unlock_irq(&tasklist_lock);
  
@@ -1274,7 +1274,7 @@
  		release_task(tsk);
  }
  
-@@ -1005,10 +995,7 @@ NORET_TYPE void do_exit(long code)
+@@ -1029,10 +1019,7 @@ NORET_TYPE void do_exit(long code)
  	if (unlikely(!tsk->pid))
  		panic("Attempted to kill the idle task!");
  
@@ -1287,10 +1287,10 @@
  	/*
  	 * We're taking recursive faults here in do_exit. Safest is to just
 diff --git a/kernel/fork.c b/kernel/fork.c
-index adefc11..5345b7d 100644  
+index b99d73e..ad16f32 100644  
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -55,6 +55,7 @@
+@@ -56,6 +56,7 @@
  #include <linux/tty.h>
  #include <linux/proc_fs.h>
  #include <linux/blkdev.h>
@@ -1298,7 +1298,7 @@
  
  #include <asm/pgtable.h>
  #include <asm/pgalloc.h>
-@@ -833,8 +834,7 @@ static void copy_flags(unsigned long clo
+@@ -865,8 +866,7 @@ static void copy_flags(unsigned long clo
  
  	new_flags &= ~PF_SUPERPRIV;
  	new_flags |= PF_FORKNOEXEC;
@@ -1308,7 +1308,7 @@
  	p->flags = new_flags;
  	clear_freeze_flag(p);
  }
-@@ -875,7 +875,8 @@ static struct task_struct *copy_process(
+@@ -907,7 +907,8 @@ static struct task_struct *copy_process(
  					struct pt_regs *regs,
  					unsigned long stack_size,
  					int __user *child_tidptr,
@@ -1318,7 +1318,7 @@
  {
  	int retval;
  	struct task_struct *p;
-@@ -1125,8 +1126,6 @@ static struct task_struct *copy_process(
+@@ -1163,8 +1164,6 @@ static struct task_struct *copy_process(
  	 */
  	p->group_leader = p;
  	INIT_LIST_HEAD(&p->thread_group);
@@ -1327,7 +1327,7 @@
  
  	/* Now that the task is set up, run cgroup callbacks if
  	 * necessary. We need to run them before the task is visible
-@@ -1157,7 +1156,6 @@ static struct task_struct *copy_process(
+@@ -1195,7 +1194,6 @@ static struct task_struct *copy_process(
  		p->real_parent = current->real_parent;
  	else
  		p->real_parent = current;
@@ -1335,7 +1335,7 @@
  
  	spin_lock(&current->sighand->siglock);
  
-@@ -1199,8 +1197,7 @@ static struct task_struct *copy_process(
+@@ -1237,8 +1235,7 @@ static struct task_struct *copy_process(
  
  	if (likely(p->pid)) {
  		list_add_tail(&p->sibling, &p->real_parent->children);
@@ -1345,7 +1345,7 @@
  
  		if (thread_group_leader(p)) {
  			if (clone_flags & CLONE_NEWPID)
-@@ -1285,29 +1282,13 @@ struct task_struct * __cpuinit fork_idle
+@@ -1323,29 +1320,13 @@ struct task_struct * __cpuinit fork_idle
  	struct pt_regs regs;
  
  	task = copy_process(CLONE_VM, 0, idle_regs(&regs), 0, NULL,
@@ -1376,7 +1376,7 @@
  /*
   *  Ok, this is the main fork-routine.
   *
-@@ -1342,14 +1323,14 @@ long do_fork(unsigned long clone_flags,
+@@ -1380,14 +1361,14 @@ long do_fork(unsigned long clone_flags,
  		}
  	}
  
@@ -1397,7 +1397,7 @@
  	/*
  	 * Do this prior waking up the new thread - the thread pointer
  	 * might get invalid after that point, if the thread exits quickly.
-@@ -1367,32 +1348,35 @@ long do_fork(unsigned long clone_flags,
+@@ -1405,32 +1386,35 @@ long do_fork(unsigned long clone_flags,
  			init_completion(&vfork);
  		}
  
@@ -1448,7 +1448,7 @@
  	} else {
  		nr = PTR_ERR(p);
 diff --git a/kernel/kthread.c b/kernel/kthread.c
-index ac3fb73..88538db 100644  
+index 6111c27..96cff2f 100644  
 --- a/kernel/kthread.c
 +++ b/kernel/kthread.c
 @@ -176,7 +176,7 @@ void kthread_bind(struct task_struct *k,
@@ -1474,7 +1474,7 @@
  	/* All systems go.. */
  	return ret;
 diff --git a/kernel/sched.c b/kernel/sched.c
-index 6acf749..dfb65bd 100644  
+index 0047bd9..efc615f 100644  
 --- a/kernel/sched.c
 +++ b/kernel/sched.c
 @@ -1867,16 +1867,24 @@ migrate_task(struct task_struct *p, int 
@@ -1548,7 +1548,7 @@
  
  /***
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 6c0958e..44b5823 100644  
+index 82c3545..954f77d 100644  
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -22,6 +22,7 @@
@@ -1633,7 +1633,7 @@
  }
  
  
-@@ -600,9 +607,6 @@ static int check_kill_permission(int sig
+@@ -591,9 +598,6 @@ static int check_kill_permission(int sig
  	return security_task_kill(t, info, sig, 0);
  }
  
@@ -1643,7 +1643,7 @@
  /*
   * Handle magic process-wide effects of stop/continue signals. Unlike
   * the signal actions, these happen immediately at signal-generation
-@@ -765,7 +769,8 @@ static void complete_signal(int sig, str
+@@ -756,7 +760,8 @@ static void complete_signal(int sig, str
  	if (sig_fatal(p, sig) &&
  	    !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) &&
  	    !sigismember(&t->real_blocked, sig) &&
@@ -1653,7 +1653,7 @@
  		/*
  		 * This signal will be fatal to the whole group.
  		 */
-@@ -1343,9 +1348,11 @@ static inline void __wake_up_parent(stru
+@@ -1323,9 +1328,11 @@ static inline void __wake_up_parent(stru
  /*
   * Let a parent know about the death of a child.
   * For a stopped/continued status change, use do_notify_parent_cldstop instead.
@@ -1667,7 +1667,7 @@
  {
  	struct siginfo info;
  	unsigned long flags;
-@@ -1417,12 +1424,14 @@ void do_notify_parent(struct task_struct
+@@ -1396,12 +1403,14 @@ void do_notify_parent(struct task_struct
  		 */
  		tsk->exit_signal = -1;
  		if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN)
@@ -1683,7 +1683,7 @@
  }
  
  static void do_notify_parent_cldstop(struct task_struct *tsk, int why)
-@@ -1623,7 +1632,7 @@ finish_stop(int stop_count)
+@@ -1599,7 +1608,7 @@ finish_stop(int stop_count)
  	 * a group stop in progress and we are the last to stop,
  	 * report to the parent.  When ptraced, every thread reports itself.
  	 */
@@ -1692,7 +1692,7 @@
  		read_lock(&tasklist_lock);
  		do_notify_parent_cldstop(current, CLD_STOPPED);
  		read_unlock(&tasklist_lock);
-@@ -1760,6 +1769,9 @@ relock:
+@@ -1735,6 +1744,9 @@ relock:
  		signal->flags &= ~SIGNAL_CLD_MASK;
  		spin_unlock_irq(&sighand->siglock);
  
@@ -1702,7 +1702,7 @@
  		read_lock(&tasklist_lock);
  		do_notify_parent_cldstop(current->group_leader, why);
  		read_unlock(&tasklist_lock);
-@@ -1773,17 +1785,33 @@ relock:
+@@ -1748,17 +1760,33 @@ relock:
  		    do_signal_stop(0))
  			goto relock;
  
@@ -1743,7 +1743,7 @@
  		if (ka->sa.sa_handler == SIG_IGN) /* Do nothing.  */
  			continue;
  		if (ka->sa.sa_handler != SIG_DFL) {
-@@ -1831,7 +1859,7 @@ relock:
+@@ -1806,7 +1834,7 @@ relock:
  				spin_lock_irq(&sighand->siglock);
  			}
  
@@ -1752,7 +1752,7 @@
  				/* It released the siglock.  */
  				goto relock;
  			}
-@@ -1852,7 +1880,7 @@ relock:
+@@ -1827,7 +1855,7 @@ relock:
  
  		if (sig_kernel_coredump(signr)) {
  			if (print_fatal_signals)
@@ -1761,7 +1761,7 @@
  			/*
  			 * If it was able to dump core, this kills all
  			 * other threads in the group and synchronizes with
-@@ -1861,13 +1889,13 @@ relock:
+@@ -1836,13 +1864,13 @@ relock:
  			 * first and our do_group_exit call below will use
  			 * that value and ignore the one we pass it.
  			 */
@@ -1777,7 +1777,7 @@
  		/* NOTREACHED */
  	}
  	spin_unlock_irq(&sighand->siglock);
-@@ -1909,7 +1937,7 @@ void exit_signals(struct task_struct *ts
+@@ -1884,7 +1912,7 @@ void exit_signals(struct task_struct *ts
  out:
  	spin_unlock_irq(&tsk->sighand->siglock);
  
@@ -1786,15 +1786,15 @@
  		read_lock(&tasklist_lock);
  		do_notify_parent_cldstop(tsk, CLD_STOPPED);
  		read_unlock(&tasklist_lock);
-@@ -1921,7 +1949,6 @@ EXPORT_SYMBOL_GPL(dequeue_signal);
+@@ -1895,7 +1923,6 @@ EXPORT_SYMBOL(recalc_sigpending);
+ EXPORT_SYMBOL_GPL(dequeue_signal);
  EXPORT_SYMBOL(flush_signals);
  EXPORT_SYMBOL(force_sig);
- EXPORT_SYMBOL(kill_proc);
 -EXPORT_SYMBOL(ptrace_notify);
  EXPORT_SYMBOL(send_sig);
  EXPORT_SYMBOL(send_sig_info);
  EXPORT_SYMBOL(sigprocmask);
-@@ -2325,7 +2352,7 @@ int do_sigaction(int sig, struct k_sigac
+@@ -2299,7 +2326,7 @@ int do_sigaction(int sig, struct k_sigac
  		 *   (for example, SIGCHLD), shall cause the pending signal to
  		 *   be discarded, whether or not it is blocked"
  		 */
@@ -1804,7 +1804,7 @@
  			sigaddset(&mask, sig);
  			rm_from_queue_full(&mask, &t->signal->shared_pending);
 diff --git a/lib/Makefile b/lib/Makefile
-index 818c4d4..c0bad7f 100644  
+index 9085ad6..942c725 100644  
 --- a/lib/Makefile
 +++ b/lib/Makefile
 @@ -78,6 +78,8 @@ lib-$(CONFIG_GENERIC_BUG) += bug.o

linux-2.6-utrace.patch:

Index: linux-2.6-utrace.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-utrace.patch,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -r1.83 -r1.84
--- linux-2.6-utrace.patch	24 Jul 2008 08:28:26 -0000	1.83
+++ linux-2.6-utrace.patch	26 Jul 2008 03:47:28 -0000	1.84
@@ -4,13 +4,13 @@
  include/linux/ptrace.h            |   21 +
  include/linux/sched.h             |    6 +
  include/linux/tracehook.h         |   62 +
- include/linux/utrace.h            |  610 ++++++++++
+ include/linux/utrace.h            |  616 ++++++++++
  init/Kconfig                      |   27 +
  kernel/Makefile                   |    1 +
- kernel/ptrace.c                   |  578 ++++++++++-
+ kernel/ptrace.c                   |  578 +++++++++-
  kernel/signal.c                   |   14 +-
- kernel/utrace.c                   | 2278 +++++++++++++++++++++++++++++++++++++
- 12 files changed, 4070 insertions(+), 7 deletions(-)
+ kernel/utrace.c                   | 2325 +++++++++++++++++++++++++++++++++++++
+ 12 files changed, 4123 insertions(+), 7 deletions(-)
 
 diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile
 index 0eb0d02..49a78b7 100644  
@@ -27,7 +27,7 @@
  	    gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
 diff --git a/Documentation/DocBook/utrace.tmpl b/Documentation/DocBook/utrace.tmpl
 new file mode 100644
-index ...3e47524 100644  
+index ...df6b6ba 100644  
 --- /dev/null
 +++ b/Documentation/DocBook/utrace.tmpl
 @@ -0,0 +1,475 @@
@@ -132,7 +132,7 @@
 +    from small delays due to the overhead of tracing, to arbitrary
 +    pauses in user code execution when a user stops a thread with a
 +    debugger for examination.)  Even when you explicitly want the
-+    pertrubation of making the traced thread block, just blocking
++    perturbation of making the traced thread block, just blocking
 +    directly in your callback has more unwanted effects.  For example,
 +    the <constant>CLONE</constant> event callbacks are called when the
 +    new child thread has been created but not yet started running; the
@@ -179,7 +179,7 @@
 +
 +  </sect1>
 +
-+  <sect1 id="teardown"><title>Teardown Races</title>
++  <sect1 id="teardown"><title>Tear-down Races</title>
 +
 +  <para>
 +    Ordinarily synchronization issues for tracing engines are kept fairly
@@ -226,7 +226,7 @@
 +    <application>utrace</application> infrastructure provides some special
 +    guarantees about the <function>report_death</function> and
 +    <function>report_reap</function> callbacks.  It still takes some care
-+    to be sure your tracing engine is robust to teardown races, but these
++    to be sure your tracing engine is robust to tear-down races, but these
 +    rules make it reasonably straightforward and concise to handle a lot of
 +    corner cases correctly.
 +  </para>
@@ -280,7 +280,7 @@
 +    The final sort of guarantee is that a tracing engine will know for sure
 +    whether or not the <function>report_death</function> and/or
 +    <function>report_reap</function> callbacks will be made for a certain
-+    thread.  These teardown races are disambiguated by the error return
++    thread.  These tear-down races are disambiguated by the error return
 +    values of <function>utrace_set_events</function> and
 +    <function>utrace_control</function>.  Normally
 +    <function>utrace_control</function> called with
@@ -403,7 +403,7 @@
 +<sect1 id="syscall"><title><filename>System Call Tracing</filename></title>
 +
 +<para>
-+  The arch API for syscall information is declared in
++  The arch API for system call information is declared in
 +  <filename><asm/syscall.h></filename>.
 +  Each of these calls can be used only at system call entry tracing,
 +  or can be used only at system call exit and the subsequent safe points
@@ -567,10 +567,10 @@
   * ptrace_init_task - initialize ptrace state for a new child
   * @child:		new child task
 diff --git a/include/linux/sched.h b/include/linux/sched.h
-index fdcd427..cf215ed 100644  
+index 99036d5..3f56a3f 100644  
 --- a/include/linux/sched.h
 +++ b/include/linux/sched.h
-@@ -1191,6 +1191,11 @@ struct task_struct {
+@@ -1199,6 +1199,11 @@ struct task_struct {
  #endif
  	seccomp_t seccomp;
  
@@ -582,7 +582,7 @@
  /* Thread group tracking */
     	u32 parent_exec_id;
     	u32 self_exec_id;
-@@ -1796,6 +1801,7 @@ extern int kill_pgrp(struct pid *pid, in
+@@ -1798,6 +1803,7 @@ extern int kill_pgrp(struct pid *pid, in
  extern int kill_pid(struct pid *pid, int sig, int priv);
  extern int kill_proc_info(int, struct siginfo *, pid_t);
  extern int do_notify_parent(struct task_struct *, int);
@@ -591,7 +591,7 @@
  extern void force_sig_specific(int, struct task_struct *);
  extern int send_sig(int, struct task_struct *, int);
 diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
-index 589f429..d3be4d9 100644  
+index b187558..60eca32 100644  
 --- a/include/linux/tracehook.h
 +++ b/include/linux/tracehook.h
 @@ -49,6 +49,7 @@
@@ -677,7 +677,7 @@
  	ptrace_init_task(child, (clone_flags & CLONE_PTRACE) || trace);
  }
  
-@@ -279,6 +298,8 @@ static inline void tracehook_report_clon
+@@ -280,6 +299,8 @@ static inline void tracehook_report_clon
  					  unsigned long clone_flags,
  					  pid_t pid, struct task_struct *child)
  {
@@ -686,7 +686,7 @@
  	if (unlikely(trace)) {
  		/*
  		 * The child starts up with an immediate SIGSTOP.
-@@ -344,6 +365,9 @@ static inline void tracehook_report_vfor
+@@ -345,6 +366,9 @@ static inline void tracehook_report_vfor
   */
  static inline void tracehook_prepare_release_task(struct task_struct *task)
  {
@@ -696,7 +696,7 @@
  }
  
  /**
-@@ -357,7 +381,21 @@ static inline void tracehook_prepare_rel
+@@ -358,7 +382,21 @@ static inline void tracehook_prepare_rel
   */
  static inline void tracehook_finish_release_task(struct task_struct *task)
  {
@@ -718,7 +718,7 @@
  }
  
  /**
-@@ -379,8 +417,12 @@ static inline void tracehook_signal_hand
+@@ -380,8 +418,12 @@ static inline void tracehook_signal_hand
  					    const struct k_sigaction *ka,
  					    struct pt_regs *regs, int stepping)
  {
@@ -731,7 +731,7 @@
  }
  
  /**
-@@ -399,6 +441,8 @@ static inline int tracehook_consider_ign
+@@ -400,6 +442,8 @@ static inline int tracehook_consider_ign
  						    int sig,
  						    void __user *handler)
  {
@@ -740,7 +740,7 @@
  	return (task_ptrace(task) & PT_PTRACED) != 0;
  }
  
-@@ -420,6 +464,9 @@ static inline int tracehook_consider_fat
+@@ -421,6 +465,9 @@ static inline int tracehook_consider_fat
  						  int sig,
  						  void __user *handler)
  {
@@ -750,7 +750,7 @@
  	return (task_ptrace(task) & PT_PTRACED) != 0;
  }
  
-@@ -434,6 +481,8 @@ static inline int tracehook_consider_fat
+@@ -435,6 +482,8 @@ static inline int tracehook_consider_fat
   */
  static inline int tracehook_force_sigpending(void)
  {
@@ -759,7 +759,7 @@
  	return 0;
  }
  
-@@ -463,6 +512,8 @@ static inline int tracehook_get_signal(s
+@@ -464,6 +513,8 @@ static inline int tracehook_get_signal(s
  				       siginfo_t *info,
  				       struct k_sigaction *return_ka)
  {
@@ -768,7 +768,7 @@
  	return 0;
  }
  
-@@ -483,6 +534,8 @@ static inline int tracehook_get_signal(s
+@@ -484,6 +535,8 @@ static inline int tracehook_get_signal(s
   */
  static inline int tracehook_notify_jctl(int notify, int why)
  {
@@ -777,7 +777,7 @@
  	return notify || (current->ptrace & PT_PTRACED);
  }
  
-@@ -500,6 +553,8 @@ static inline int tracehook_notify_jctl(
+@@ -501,6 +554,8 @@ static inline int tracehook_notify_jctl(
  static inline int tracehook_notify_death(struct task_struct *task,
  					 void **death_cookie, int group_dead)
  {
@@ -786,7 +786,7 @@
  	if (task->exit_signal == -1)
  		return task->ptrace ? SIGCHLD : -1;
  
-@@ -536,6 +591,10 @@ static inline void tracehook_report_deat
+@@ -537,6 +592,10 @@ static inline void tracehook_report_deat
  					  int signal, void *death_cookie,
  					  int group_dead)
  {
@@ -797,7 +797,7 @@
  }
  
  #ifdef TIF_NOTIFY_RESUME
-@@ -569,6 +628,9 @@ static inline void set_notify_resume(str
+@@ -570,6 +629,9 @@ static inline void set_notify_resume(str
   */
  static inline void tracehook_notify_resume(struct pt_regs *regs)
  {
@@ -809,10 +809,10 @@
  
 diff --git a/include/linux/utrace.h b/include/linux/utrace.h
 new file mode 100644
-index ...a925728 100644  
+index ...35cc5be 100644  
 --- /dev/null
 +++ b/include/linux/utrace.h
-@@ -0,0 +1,610 @@
+@@ -0,0 +1,616 @@
 +/*
 + * utrace infrastructure interface for debugging user processes
 + *
@@ -1073,6 +1073,7 @@
 +	UTRACE_SIGNAL_HANDLER	= 0x70
 +};
 +#define	UTRACE_SIGNAL_MASK	0xf0
++#define UTRACE_SIGNAL_HOLD	0x100 /* Flag, push signal back on queue.  */
 +
 +/**
 + * utrace_signal_action - &enum utrace_signal_action from callback action
@@ -1087,8 +1088,6 @@
 +	return action & UTRACE_SIGNAL_MASK;
 +}
 +
-+#define UTRACE_SIGNAL_HOLD	0x100 /* Flag, push signal back on queue.  */
-+
 +/**
 + * enum utrace_syscall_action - disposition of system call attempt
 + * @UTRACE_SYSCALL_RUN:		Run the system call.
@@ -1247,6 +1246,10 @@
 + *	from the previous callback.  In this way, the original signal can
 + *	be left in @info while returning %UTRACE_STOP|%UTRACE_SIGNAL_IGN
 + *	and then found again when resuming @task with %UTRACE_INTERRUPT.
++ *	The %UTRACE_SIGNAL_HOLD flag bit can be OR'd into the return value,
++ *	and might be in @action if the previous engine returned it.  This
++ *	flag asks that the signal in @info be pushed back on @task's queue
++ *	so that it will be seen again after whatever action is taken now.
 + *
 + * @report_clone:
 + *	Requested by %UTRACE_EVENT(%CLONE).
@@ -1265,9 +1268,12 @@
 + *
 + * @report_jctl:
 + *	Requested by %UTRACE_EVENT(%JCTL).
-+ *	Job control event; @type is %CLD_STOPPED or %CLD_CONTINUED.
-+ *	If @notify is true, @task is the last thread to stop
-+ *	and so will send %SIGCHLD to its parent after this callback.
++ *	Job control event; @type is %CLD_STOPPED or %CLD_CONTINUED,
++ *	indicating whether we are stopping or resuming now.  If @notify
++ *	is nonzero, @task is the last thread to stop and so will send
++ *	%SIGCHLD to its parent after this callback; @notify reflects
++ *	what the parent's %SIGCHLD has in @si_code, which can sometimes
++ *	be %CLD_STOPPED even when @type is %CLD_CONTINUED.
 + *
 + * @report_exec:
 + *	Requested by %UTRACE_EVENT(%EXEC).
@@ -1372,7 +1378,7 @@
 +	u32 (*report_jctl)(enum utrace_resume_action action,
 +			   struct utrace_attached_engine *engine,
 +			   struct task_struct *task,
-+			   bool notify, int type);
++			   int type, int notify);
 +	u32 (*report_exec)(enum utrace_resume_action action,
 +			   struct utrace_attached_engine *engine,
 +			   struct task_struct *task,
@@ -1462,10 +1468,10 @@
  
  config PREEMPT_NOTIFIERS
 diff --git a/kernel/Makefile b/kernel/Makefile
-index 15ab63f..4a40793 100644  
+index 54f6983..ff15d4d 100644  
 --- a/kernel/Makefile
 +++ b/kernel/Makefile
-@@ -63,6 +63,7 @@ obj-$(CONFIG_IKCONFIG) += configs.o
+@@ -64,6 +64,7 @@ obj-$(CONFIG_IKCONFIG) += configs.o
  obj-$(CONFIG_RESOURCE_COUNTERS) += res_counter.o
  obj-$(CONFIG_STOP_MACHINE) += stop_machine.o
  obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
@@ -2156,10 +2162,10 @@
  }
  
 diff --git a/kernel/signal.c b/kernel/signal.c
-index 44b5823..2760cf3 100644  
+index 954f77d..c7a2aca 100644  
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
-@@ -1434,7 +1434,7 @@ int do_notify_parent(struct task_struct 
+@@ -1413,7 +1413,7 @@ int do_notify_parent(struct task_struct 
  	return sig;
  }
  
@@ -2168,7 +2174,7 @@
  {
  	struct siginfo info;
  	unsigned long flags;
-@@ -1490,6 +1490,8 @@ static void do_notify_parent_cldstop(str
+@@ -1468,6 +1468,8 @@ static void do_notify_parent_cldstop(str
  	spin_unlock_irqrestore(&sighand->siglock, flags);
  }
  
@@ -2177,7 +2183,7 @@
  static inline int may_ptrace_stop(void)
  {
  	if (!likely(current->ptrace & PT_PTRACED))
-@@ -1624,6 +1626,8 @@ void ptrace_notify(int exit_code)
+@@ -1600,6 +1602,8 @@ void ptrace_notify(int exit_code)
  	spin_unlock_irq(&current->sighand->siglock);
  }
  
@@ -2186,7 +2192,7 @@
  static void
  finish_stop(int stop_count)
  {
-@@ -1702,6 +1706,7 @@ static int do_signal_stop(int signr)
+@@ -1677,6 +1681,7 @@ static int do_signal_stop(int signr)
  	return 1;
  }
  
@@ -2194,7 +2200,7 @@
  static int ptrace_signal(int signr, siginfo_t *info,
  			 struct pt_regs *regs, void *cookie)
  {
-@@ -1740,6 +1745,13 @@ static int ptrace_signal(int signr, sigi
+@@ -1715,6 +1720,13 @@ static int ptrace_signal(int signr, sigi
  
  	return signr;
  }
@@ -2210,10 +2216,10 @@
  			  struct pt_regs *regs, void *cookie)
 diff --git a/kernel/utrace.c b/kernel/utrace.c
 new file mode 100644
-index ...c9f5dad 100644  
+index ...0555597 100644  
 --- /dev/null
 +++ b/kernel/utrace.c
-@@ -0,0 +1,2278 @@
+@@ -0,0 +1,2325 @@
 +/*
 + * utrace infrastructure interface for debugging user processes
 + *
@@ -3364,24 +3370,33 @@
 +		/*
 +		 * Make the thread call tracehook_get_signal() soon.
 +		 */
-+		if (!utrace->interrupt) {
-+			utrace->interrupt = 1;
++		if (utrace->interrupt)
++			break;
++		utrace->interrupt = 1;
++
++		/*
++		 * If it's not already stopped, interrupt it now.
++		 * We need the siglock here in case it calls
++		 * recalc_sigpending() and clears its own
++		 * TIF_SIGPENDING.  By taking the lock, we've
++		 * serialized any later recalc_sigpending() after
++		 * our setting of utrace->interrupt to force it on.
++		 */
++		if (resume) {
 +			/*
-+			 * If it's not already stopped, interrupt it now.
-+			 * We need the siglock here in case it calls
-+			 * recalc_sigpending() and clears its own
-+			 * TIF_SIGPENDING.  By taking the lock, we've
-+			 * serialized any later recalc_sigpending() after
-+			 * our setting of utrace->interrupt to force it on.
++			 * This is really just to keep the invariant
++			 * that TIF_SIGPENDING is set with utrace->interrupt.
++			 * When it's stopped, we know it's always going
++			 * through utrace_get_signal and will recalculate.
 +			 */
-+			if (!resume) {
-+				struct sighand_struct *sighand;
-+				unsigned long irqflags;
-+				sighand = lock_task_sighand(target, &irqflags);
-+				if (likely(sighand)) {
-+					signal_wake_up(target, 0);
-+					unlock_task_sighand(target, &irqflags);
-+				}
++			set_tsk_thread_flag(target, TIF_SIGPENDING);
++		} else {
++			struct sighand_struct *sighand;
++			unsigned long irqflags;
++			sighand = lock_task_sighand(target, &irqflags);
++			if (likely(sighand)) {
++				signal_wake_up(target, 0);
++				unlock_task_sighand(target, &irqflags);
 +			}
 +		}
 +		break;
@@ -3713,37 +3728,39 @@
 +	INIT_REPORT(report);
 +	bool was_stopped = task_is_stopped(task);
 +
-+	if (was_stopped) {
-+		/*
-+		 * While in TASK_STOPPED, we can be considered safely
-+		 * stopped by utrace_do_stop() and detached asynchronously.
-+		 * If we woke up and checked task->utrace_flags before that
-+		 * was finished, we might be here with utrace already
-+		 * removed or in the middle of being removed.
-+		 *
-+		 * RCU makes it safe to get the utrace->lock even if it's
-+		 * being freed.  Once we have that lock, either an external
-+		 * detach has finished and this struct has been freed, or
-+		 * else we know we are excluding any other detach attempt.
-+		 *
-+		 * If we are indeed attached, then make sure we are no
-+		 * longer considered stopped while we run callbacks.
-+		 */
++	/*
++	 * We get here with CLD_STOPPED when we've just entered
++	 * TASK_STOPPED, or with CLD_CONTINUED when we've just come
++	 * out but not yet been through utrace_get_signal() again.
++	 *
++	 * While in TASK_STOPPED, we can be considered safely
++	 * stopped by utrace_do_stop() and detached asynchronously.
++	 * If we woke up and checked task->utrace_flags before that
++	 * was finished, we might be here with utrace already
++	 * removed or in the middle of being removed.
++	 *
++	 * RCU makes it safe to get the utrace->lock even if it's
++	 * being freed.  Once we have that lock, either an external
++	 * detach has finished and this struct has been freed, or
++	 * else we know we are excluding any other detach attempt.
++	 *
++	 * If we are indeed attached, then make sure we are no
++	 * longer considered stopped while we run callbacks.
++	 */
++	rcu_read_lock();
++	utrace = rcu_dereference(task->utrace);
++	if (unlikely(!utrace)) {
 +		rcu_read_lock();
-+		utrace = rcu_dereference(task->utrace);
-+		if (unlikely(!utrace)) {
-+			rcu_read_lock();
-+			return;
-+		}
-+		spin_lock(&utrace->lock);
-+		utrace->stopped = 0;
-+		utrace->report = 0;
-+		spin_unlock(&utrace->lock);
-+		rcu_read_unlock();
++		return;
 +	}
++	spin_lock(&utrace->lock);
++	utrace->stopped = 0;
++	utrace->report = 0;
++	spin_unlock(&utrace->lock);
++	rcu_read_unlock();
 +
 +	REPORT(task, utrace, &report, UTRACE_EVENT(JCTL),
-+	       report_jctl, notify, what);
++	       report_jctl, was_stopped ? CLD_STOPPED : CLD_CONTINUED, what);
 +
 +	if (was_stopped && !task_is_stopped(task)) {
 +		/*
@@ -3953,6 +3970,35 @@
 +}
 +
 +/*
++ * Take the siglock and push @info back on our queue.
++ * Returns with @task->sighand->siglock held.
++ */
++static void push_back_signal(struct task_struct *task, siginfo_t *info)
++	__acquires(task->sighand->siglock)
++{
++	struct sigqueue *q;
++
++	if (unlikely(!info->si_signo)) { /* Oh, a wise guy! */
++		spin_lock_irq(&task->sighand->siglock);
++		return;
++	}
++
++	q = sigqueue_alloc();
++	if (likely(q)) {
++		q->flags = 0;
++		copy_siginfo(&q->info, info);
++	}
++
++	spin_lock_irq(&task->sighand->siglock);
++
++	sigaddset(&task->pending.signal, info->si_signo);
++	if (likely(q))
++		list_add(&q->list, &task->pending.list);
++
++	set_tsk_thread_flag(task, TIF_SIGPENDING);
++}
++
++/*
 + * This is the hook from the signals code, called with the siglock held.
 + * Here is the ideal place to stop.  We also dequeue and intercept signals.
 + */
@@ -3967,8 +4013,7 @@
 +	struct utrace_attached_engine *engine, *next;
 +	const struct utrace_engine_ops *ops;
 +	unsigned long event, want;
-+	enum utrace_signal_action action;
-+	enum utrace_resume_action resume;
++	u32 ret;
 +	int signr;
 +
 +	/*
@@ -4012,11 +4057,11 @@
 +		splice_attaching(utrace);
 +
 +		if (unlikely(!utrace->interrupt) && unlikely(!utrace->report))
-+			action = UTRACE_SIGNAL_IGN;
++			report.result = UTRACE_SIGNAL_IGN;
 +		else if (utrace->signal_handler)
-+			action = UTRACE_SIGNAL_HANDLER;
++			report.result = UTRACE_SIGNAL_HANDLER;
 +		else
-+			action = UTRACE_SIGNAL_REPORT;
++			report.result = UTRACE_SIGNAL_REPORT;
 +
 +		/*
 +		 * We are now making the report and it's on the
@@ -4024,9 +4069,19 @@
 +		 */
 +		utrace->interrupt = utrace->report = utrace->signal_handler = 0;
 +
++		/*
++		 * Make sure signal_pending() only returns true
++		 * if there are real signals pending.
++		 */
++		if (signal_pending(task)) {
++			spin_lock_irq(&task->sighand->siglock);
++			recalc_sigpending();
++			spin_unlock_irq(&task->sighand->siglock);
++		}
++
 +		spin_unlock(&utrace->lock);
 +
-+		if (unlikely(action == UTRACE_SIGNAL_IGN))
++		if (unlikely(report.result == UTRACE_SIGNAL_IGN))
 +			/*
 +			 * We only got here to clear utrace->signal_handler.
 +			 */
@@ -4102,25 +4157,25 @@
 +
 +		if (ka->sa.sa_handler == SIG_IGN) {
 +			event = UTRACE_EVENT(SIGNAL_IGN);
-+			action = UTRACE_SIGNAL_IGN;
++			report.result = UTRACE_SIGNAL_IGN;
 +		} else if (ka->sa.sa_handler != SIG_DFL) {
 +			event = UTRACE_EVENT(SIGNAL);
-+			action = UTRACE_SIGNAL_DELIVER;
++			report.result = UTRACE_SIGNAL_DELIVER;
 +		} else if (sig_kernel_coredump(signr)) {
 +			event = UTRACE_EVENT(SIGNAL_CORE);
-+			action = UTRACE_SIGNAL_CORE;
++			report.result = UTRACE_SIGNAL_CORE;
 +		} else if (sig_kernel_ignore(signr)) {
 +			event = UTRACE_EVENT(SIGNAL_IGN);
-+			action = UTRACE_SIGNAL_IGN;
++			report.result = UTRACE_SIGNAL_IGN;
 +		} else if (signr == SIGSTOP) {
 +			event = UTRACE_EVENT(SIGNAL_STOP);
-+			action = UTRACE_SIGNAL_STOP;
++			report.result = UTRACE_SIGNAL_STOP;
 +		} else if (sig_kernel_stop(signr)) {
 +			event = UTRACE_EVENT(SIGNAL_STOP);
-+			action = UTRACE_SIGNAL_TSTP;
++			report.result = UTRACE_SIGNAL_TSTP;
 +		} else {
 +			event = UTRACE_EVENT(SIGNAL_TERM);
-+			action = UTRACE_SIGNAL_TERM;
++			report.result = UTRACE_SIGNAL_TERM;
 +		}
 +
 +		/*
@@ -4152,26 +4207,28 @@
 +		if ((want & (event | UTRACE_EVENT(QUIESCE))) == 0)
 +			continue;
 +
-+		if (ops->report_signal) {
-+			u32 ret = action | report.action;
-+			ret = (*ops->report_signal)(ret, engine, task,
-+						    regs, info, ka, return_ka);
-+			action = utrace_signal_action(ret);
-+			resume = utrace_resume_action(ret);
-+		} else {
-+			resume = (*ops->report_quiesce)(report.action,
-+							engine, task, event);
-+		}
++		if (ops->report_signal)
++			ret = (*ops->report_signal)(
++				report.result | report.action, engine, task,
++				regs, info, ka, return_ka);
++		else
++			ret = (report.result | (*ops->report_quiesce)(
++				       report.action, engine, task, event));
 +
 +		/*
 +		 * Avoid a tight loop reporting again and again if some
 +		 * engine is too stupid.
 +		 */
-+		if (unlikely(resume == UTRACE_INTERRUPT) ||
-+		    unlikely(resume == UTRACE_REPORT))
-+			resume = UTRACE_RESUME;
++		switch (utrace_resume_action(ret)) {
++		default:
++			break;
++		case UTRACE_INTERRUPT:
++		case UTRACE_REPORT:
++			ret = (ret & ~UTRACE_RESUME_MASK) | UTRACE_RESUME;
++			break;
++		}
 +
-+		finish_callback(utrace, &report, engine, resume);
++		finish_callback(utrace, &report, engine, ret);
 +	}
 +
 +	/*
@@ -4180,7 +4237,7 @@
 +	 * Our caller uses our return value (signr) to decide what to
 +	 * do, but uses info->si_signo as the signal number to report.
 +	 */
-+	switch (action) {
++	switch (utrace_signal_action(report.result)) {
 +	case UTRACE_SIGNAL_TERM:
 +		signr = SIGTERM;
 +		break;
@@ -4222,7 +4279,10 @@
 +				set_tsk_thread_flag(task, TIF_SIGPENDING);
 +			}
 +
-+			spin_lock_irq(&task->sighand->siglock);
++			if (unlikely(report.result & UTRACE_SIGNAL_HOLD))
++				push_back_signal(task, info);
++			else
++				spin_lock_irq(&task->sighand->siglock);
 +
 +			/*
 +			 * We do the SA_ONESHOT work here since the
@@ -4272,27 +4332,20 @@
 +			return signr;
 +		}
 +
++		if (unlikely(report.result & UTRACE_SIGNAL_HOLD)) {
++			push_back_signal(task, info);
++			spin_unlock_irq(&task->sighand->siglock);
++		}
++
 +		return -1;
 +	}
 +
 +	return_ka->sa.sa_handler = SIG_DFL;
 +
-+#ifdef XXX
-+	if (action & UTRACE_SIGNAL_HOLD) {
-+		struct sigqueue *q = sigqueue_alloc();
-+		if (likely(q != NULL)) {
-+			q->flags = 0;
-+			copy_siginfo(&q->info, info);
-+		}
-+		action &= ~UTRACE_SIGNAL_HOLD;
-+		spin_lock_irq(&tsk->sighand->siglock);
-+		sigaddset(&tsk->pending.signal, info->si_signo);
-+		if (likely(q != NULL))
-+			list_add(&q->list, &tsk->pending.list);
-+	}
-+#endif
-+
-+	spin_lock_irq(&task->sighand->siglock);
++	if (unlikely(report.result & UTRACE_SIGNAL_HOLD))
++		push_back_signal(task, info);
++	else
++		spin_lock_irq(&task->sighand->siglock);
 +
 +	if (sig_kernel_stop(signr))
 +		task->signal->flags |= SIGNAL_STOP_DEQUEUED;
@@ -4383,7 +4436,7 @@
 +EXPORT_SYMBOL_GPL(utrace_prepare_examine);
 +
 +/**
-+ * utrace_finish_examine - prepare to examine thread state
++ * utrace_finish_examine - complete an examination of thread state
 + * @target:		thread of interest, a &struct task_struct pointer
 + * @engine:		engine pointer returned by utrace_attach()
 + * @exam:		pointer passed to utrace_prepare_examine() call

linux-2.6-x86-tracehook.patch:

Index: linux-2.6-x86-tracehook.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-x86-tracehook.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-x86-tracehook.patch	24 Jul 2008 08:28:26 -0000	1.1
+++ linux-2.6-x86-tracehook.patch	26 Jul 2008 03:47:28 -0000	1.2
@@ -8,17 +8,17 @@
  7 files changed, 248 insertions(+), 66 deletions(-)
 
 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
-index 03980cb..b009ddf 100644  
+index e3cba0b..8b562d5 100644  
 --- a/arch/x86/Kconfig
 +++ b/arch/x86/Kconfig
-@@ -27,6 +27,7 @@ config X86
+@@ -29,6 +29,7 @@ config X86
  	select HAVE_FTRACE
  	select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
  	select HAVE_ARCH_KGDB if !X86_VOYAGER
 +	select HAVE_ARCH_TRACEHOOK
+ 	select HAVE_EFFICIENT_UNALIGNED_ACCESS
  
  config ARCH_DEFCONFIG
- 	string
 diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
 index e37dccc..19a7d2c 100644  
 --- a/arch/x86/kernel/ptrace.c
@@ -134,7 +134,7 @@
  	clear_thread_flag(TIF_IRET);
  }
 diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c
-index 47c3d24..282abdc 100644  
+index b45ef8d..d01e3f6 100644  
 --- a/arch/x86/kernel/signal_64.c
 +++ b/arch/x86/kernel/signal_64.c
 @@ -15,6 +15,7 @@
@@ -153,7 +153,7 @@
  #include "sigframe.h"
  
  #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-@@ -293,35 +295,6 @@ give_sigsegv:
+@@ -346,35 +348,6 @@ give_sigsegv:
  }
  
  /*
@@ -189,7 +189,7 @@
   * OK, we're invoking a handler
   */	
  
-@@ -332,9 +305,9 @@ handle_signal(unsigned long sig, siginfo
+@@ -385,9 +358,9 @@ handle_signal(unsigned long sig, siginfo
  	int ret;
  
  	/* Are we from a system call? */
@@ -201,7 +201,7 @@
  		case -ERESTART_RESTARTBLOCK:
  		case -ERESTARTNOHAND:
  			regs->ax = -EINTR;
-@@ -391,8 +364,6 @@ handle_signal(unsigned long sig, siginfo
+@@ -444,8 +417,6 @@ handle_signal(unsigned long sig, siginfo
  		 * handler too.
  		 */
  		regs->flags &= ~X86_EFLAGS_TF;
@@ -210,7 +210,7 @@
  
  		spin_lock_irq(&current->sighand->siglock);
  		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-@@ -400,6 +371,9 @@ handle_signal(unsigned long sig, siginfo
+@@ -453,6 +424,9 @@ handle_signal(unsigned long sig, siginfo
  			sigaddset(&current->blocked,sig);
  		recalc_sigpending();
  		spin_unlock_irq(&current->sighand->siglock);
@@ -220,7 +220,7 @@
  	}
  
  	return ret;
-@@ -456,9 +430,9 @@ static void do_signal(struct pt_regs *re
+@@ -509,9 +483,9 @@ static void do_signal(struct pt_regs *re
  	}
  
  	/* Did we come from a system call? */
@@ -232,7 +232,7 @@
  		case -ERESTARTNOHAND:
  		case -ERESTARTSYS:
  		case -ERESTARTNOINTR:
-@@ -496,6 +470,11 @@ void do_notify_resume(struct pt_regs *re
+@@ -549,6 +523,11 @@ void do_notify_resume(struct pt_regs *re
  	/* deal with pending signal delivery */
  	if (thread_info_flags & _TIF_SIGPENDING)
  		do_signal(regs);
@@ -477,7 +477,7 @@
 +
 +#endif	/* _ASM_SYSCALL_H */
 diff --git a/include/asm-x86/thread_info.h b/include/asm-x86/thread_info.h
-index 3f2de10..29533e3 100644  
+index da0a675..4cd5b7b 100644  
 --- a/include/asm-x86/thread_info.h
 +++ b/include/asm-x86/thread_info.h
 @@ -71,6 +71,7 @@ struct thread_info {


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/sources,v
retrieving revision 1.838
retrieving revision 1.839
diff -u -r1.838 -r1.839
--- sources	25 Jul 2008 16:21:10 -0000	1.838
+++ sources	26 Jul 2008 03:47:28 -0000	1.839
@@ -1,2 +1,2 @@
 5169d01c405bc3f866c59338e217968c  linux-2.6.26.tar.bz2
-81488c85358bd593d7bb2e952b7c48fb  patch-2.6.26-git12.bz2
+be2399c321e7ef65c354e8a4d5208ce6  patch-2.6.26-git13.bz2


Index: upstream
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/upstream,v
retrieving revision 1.755
retrieving revision 1.756
diff -u -r1.755 -r1.756
--- upstream	25 Jul 2008 16:21:10 -0000	1.755
+++ upstream	26 Jul 2008 03:47:28 -0000	1.756
@@ -1,2 +1,2 @@
 linux-2.6.26.tar.bz2
-patch-2.6.26-git12.bz2
+patch-2.6.26-git13.bz2


--- patch-2.6.26-git12.bz2.sign DELETED ---




More information about the fedora-extras-commits mailing list