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(¤t->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(®s), 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(¤t->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(¤t->sighand->siglock);
sigorsets(¤t->blocked,¤t->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(¤t->blocked,sig);
recalc_sigpending();
spin_unlock_irq(¤t->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