lkml.org 
[lkml]   [2012]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 18/35] autonuma: alloc/free/init sched_autonuma
    On Fri, May 25, 2012 at 07:02:22PM +0200, Andrea Arcangeli wrote:
    > This is where the dynamically allocated sched_autonuma structure is
    > being handled.
    >
    > The reason for keeping this outside of the task_struct besides not
    > using too much kernel stack, is to only allocate it on NUMA
    > hardware. So the not NUMA hardware only pays the memory of a pointer
    > in the kernel stack (which remains NULL at all times in that case).
    >
    > If the kernel is compiled with CONFIG_AUTONUMA=n, not even the pointer
    > is allocated on the kernel stack of course.
    >
    > Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
    > ---
    > kernel/fork.c | 24 ++++++++++++++----------
    > 1 files changed, 14 insertions(+), 10 deletions(-)
    >
    > diff --git a/kernel/fork.c b/kernel/fork.c
    > index 237c34e..d323eb1 100644
    > --- a/kernel/fork.c
    > +++ b/kernel/fork.c
    > @@ -206,6 +206,7 @@ static void account_kernel_stack(struct thread_info *ti, int account)
    > void free_task(struct task_struct *tsk)
    > {
    > account_kernel_stack(tsk->stack, -1);
    > + free_sched_autonuma(tsk);
    > free_thread_info(tsk->stack);
    > rt_mutex_debug_task_free(tsk);
    > ftrace_graph_exit_task(tsk);
    > @@ -260,6 +261,8 @@ void __init fork_init(unsigned long mempages)
    > /* do the arch specific task caches init */
    > arch_task_cache_init();
    >
    > + sched_autonuma_init();
    > +
    > /*
    > * The default maximum number of threads is set to a safe
    > * value: the thread structures can take up at most half
    > @@ -292,21 +295,21 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
    > struct thread_info *ti;
    > unsigned long *stackend;
    > int node = tsk_fork_get_node(orig);
    > - int err;
    >
    > tsk = alloc_task_struct_node(node);
    > - if (!tsk)
    > + if (unlikely(!tsk))
    > return NULL;
    >
    > ti = alloc_thread_info_node(tsk, node);
    > - if (!ti) {
    > - free_task_struct(tsk);
    > - return NULL;
    > - }
    > + if (unlikely(!ti))

    Should those "unlikely" have their own commit? Did you
    run this with the likely/unlikely tracer to confirm that it
    does give a sppedup?


    > + goto out_task_struct;
    >
    > - err = arch_dup_task_struct(tsk, orig);
    > - if (err)
    > - goto out;
    > + if (unlikely(arch_dup_task_struct(tsk, orig)))
    > + goto out_thread_info;
    > +
    > + if (unlikely(alloc_sched_autonuma(tsk, orig, node)))
    > + /* free_thread_info() undoes arch_dup_task_struct() too */
    > + goto out_thread_info;
    >
    > tsk->stack = ti;
    >
    > @@ -334,8 +337,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
    >
    > return tsk;
    >
    > -out:
    > +out_thread_info:
    > free_thread_info(ti);
    > +out_task_struct:
    > free_task_struct(tsk);
    > return NULL;
    > }
    >
    > --
    > To unsubscribe, send a message with 'unsubscribe linux-mm' in
    > the body to majordomo@kvack.org. For more info on Linux MM,
    > see: http://www.linux-mm.org/ .
    > Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
    > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
    >


    \
     
     \ /
      Last update: 2012-05-30 23:01    [W:2.782 / U:1.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site