+ replace-cad_pid-by-a-struct-pid.patch added to -mm tree

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

 



The patch titled

     replace cad_pid by a struct pid

has been added to the -mm tree.  Its filename is

     replace-cad_pid-by-a-struct-pid.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: replace cad_pid by a struct pid
From: Cedric Le Goater <clg@xxxxxxxxxx>

There are a few places in the kernel where the init task is signaled.  The
ctrl+alt+del sequence is one them.  It kills a task, usually init, using a
cached pid (cad_pid).

This patch replaces the pid_t by a struct pid to avoid pid wrap around
problem.  The struct pid is initialized at boot time in init() and can be
modified through systctl with

	/proc/sys/kernel/cad_pid

[ I haven't found any distro using it ? ]

It also introduces a small helper routine kill_cad_pid() which is used
where it seemed ok to use cad_pid instead of pid 1.

Signed-off-by: Cedric Le Goater <clg@xxxxxxxxxx>
Cc: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>
Cc: Martin Schwidefsky <schwidefsky@xxxxxxxxxx>
Cc: Paul Mackerras <paulus@xxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 arch/mips/sgi-ip22/ip22-reset.c     |    2 -
 arch/mips/sgi-ip32/ip32-reset.c     |    2 -
 arch/powerpc/platforms/iseries/mf.c |    2 -
 drivers/char/nwbutton.c             |    2 -
 drivers/char/snsc_event.c           |    2 -
 drivers/parisc/power.c              |    2 -
 drivers/s390/s390mach.c             |    2 -
 include/linux/sched.h               |    7 ++++++
 init/main.c                         |    2 +
 kernel/sys.c                        |    5 +---
 kernel/sysctl.c                     |   30 +++++++++++++++++++++++---
 11 files changed, 45 insertions(+), 13 deletions(-)

diff -puN arch/mips/sgi-ip22/ip22-reset.c~replace-cad_pid-by-a-struct-pid arch/mips/sgi-ip22/ip22-reset.c
--- a/arch/mips/sgi-ip22/ip22-reset.c~replace-cad_pid-by-a-struct-pid
+++ a/arch/mips/sgi-ip22/ip22-reset.c
@@ -123,7 +123,7 @@ static inline void power_button(void)
 	if (machine_state & MACHINE_PANICED)
 		return;
 
-	if ((machine_state & MACHINE_SHUTTING_DOWN) || kill_proc(1,SIGINT,1)) {
+	if ((machine_state & MACHINE_SHUTTING_DOWN) || kill_cad_pid(SIGINT, 1)) {
 		/* No init process or button pressed twice.  */
 		sgi_machine_power_off();
 	}
diff -puN arch/mips/sgi-ip32/ip32-reset.c~replace-cad_pid-by-a-struct-pid arch/mips/sgi-ip32/ip32-reset.c
--- a/arch/mips/sgi-ip32/ip32-reset.c~replace-cad_pid-by-a-struct-pid
+++ a/arch/mips/sgi-ip32/ip32-reset.c
@@ -120,7 +120,7 @@ static inline void ip32_power_button(voi
 	if (has_panicked)
 		return;
 
-	if (shuting_down || kill_proc(1, SIGINT, 1)) {
+	if (shuting_down || kill_cad_pid(SIGINT, 1)) {
 		/* No init process or button pressed twice.  */
 		ip32_machine_power_off();
 	}
diff -puN arch/powerpc/platforms/iseries/mf.c~replace-cad_pid-by-a-struct-pid arch/powerpc/platforms/iseries/mf.c
--- a/arch/powerpc/platforms/iseries/mf.c~replace-cad_pid-by-a-struct-pid
+++ a/arch/powerpc/platforms/iseries/mf.c
@@ -357,7 +357,7 @@ static int dma_and_signal_ce_msg(char *c
  */
 static int shutdown(void)
 {
-	int rc = kill_proc(1, SIGINT, 1);
+	int rc = kill_cad_pid(SIGINT, 1);
 
 	if (rc) {
 		printk(KERN_ALERT "mf.c: SIGINT to init failed (%d), "
diff -puN drivers/char/nwbutton.c~replace-cad_pid-by-a-struct-pid drivers/char/nwbutton.c
--- a/drivers/char/nwbutton.c~replace-cad_pid-by-a-struct-pid
+++ a/drivers/char/nwbutton.c
@@ -128,7 +128,7 @@ static void button_sequence_finished (un
 {
 #ifdef CONFIG_NWBUTTON_REBOOT		/* Reboot using button is enabled */
 	if (button_press_count == reboot_count) {
-		kill_proc (1, SIGINT, 1);	/* Ask init to reboot us */
+		kill_cad_pid(SIGINT, 1);	/* Ask init to reboot us */
 	}
 #endif /* CONFIG_NWBUTTON_REBOOT */
 	button_consume_callbacks (button_press_count);
diff -puN drivers/char/snsc_event.c~replace-cad_pid-by-a-struct-pid drivers/char/snsc_event.c
--- a/drivers/char/snsc_event.c~replace-cad_pid-by-a-struct-pid
+++ a/drivers/char/snsc_event.c
@@ -220,7 +220,7 @@ scdrv_dispatch_event(char *event, int le
 			       " Sending SIGPWR to init...\n");
 
 		/* give a SIGPWR signal to init proc */
-		kill_proc(1, SIGPWR, 0);
+		kill_cad_pid(SIGPWR, 0);
 	} else {
 		/* print to system log */
 		printk("%s|$(0x%x)%s\n", severity, esp_code, desc);
diff -puN drivers/parisc/power.c~replace-cad_pid-by-a-struct-pid drivers/parisc/power.c
--- a/drivers/parisc/power.c~replace-cad_pid-by-a-struct-pid
+++ a/drivers/parisc/power.c
@@ -85,7 +85,7 @@
 static void deferred_poweroff(void *dummy)
 {
 	extern int cad_pid;	/* from kernel/sys.c */
-	if (kill_proc(cad_pid, SIGINT, 1)) {
+	if (kill_cad_pid(SIGINT, 1)) {
 		/* just in case killing init process failed */
 		machine_power_off();
 	}
diff -puN drivers/s390/s390mach.c~replace-cad_pid-by-a-struct-pid drivers/s390/s390mach.c
--- a/drivers/s390/s390mach.c~replace-cad_pid-by-a-struct-pid
+++ a/drivers/s390/s390mach.c
@@ -208,7 +208,7 @@ s390_handle_mcck(void)
 		 */
 		__ctl_clear_bit(14, 24);	/* Disable WARNING MCH */
 		if (xchg(&mchchk_wng_posted, 1) == 0)
-			kill_proc(1, SIGPWR, 1);
+			kill_cad_pid(SIGPWR, 1);
 	}
 #endif
 
diff -puN include/linux/sched.h~replace-cad_pid-by-a-struct-pid include/linux/sched.h
--- a/include/linux/sched.h~replace-cad_pid-by-a-struct-pid
+++ a/include/linux/sched.h
@@ -1092,6 +1092,8 @@ static inline int is_init(struct task_st
 	return tsk->pid == 1;
 }
 
+extern struct pid* cad_pid;
+
 extern void free_task(struct task_struct *tsk);
 #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
 
@@ -1319,6 +1321,11 @@ extern int send_group_sigqueue(int, stru
 extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *);
 extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long);
 
+static inline int kill_cad_pid(int sig, int priv)
+{
+	return kill_pid(cad_pid, sig, priv);
+}
+
 /* These can be the second arg to send_sig_info/send_group_sig_info.  */
 #define SEND_SIG_NOINFO ((struct siginfo *) 0)
 #define SEND_SIG_PRIV	((struct siginfo *) 1)
diff -puN init/main.c~replace-cad_pid-by-a-struct-pid init/main.c
--- a/init/main.c~replace-cad_pid-by-a-struct-pid
+++ a/init/main.c
@@ -726,6 +726,8 @@ static int init(void * unused)
 	 */
 	child_reaper = current;
 
+	cad_pid = task_pid(current);
+
 	smp_prepare_cpus(max_cpus);
 
 	do_pre_smp_initcalls();
diff -puN kernel/sys.c~replace-cad_pid-by-a-struct-pid kernel/sys.c
--- a/kernel/sys.c~replace-cad_pid-by-a-struct-pid
+++ a/kernel/sys.c
@@ -92,7 +92,7 @@ EXPORT_SYMBOL(fs_overflowgid);
  */
 
 int C_A_D = 1;
-int cad_pid = 1;
+struct pid* cad_pid = NULL;
 
 /*
  *	Notifier list for kernel code which wants to be called
@@ -773,10 +773,9 @@ void ctrl_alt_del(void)
 	if (C_A_D)
 		schedule_work(&cad_work);
 	else
-		kill_proc(cad_pid, SIGINT, 1);
+		kill_cad_pid(SIGINT, 1);
 }
 	
-
 /*
  * Unprivileged users may change the real gid to the effective gid
  * or vice versa.  (BSD-style)
diff -puN kernel/sysctl.c~replace-cad_pid-by-a-struct-pid kernel/sysctl.c
--- a/kernel/sysctl.c~replace-cad_pid-by-a-struct-pid
+++ a/kernel/sysctl.c
@@ -65,7 +65,6 @@ extern int sysrq_enabled;
 extern int core_uses_pid;
 extern int suid_dumpable;
 extern char core_pattern[];
-extern int cad_pid;
 extern int pid_max;
 extern int min_free_kbytes;
 extern int printk_ratelimit_jiffies;
@@ -141,6 +140,9 @@ static int parse_table(int __user *, int
 static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
 		  void __user *buffer, size_t *lenp, loff_t *ppos);
 
+static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp,
+		  void __user *buffer, size_t *lenp, loff_t *ppos);
+
 static ctl_table root_table[];
 static struct ctl_table_header root_table_header =
 	{ root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) };
@@ -547,10 +549,10 @@ static ctl_table kern_table[] = {
 	{
 		.ctl_name	= KERN_CADPID,
 		.procname	= "cad_pid",
-		.data		= &cad_pid,
+		.data		= NULL,
 		.maxlen		= sizeof (int),
 		.mode		= 0600,
-		.proc_handler	= &proc_dointvec,
+		.proc_handler	= &proc_do_cad_pid,
 	},
 	{
 		.ctl_name	= KERN_MAX_THREADS,
@@ -2441,6 +2443,28 @@ proc_minmax:
 }
 #endif
 
+static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp,
+			   void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+	struct pid *new_pid;
+	pid_t tmp;
+	int r;
+
+	tmp = pid_nr(cad_pid);
+
+	r = __do_proc_dointvec(&tmp, table, write, filp, buffer,
+			       lenp, ppos, NULL, NULL);
+	if (r || !write)
+		return r;
+
+	new_pid = find_get_pid(tmp);
+	if (!new_pid)
+		return -ESRCH;
+
+	put_pid(xchg(&cad_pid, new_pid));
+	return 0;
+}
+
 #else /* CONFIG_PROC_FS */
 
 int proc_dostring(ctl_table *table, int write, struct file *filp,
_

Patches currently in -mm which might be from clg@xxxxxxxxxx are

kthread-drivers-base-firmware_classc.patch
pidspace-is_init.patch
pids-coding-style-use-struct-pidmap.patch
move-pidmap-to-pspaceh.patch
move-pidmap-to-pspaceh-fix.patch
define-struct-pspace.patch
update-mq_notify-to-use-a-struct-pid.patch
s390-update-fs3270-to-use-a-struct-pid.patch
namespaces-utsname-switch-to-using-uts-namespaces.patch
namespaces-utsname-implement-clone_newuts-flag-fix.patch
ipc-namespace-core.patch
ipc-namespace-utils.patch
replace-cad_pid-by-a-struct-pid.patch
statistics-replace-inode-ugeneric_ip-with-i_private.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux