[lkml]   [1998]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: Strange interrupt behaviour

    On Wed, 15 Jul 1998, Gerard Roudier wrote:
    > If you aren't convinced at this point, then you are probably unconvincible
    > at the moment.

    Feel free to try this, which is what I currently have in the i386
    process.c (you need to change the header files to reflect this change

    This essentially keeps a few task-structs around for low memory
    situations, and should work very well in a "steady-state" situation where
    usually processes die at roughly the same rate as they get created. I
    suspect it makes the problem go away at a very low cost, but I haven't
    tested it on a low-lemory machine (or a big-memory machine either, for
    that matter - for all I know it won't even boot).

    This is just cut-and-pasted for you to see the basic approach. It
    essentially acts as a 8-buffer overflow/underflow system (or at least ment
    to act that way modulo any bugs that I have introduced).


    * 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..
    #define EXTRA_TASK_STRUCT 16
    static struct task_struct * task_struct_stack[EXTRA_TASK_STRUCT];
    static int task_struct_stack_ptr = -1;

    struct task_struct * alloc_task_struct(void)
    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) {
    ret = task_struct_stack[index];
    task_struct_stack_ptr = index-1;
    return ret;

    void free_task_struct(struct task_struct *p)
    int index = task_struct_stack_ptr+1;

    if (index < EXTRA_TASK_STRUCT) {
    task_struct_stack[index] = p;
    task_struct_stack_ptr = index;
    } else
    free_pages((unsigned long) p, 1);

    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    Please read the FAQ at

     \ /
      Last update: 2005-03-22 13:43    [W:0.020 / U:0.940 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site