lkml.org 
[lkml]   [1998]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    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
    too).

    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).

    Linus

    -----
    /*
    * 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) {
    use_cache:
    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 majordomo@vger.rutgers.edu
    Please read the FAQ at http://www.altern.org/andrebalsa/doc/lkml-faq.html

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