Messages in this thread Patch in this message | | | Subject | [PATCH]: Linux 2.3.22 and the proc/array.c bug - fix | Date | Sun, 17 Oct 1999 12:40:14 +0100 (BST) | From | Alan Cox <> |
| |
This should put the world back in order
diff -u --new-file --recursive --exclude-from ../exclude linux.22p3/arch/i386/kernel/process.c linux.ac/arch/i386/kernel/process.c --- linux.22p3/arch/i386/kernel/process.c Fri Oct 15 19:31:40 1999 +++ linux.ac/arch/i386/kernel/process.c Wed Oct 13 22:54:48 1999 @@ -341,70 +341,6 @@ } /* - * Allocation and freeing of basic task resources. - * - * NOTE! The task struct and the stack go together - * - * The task structure is a two-page thing, and as such - * not reliable to allocate using the basic page alloc - * functions. We have a small cache of structures for - * when the allocations fail.. - * - * This extra buffer essentially acts to make for less - * "jitter" in the allocations.. - * - * On SMP we don't do this right now because: - * - we aren't holding any locks when called, and we might - * as well just depend on the generic memory management - * to do proper locking for us instead of complicating it - * here. - * - if you use SMP you have a beefy enough machine that - * this shouldn't matter.. - */ -#ifndef __SMP__ -#define EXTRA_TASK_STRUCT 16 -static struct task_struct * task_struct_stack[EXTRA_TASK_STRUCT]; -static int task_struct_stack_ptr = -1; -#endif - -struct task_struct * alloc_task_struct(void) -{ -#ifndef EXTRA_TASK_STRUCT - return (struct task_struct *) __get_free_pages(GFP_KERNEL,1); -#else - int index; - struct task_struct *ret; - - index = task_struct_stack_ptr; - if (index >= EXTRA_TASK_STRUCT/2) - goto use_cache; - ret = (struct task_struct *) __get_free_pages(GFP_KERNEL,1); - if (!ret) { - index = task_struct_stack_ptr; - if (index >= 0) { -use_cache: - ret = task_struct_stack[index]; - task_struct_stack_ptr = index-1; - } - } - return ret; -#endif -} - -void free_task_struct(struct task_struct *p) -{ -#ifdef EXTRA_TASK_STRUCT - int index = task_struct_stack_ptr+1; - - if (index < EXTRA_TASK_STRUCT) { - task_struct_stack[index] = p; - task_struct_stack_ptr = index; - } else -#endif - free_pages((unsigned long) p, 1); -} - -/* * No need to lock the MM as we are the last user */ void release_segments(struct mm_struct *mm) diff -u --new-file --recursive --exclude-from ../exclude linux.22p3/include/asm-i386/processor.h linux.ac/include/asm-i386/processor.h --- linux.22p3/include/asm-i386/processor.h Fri Oct 15 19:30:48 1999 +++ linux.ac/include/asm-i386/processor.h Sat Oct 16 20:48:44 1999 @@ -400,8 +412,21 @@ } #define THREAD_SIZE (2*PAGE_SIZE) -extern struct task_struct * alloc_task_struct(void); -extern void free_task_struct(struct task_struct *); +/* + * Allocation and freeing of basic task resources. + * + * NOTE! The task struct and the stack go together + * + * The task structure is a two-page thing, and as such + * not reliable to allocate using the basic page alloc + * functions. We have a small cache of structures for + * when the allocations fail.. + */ +#define alloc_task_struct() \ + ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) + +#define free_task_struct(p) \ + free_pages((unsigned long) p, 1); #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |