All of lore.kernel.org
 help / color / mirror / Atom feed
From: William Lee Irwin III <wli@holomorphy.com>
To: Diego Calleja Garc?a <aradorlinux@yahoo.es>
Cc: linux-kernel@vger.kernel.org
Subject: Re: reproduceable oops in -test8
Date: Sat, 18 Oct 2003 18:19:49 -0700	[thread overview]
Message-ID: <20031019011949.GD711@holomorphy.com> (raw)
In-Reply-To: <20031018234848.51a2b723.aradorlinux@yahoo.es>

On Sat, Oct 18, 2003 at 11:48:48PM +0200, Diego Calleja Garc?a wrote:
> Hi, I got some oops with test8; the first time I got it it was under
> test8-wli1; but it seems the same is happening under plain -test8.
> This is the original bug report:
> The system was working well. Then I decided to run totem - a neat
> video player. It hanged. Trying to kill it I did "ps xa"; suprisingly
> after pid 560 ps (and the terminal) stopped and hanged. The rest of
were still alive. Then I fired another terminal, did /proc/562 (the
> following pid after 560); I run ls; and ls hanged. I fired another
> terminal, and I did 'find /proc'; and I got the oops. Some seconds
> after that the system locked up completely. Box is a dual p3; 256 MB
> ram, ide disks, running debian sid, no NPTL. Config pasted below.

Two stupid bugs in my case. With a bit of noise surrounding things
(e.g. EXPORT_SYMBOL() crud, init_task paranoia garbage, ->f_pos in
unsigned long removal), un-reversing the arguments to find_pid()
and not blowing away the last-seen tid while formatting it and later
trying to use it as ->f_pos are the needed fixes.


-- wli


diff -prauN wli-2.6.0-test8-38/fs/proc/base.c wli-2.6.0-test8-39/fs/proc/base.c
--- wli-2.6.0-test8-38/fs/proc/base.c	2003-10-17 19:16:54.000000000 -0700
+++ wli-2.6.0-test8-39/fs/proc/base.c	2003-10-18 18:01:43.000000000 -0700
@@ -1673,44 +1673,43 @@ static int proc_task_readdir(struct file
 	struct inode *inode = dentry->d_inode;
 	int retval = -ENOENT;
 	ino_t ino;
-	unsigned long pos = filp->f_pos;  /* avoiding "long long" filp->f_pos */
 
 	if (!pid_alive(proc_task(inode)))
 		goto out;
 	retval = 0;
 
-	switch (pos) {
+	switch (filp->f_pos) {
 	case 0:
 		ino = inode->i_ino;
-		if (filldir(dirent, ".", 1, pos, ino, DT_DIR) < 0)
+		if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)
 			goto out;
-		pos++;
+		filp->f_pos++;
 		/* fall through */
 	case 1:
 		ino = parent_ino(dentry);
-		if (filldir(dirent, "..", 2, pos, ino, DT_DIR) < 0)
+		if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) < 0)
 			goto out;
-		pos++;
+		filp->f_pos++;
 		/* fall through */
 	}
 
-	nr_tids = find_tids_after(proc_task(inode)->tgid, pos - 2, tid_array);
+	nr_tids = find_tids_after(proc_task(inode)->tgid, filp->f_pos - 2, tid_array);
 
 	for (i = 0; i < nr_tids; i++) {
-		unsigned long j = PROC_NUMBUF;
+		unsigned long k, j = PROC_NUMBUF;
 		int tid = tid_array[i];
 
 		ino = fake_ino(tid, PROC_TID_INO);
 
+		k = tid;
 		do
-			buf[--j] = '0' + (tid % 10);
-		while (tid /= 10);
+			buf[--j] = '0' + (k % 10);
+		while (k /= 10);
 
-		if (filldir(dirent, buf+j, PROC_NUMBUF-j, pos, ino, DT_DIR) < 0)
+		if (filldir(dirent, buf+j, PROC_NUMBUF-j, filp->f_pos, ino, DT_DIR) < 0)
 			break;
-		pos = tid + 2;
+		filp->f_pos = tid + 2;
 	}
 out:
-	filp->f_pos = pos;
 	return retval;
 }
diff -prauN wli-2.6.0-test8-38/include/linux/init_task.h wli-2.6.0-test8-39/include/linux/init_task.h
--- wli-2.6.0-test8-38/include/linux/init_task.h	2003-10-17 19:14:11.000000000 -0700
+++ wli-2.6.0-test8-39/include/linux/init_task.h	2003-10-18 17:23:20.000000000 -0700
@@ -56,6 +56,29 @@
 	.siglock	= SPIN_LOCK_UNLOCKED, 		\
 }
 
+#define INIT_PID(tsk, type)						\
+{									\
+	.nr	= 0,							\
+	.count	= ATOMIC_INIT(1),					\
+	.task	= &(tsk),						\
+	.task_list = {							\
+			.rb_node = NULL,				\
+		},							\
+	.hash_chain = LIST_HEAD_INIT((tsk).pids[type].pid.hash_chain),	\
+}
+
+#define INIT_PID_LINK(task, type)			\
+	{						\
+		.pid_chain	= {			\
+			.rb_parent = NULL,		\
+			.rb_left  = NULL,		\
+			.rb_right = NULL,		\
+			.rb_color = RB_BLACK,		\
+		},					\
+		.pidptr		= NULL,			\
+		.pid		= INIT_PID(task, type),	\
+	}
+
 /*
  *  INIT_TASK is used to set up the first task table, touch at
  * your own risk!. Base=0, limit=0x1fffff (=2MB)
@@ -113,6 +136,12 @@
 	.proc_lock	= SPIN_LOCK_UNLOCKED,				\
 	.switch_lock	= SPIN_LOCK_UNLOCKED,				\
 	.journal_info	= NULL,						\
+	.pids		= {						\
+				INIT_PID_LINK(tsk, 0),			\
+				INIT_PID_LINK(tsk, 1),			\
+				INIT_PID_LINK(tsk, 2),			\
+				INIT_PID_LINK(tsk, 3),			\
+			},						\
 }
 
 
diff -prauN wli-2.6.0-test8-38/kernel/pid.c wli-2.6.0-test8-39/kernel/pid.c
--- wli-2.6.0-test8-38/kernel/pid.c	2003-10-17 19:16:54.000000000 -0700
+++ wli-2.6.0-test8-39/kernel/pid.c	2003-10-18 18:02:45.000000000 -0700
@@ -167,6 +167,7 @@ task_t *first_task(void)
 	BUG_ON(!node);
 	return rb_entry(node, task_t, tasks);
 }
+EXPORT_SYMBOL(first_task);
 
 void insert_task_list(task_t *task)
 {
@@ -339,6 +340,7 @@ int find_tgids_after(int tgid, int tgids
 	read_unlock(&tasklist_lock);
 	return k;
 }
+EXPORT_SYMBOL(find_tgids_after);
 
 int find_tids_after(int tgid, int tid, int tids[PROC_MAXPIDS])
 {
@@ -348,7 +350,7 @@ int find_tids_after(int tgid, int tid, i
 	int k = 0;
 
 	read_lock(&tasklist_lock);
-	pid = find_pid(tgid, PIDTYPE_TGID);
+	pid = find_pid(PIDTYPE_TGID, tgid);
 	if (!pid)
 		goto out;
 	node = pid->task_list.rb_node;
@@ -373,6 +375,7 @@ out:
 	read_unlock(&tasklist_lock);
 	return k;
 }
+EXPORT_SYMBOL(find_tids_after);
 
 task_t *find_task_by_pid(int nr)
 {

  parent reply	other threads:[~2003-10-19  1:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-18 21:48 reproduceable oops in -test8 Diego Calleja García
2003-10-18 21:57 ` William Lee Irwin III
2003-10-18 22:32   ` Diego Calleja García
2003-10-18 22:41     ` Diego Calleja García
2003-10-19  1:19 ` William Lee Irwin III [this message]
2003-10-19 14:59   ` Diego Calleja García
2003-10-19 19:13     ` William Lee Irwin III
2003-10-19 21:07       ` Diego Calleja García
2003-10-19 21:21         ` William Lee Irwin III

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20031019011949.GD711@holomorphy.com \
    --to=wli@holomorphy.com \
    --cc=aradorlinux@yahoo.es \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.