lkml.org 
[lkml]   [2011]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [patch 1/6] sched: use rt.nr_cpus_allowed to recover select_task_rq() cycles
    From
    On Fri, Nov 18, 2011 at 11:17 PM, Mike Galbraith <efault@gmx.de> wrote:
    >
    > rt.nr_cpus_allowed is always available, use it to bail from select_task_rq()
    > when only one cpu can be used, and saves some cycles for pinned tasks.
    >
    > taskset -c 3 pipe-test
    >
    >   PerfTop:     997 irqs/sec  kernel:89.5%  exact:  0.0% [1000Hz cycles],  (all, CPU: 3)
    > ------------------------------------------------------------------------------------------------
    >
    >             Virgin                                    Patched
    >             samples  pcnt function                    samples  pcnt function
    >             _______ _____ ___________________________ _______ _____ ___________________________
    >
    >             2880.00 10.2% __schedule                  3136.00 11.3% __schedule
    >             1634.00  5.8% pipe_read                   1615.00  5.8% pipe_read
    >             1458.00  5.2% system_call                 1534.00  5.5% system_call
    >             1382.00  4.9% _raw_spin_lock_irqsave      1412.00  5.1% _raw_spin_lock_irqsave
    >             1202.00  4.3% pipe_write                  1255.00  4.5% copy_user_generic_string
    >             1164.00  4.1% copy_user_generic_string    1241.00  4.5% __switch_to
    >             1097.00  3.9% __switch_to                  929.00  3.3% mutex_lock
    >              872.00  3.1% mutex_lock                   846.00  3.0% mutex_unlock
    >              687.00  2.4% mutex_unlock                 804.00  2.9% pipe_write
    >              682.00  2.4% native_sched_clock           713.00  2.6% native_sched_clock
    >              643.00  2.3% system_call_after_swapgs     653.00  2.3% _raw_spin_unlock_irqrestore
    >              617.00  2.2% sched_clock_local            633.00  2.3% fsnotify
    >              612.00  2.2% fsnotify                     605.00  2.2% sched_clock_local
    >              596.00  2.1% _raw_spin_unlock_irqrestore  593.00  2.1% system_call_after_swapgs
    >              542.00  1.9% sysret_check                 559.00  2.0% sysret_check
    >              467.00  1.7% fget_light                   472.00  1.7% fget_light
    >              462.00  1.6% finish_task_switch           461.00  1.7% finish_task_switch
    >              437.00  1.5% vfs_write                    442.00  1.6% vfs_write
    >              431.00  1.5% do_sync_write                428.00  1.5% do_sync_write
    > *             413.00  1.5% select_task_rq_fair          404.00  1.5% _raw_spin_lock_irq
    >              386.00  1.4% update_curr                  402.00  1.4% update_curr
    >              385.00  1.4% rw_verify_area               389.00  1.4% do_sync_read
    >              377.00  1.3% _raw_spin_lock_irq           378.00  1.4% vfs_read
    >              369.00  1.3% do_sync_read                 340.00  1.2% pipe_iov_copy_from_user
    >              360.00  1.3% vfs_read                     316.00  1.1% __wake_up_sync_key
    >              342.00  1.2% hrtick_start_fair            313.00  1.1% __wake_up_common
    >
    > Signed-off-by: Mike Galbraith <efault@gmx.de>
    >

    Acked-by: Hillf Danton <dhillf@gmail.com>

    > ---
    >  kernel/sched_fair.c |    3 +++
    >  kernel/sched_rt.c   |    3 +++
    >  2 files changed, 6 insertions(+)
    >
    > Index: linux-3.2.git/kernel/sched_fair.c
    > ===================================================================
    > --- linux-3.2.git.orig/kernel/sched_fair.c
    > +++ linux-3.2.git/kernel/sched_fair.c
    > @@ -2340,6 +2340,9 @@ select_task_rq_fair(struct task_struct *
    >        int want_sd = 1;
    >        int sync = wake_flags & WF_SYNC;
    >
    > +       if (p->rt.nr_cpus_allowed < 2)
    > +               return prev_cpu;
    > +
    >        if (sd_flag & SD_BALANCE_WAKE) {
    >                if (cpumask_test_cpu(cpu, tsk_cpus_allowed(p)))
    >                        want_affine = 1;
    > Index: linux-3.2.git/kernel/sched_rt.c
    > ===================================================================
    > --- linux-3.2.git.orig/kernel/sched_rt.c
    > +++ linux-3.2.git/kernel/sched_rt.c
    > @@ -999,6 +999,9 @@ select_task_rq_rt(struct task_struct *p,
    >
    >        cpu = task_cpu(p);
    >
    > +       if (p->rt.nr_cpus_allowed < 2)
    > +               goto out;
    > +
    >        /* For anything but wake ups, just return the task_cpu */
    >        if (sd_flag != SD_BALANCE_WAKE && sd_flag != SD_BALANCE_FORK)
    >                goto out;
    >
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at  http://vger.kernel.org/majordomo-info.html
    > Please read the FAQ at  http://www.tux.org/lkml/
    >
    >
    >
    \
     
     \ /
      Last update: 2011-11-18 16:41    [W:0.028 / U:0.280 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site