Browse Source

[PATCH] m68k: introduce setup_thread_stack() and end_of_stack()

encapsulates the rest of arch-dependent operations with thread_info access.
Two new helpers - setup_thread_stack() and end_of_stack().  For normal case
the former consists of copying thread_info of parent to new thread_info and
the latter returns pointer immediately past the end of thread_info.

Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Al Viro 19 years ago
parent
commit
10ebffde3d
3 changed files with 14 additions and 4 deletions
  1. 11 0
      include/linux/sched.h
  2. 1 2
      kernel/fork.c
  3. 2 2
      kernel/sched.c

+ 11 - 0
include/linux/sched.h

@@ -1235,6 +1235,17 @@ static inline void task_unlock(struct task_struct *p)
 
 
 #define task_thread_info(task) (task)->thread_info
 #define task_thread_info(task) (task)->thread_info
 
 
+static inline void setup_thread_stack(struct task_struct *p, struct task_struct *org)
+{
+	*task_thread_info(p) = *task_thread_info(org);
+	task_thread_info(p)->task = p;
+}
+
+static inline unsigned long *end_of_stack(struct task_struct *p)
+{
+	return (unsigned long *)(p->thread_info + 1);
+}
+
 /* set thread flags in other task's structures
 /* set thread flags in other task's structures
  * - see asm/thread_info.h for TIF_xxxx flags available
  * - see asm/thread_info.h for TIF_xxxx flags available
  */
  */

+ 1 - 2
kernel/fork.c

@@ -171,10 +171,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	*ti = *orig->thread_info;
 	*tsk = *orig;
 	*tsk = *orig;
 	tsk->thread_info = ti;
 	tsk->thread_info = ti;
-	ti->task = tsk;
+	setup_thread_stack(tsk, orig);
 
 
 	/* One for us, one for whoever does the "release_task()" (usually parent) */
 	/* One for us, one for whoever does the "release_task()" (usually parent) */
 	atomic_set(&tsk->usage,2);
 	atomic_set(&tsk->usage,2);

+ 2 - 2
kernel/sched.c

@@ -4327,10 +4327,10 @@ static void show_task(task_t *p)
 #endif
 #endif
 #ifdef CONFIG_DEBUG_STACK_USAGE
 #ifdef CONFIG_DEBUG_STACK_USAGE
 	{
 	{
-		unsigned long *n = (unsigned long *) (p->thread_info+1);
+		unsigned long *n = end_of_stack(p);
 		while (!*n)
 		while (!*n)
 			n++;
 			n++;
-		free = (unsigned long) n - (unsigned long)(p->thread_info+1);
+		free = (unsigned long)n - (unsigned long)end_of_stack(p);
 	}
 	}
 #endif
 #endif
 	printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
 	printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);