- 论坛徽章:
- 0
|
本帖最后由 noted2011 于 2014-02-19 14:41 编辑
1ms_int_delay20140219002.zip
(216.22 KB, 下载次数: 17)
humjb_1983 发表于 2014-02-17 09:37
补充下,需要确认下这里的延时是中断延时还是调度延时,需要打点确认。
对中断延时影响最大的就是关中断 ...
用ftrace调试了一下,定位了一下问题,是 __switch_to这块延迟较大,
主要是从 <idle>-0 => 1_l2_Ma-732这个上下文切换延迟较大,有800多us。但是从1_l2_Ma-732 => <idle>-0 只有100us。具体的统计数据细节,可以查看附件。下面粘贴部分数据,注意红色的部分, 1_l2_Ma-732就是进程A。
bpu-3 /sys/kernel/debug/tracing # cat trace
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
1) 1.024 us | pick_next_task_fair();
1) 0.928 us | pick_next_task_rt();
1) 0.928 us | pick_next_task_fair();
1) 0.960 us | pick_next_task_idle();
1) | __switch_to() {
------------------------------------------
1) 1_l2_Ma-732 => <idle>-0
------------------------------------------
1) ! 132.128 us | } /* __switch_to */
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.656 us | }
1) 4.448 us | }
1) 0.992 us | sub_preempt_count();
1) ! 157.088 us | } /* __schedule */
1) 1.056 us | add_preempt_count();
1) | tick_nohz_stop_sched_tick() {
1) | ktime_get() {
1) 0.928 us | ktime_add_ns();
1) 2.880 us | }
1) 0.928 us | timekeeping_max_deferment();
1) 0.928 us | rcu_needs_cpu();
1) 0.896 us | printk_needs_cpu();
1) | get_next_timer_interrupt() {
1) | rt_spin_trylock() {
1) 0.960 us | rt_mutex_trylock();
1) 2.720 us | }
1) 0.928 us | rt_spin_unlock();
1) | hrtimer_get_next_event() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.928 us | add_preempt_count();
1) 2.752 us | }
1) 4.480 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.688 us | }
1) 9.888 us | }
1) + 19.840 us | }
1) 0.960 us | ktime_add_ns();
1) 1.152 us | select_nohz_load_balancer();
1) 1.120 us | rcu_enter_nohz();
1) | hrtimer_start() {
1) | __hrtimer_start_range_ns() {
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.752 us | }
1) 4.448 us | }
1) 6.272 us | }
1) | __remove_hrtimer() {
1) | hrtimer_force_reprogram() {
1) | tick_program_event() {
1) | tick_dev_program_event() {
1) | ktime_get() {
1) 0.896 us | ktime_add_ns();
1) 2.784 us | }
1) 1.088 us | clockevents_program_event();
1) 6.592 us | }
1) 8.480 us | }
1) + 10.368 us | }
1) + 12.288 us | }
1) 0.960 us | ktime_add_ns();
1) 0.928 us | ktime_add_safe();
1) 1.088 us | enqueue_hrtimer();
1) | hrtimer_reprogram() {
1) | tick_program_event() {
1) | tick_dev_program_event() {
1) | ktime_get() {
1) 0.928 us | ktime_add_ns();
1) 2.752 us | }
1) 0.992 us | clockevents_program_event();
1) 6.432 us | }
1) 8.224 us | }
1) + 10.080 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.688 us | }
1) + 41.664 us | }
1) + 43.424 us | }
1) + 81.632 us | }
0) 2.720 us | } /* __raw_spin_lock */
0) 5.216 us | } /* _raw_spin_lock */
0) | activate_task() {
0) | enqueue_task() {
0) | enqueue_task_rt() {
0) | cpupri_set() {
0) | _raw_spin_lock_irqsave() {
0) | __raw_spin_lock_irqsave() {
0) 0.896 us | add_preempt_count();
0) 2.784 us | }
0) 4.608 us | }
0) | _raw_spin_unlock_irqrestore() {
0) 0.896 us | sub_preempt_count();
0) 0.960 us | preempt_schedule();
0) 4.544 us | }
0) | _raw_spin_lock_irqsave() {
0) | __raw_spin_lock_irqsave() {
0) 0.896 us | add_preempt_count();
0) 2.784 us | }
0) 4.544 us | }
0) | _raw_spin_unlock_irqrestore() {
0) 0.928 us | sub_preempt_count();
0) 0.896 us | preempt_schedule();
0) 4.576 us | }
0) + 22.848 us | }
0) 0.928 us | update_rt_migration();
0) + 26.880 us | }
0) + 28.704 us | }
0) + 30.528 us | }
0) 1.088 us | preempt_schedule();
0) | check_preempt_curr_idle() {
0) | resched_task() {
0) | smp_send_reschedule() {
0) 1.088 us | doorbell_message_pass();
1) | doorbell_exception() {
0) 2.848 us | }
1) 0.896 us | smp_message_recv();
0) 4.960 us | }
0) 6.688 us | }
1) 3.040 us | }
0) 0.928 us | task_woken_rt();
1) | tick_nohz_restart_sched_tick() {
0) | _raw_spin_unlock_irqrestore() {
1) | ktime_get() {
0) 0.864 us | sub_preempt_count();
1) 0.896 us | ktime_add_ns();
0) 0.928 us | preempt_schedule();
1) 3.008 us | }
1) 0.928 us | tick_nohz_stop_idle();
0) 4.480 us | }
0) 0.960 us | sub_preempt_count();
1) 1.088 us | rcu_exit_nohz();
0) 0.896 us | preempt_schedule();
1) 1.088 us | select_nohz_load_balancer();
0) + 75.936 us | } /* try_to_wake_up */
0) + 77.728 us | } /* wake_up_process */
1) 1.088 us | tick_do_update_jiffies64();
0) + 79.520 us | } /* int_wake_dl */
0) | riochan_compose() {
1) | account_idle_ticks() {
0) | rio_compose() {
1) 0.960 us | account_idle_time();
0) | riochan_debug() {
0) 1.056 us | rio_debug();
1) 2.752 us | }
1) | hrtimer_cancel() {
0) 3.008 us | }
1) | hrtimer_try_to_cancel() {
0) 0.896 us | set_desc_src();
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
0) 0.896 us | set_desc_dst();
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
0) 1.056 us | set_desc_cnt();
1) 2.752 us | }
0) 0.928 us | clear_ld_eol();
1) 4.448 us | }
1) 6.368 us | }
0) + 12.288 us | }
1) | __remove_hrtimer() {
0) | rio_compose() {
1) | hrtimer_force_reprogram() {
0) | riochan_debug() {
1) | tick_program_event() {
0) 0.928 us | rio_debug();
1) | tick_dev_program_event() {
1) | ktime_get() {
0) 2.720 us | }
1) 0.864 us | ktime_add_ns();
0) 0.896 us | set_desc_src();
1) 2.880 us | }
0) 0.928 us | set_desc_dst();
1) 1.056 us | clockevents_program_event();
0) 0.928 us | set_desc_cnt();
1) 6.624 us | }
1) 8.384 us | }
0) 0.928 us | set_desc_dst();
1) + 10.176 us | }
1) + 12.064 us | }
0) | riochan_debug() {
1) | _raw_spin_unlock_irqrestore() {
0) 0.960 us | rio_debug();
1) 0.864 us | sub_preempt_count();
0) 2.784 us | }
1) 0.864 us | preempt_schedule();
0) 0.896 us | clear_ld_eol();
1) 4.608 us | }
0) + 17.376 us | }
1) + 26.656 us | }
0) + 32.352 us | }
1) + 28.480 us | }
0) | int_kstat_isr() {
1) | hrtimer_forward() {
0) 0.928 us | osp_cpu_clock();
1) 0.960 us | ktime_add_safe();
0) 2.816 us | }
1) 0.896 us | ktime_add_safe();
0) | int_wake_dl() {
0) | wake_up_process() {
1) 4.672 us | }
0) | try_to_wake_up() {
1) | hrtimer_start_range_ns() {
0) 0.864 us | add_preempt_count();
1) | __hrtimer_start_range_ns() {
1) | lock_hrtimer_base() {
0) | task_rq_lock() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
0) | _raw_spin_lock() {
1) 0.832 us | add_preempt_count();
0) | __raw_spin_lock() {
0) 0.864 us | add_preempt_count();
1) 2.720 us | }
1) 4.480 us | }
0) 2.752 us | }
1) 6.272 us | }
0) 5.216 us | }
1) 0.960 us | ktime_add_ns();
0) 7.168 us | }
0) 1.024 us | select_task_rq_rt();
1) 0.928 us | ktime_add_safe();
0) | _raw_spin_unlock() {
1) 0.960 us | enqueue_hrtimer();
0) 0.896 us | sub_preempt_count();
1) | hrtimer_reprogram() {
0) 0.896 us | preempt_schedule();
1) | tick_program_event() {
1) | tick_dev_program_event() {
0) 4.512 us | }
1) | ktime_get() {
0) | _raw_spin_lock() {
1) 0.896 us | ktime_add_ns();
0) | __raw_spin_lock() {
0) 0.928 us | add_preempt_count();
1) 2.880 us | }
1) 1.024 us | clockevents_program_event();
0) 2.688 us | }
0) 4.480 us | }
1) 6.560 us | }
0) | activate_task() {
1) 8.320 us | }
0) | enqueue_task() {
1) + 10.176 us | }
0) | enqueue_task_rt() {
1) | _raw_spin_unlock_irqrestore() {
0) | cpupri_set() {
1) 0.896 us | sub_preempt_count();
0) | _raw_spin_lock_irqsave() {
0) | __raw_spin_lock_irqsave() {
1) 0.928 us | preempt_schedule();
0) 0.896 us | add_preempt_count();
1) 4.672 us | }
1) + 30.176 us | }
0) 2.688 us | }
0) 4.480 us | }
1) + 31.968 us | }
1) + 84.480 us | }
0) | _raw_spin_unlock_irqrestore() {
1) 1.088 us | sub_preempt_count();
0) 0.896 us | sub_preempt_count();
0) 0.928 us | preempt_schedule();
1) | __schedule() {
1) 1.024 us | rcu_sched_qs();
0) 4.512 us | }
0) | _raw_spin_lock_irqsave() {
1) 0.992 us | add_preempt_count();
0) | __raw_spin_lock_irqsave() {
0) 0.896 us | add_preempt_count();
1) | _raw_spin_lock_irq() {
1) | __raw_spin_lock_irqsave() {
0) 2.688 us | }
1) 0.896 us | add_preempt_count();
0) 4.512 us | }
0) | _raw_spin_unlock_irqrestore() {
0) 0.928 us | sub_preempt_count();
1) 2.816 us | }
1) 5.408 us | }
0) 0.896 us | preempt_schedule();
1) 0.896 us | put_prev_task_idle();
0) 4.640 us | }
0) + 22.656 us | }
1) | pick_next_task_rt() {
0) 0.928 us | update_rt_migration();
1) 0.896 us | dequeue_pushable_task();
0) + 26.496 us | }
1) 2.944 us | }
0) + 28.320 us | }
1) | __switch_to() {
0) + 30.144 us | }
0) 0.896 us | preempt_schedule();
------------------------------------------
1) <idle>-0 => 1_l2_Ma-732
------------------------------------------
1) ! 870.304 us | } /* __switch_to */
1) | finish_task_switch() {
0) | check_preempt_curr_idle() {
1) | _raw_spin_unlock() {
0) | resched_task() {
1) 0.928 us | sub_preempt_count();
0) | smp_send_reschedule() {
1) 2.688 us | }
0) 1.024 us | doorbell_message_pass();
1) 4.544 us | }
1) 0.992 us | sub_preempt_count();
0) 2.848 us | }
0) 4.928 us | }
1) ! 990.624 us | } /* __schedule */
0) 6.688 us | }
1) ! 992.512 us | } /* schedule */
0) 1.024 us | task_woken_rt();
1) 0.896 us | __osp_int_wake_unreg();
0) | _raw_spin_unlock_irqrestore() {
1) ! 997.984 us | } /* sys_wait_wakeup */
0) 0.864 us | sub_preempt_count();
0) 0.896 us | preempt_schedule();
1) | sys_wait_wakeup() {
1) 0.896 us | __osp_int_wake_reg();
0) 4.512 us | }
0) 0.928 us | sub_preempt_count();
1) | schedule() {
1) | __schedule() {
0) 0.928 us | preempt_schedule();
1) 1.088 us | rcu_sched_qs();
0) + 75.200 us | }
1) 0.992 us | add_preempt_count();
0) + 76.960 us | }
0) + 78.752 us | }
1) | _raw_spin_lock_irq() {
0) | riochan_compose() {
1) | __raw_spin_lock_irqsave() {
0) | rio_compose() {
1) 0.864 us | add_preempt_count();
0) | riochan_debug() {
0) 0.960 us | rio_debug();
1) 2.816 us | }
1) 4.640 us | }
0) 2.816 us | }
1) | deactivate_task() {
0) 0.928 us | set_desc_src();
1) | dequeue_task() {
1) | dequeue_task_rt() {
0) 0.928 us | set_desc_dst();
1) | update_curr_rt() {
0) 0.928 us | set_desc_cnt();
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
0) 0.960 us | clear_ld_eol();
1) 0.896 us | add_preempt_count();
0) + 11.904 us | }
1) 2.752 us | }
1) 4.512 us | }
0) | rio_compose() {
0) | riochan_debug() {
1) 0.960 us | balance_runtime();
0) 0.992 us | rio_debug();
1) | _raw_spin_unlock() {
0) 2.720 us | }
1) 0.896 us | sub_preempt_count();
0) 1.024 us | set_desc_src();
1) 2.656 us | }
1) + 12.032 us | }
0) 0.928 us | set_desc_dst();
1) | __dequeue_rt_entity() {
0) 0.928 us | set_desc_cnt();
1) | cpupri_set() {
1) | _raw_spin_lock_irqsave() {
0) 0.928 us | set_desc_dst();
1) | __raw_spin_lock_irqsave() {
1) 0.928 us | add_preempt_count();
0) | riochan_debug() {
1) 2.816 us | }
0) 0.960 us | rio_debug();
1) 4.512 us | }
1) | _raw_spin_unlock_irqrestore() {
0) 2.816 us | }
1) 0.864 us | sub_preempt_count();
0) 0.928 us | clear_ld_eol();
1) 2.688 us | }
0) + 18.432 us | }
1) | _raw_spin_lock_irqsave() {
0) + 33.088 us | }
1) | __raw_spin_lock_irqsave() {
0) | int_kstat_isr() {
1) 0.896 us | add_preempt_count();
0) 0.928 us | osp_cpu_clock();
1) 2.816 us | }
0) 2.720 us | }
1) 4.576 us | }
0) | int_wake_dl() {
1) | _raw_spin_unlock_irqrestore() {
0) | wake_up_process() {
1) 0.896 us | sub_preempt_count();
0) | try_to_wake_up() {
0) 0.896 us | add_preempt_count();
1) 2.688 us | }
1) + 19.232 us | }
0) | task_rq_lock() {
1) 0.960 us | update_rt_migration();
0) | _raw_spin_lock() {
1) + 23.072 us | }
0) | __raw_spin_lock() {
1) 0.928 us | dequeue_pushable_task();
0) 0.992 us | add_preempt_count();
1) + 39.552 us | }
0) 2.880 us | }
1) + 41.376 us | }
0) 4.608 us | }
1) + 43.200 us | }
0) 6.720 us | }
1) | pre_schedule_rt() {
0) 1.088 us | select_task_rq_rt();
1) 0.896 us | pull_rt_task();
0) | _raw_spin_unlock() {
1) 2.720 us | }
0) 0.896 us | sub_preempt_count();
1) | _raw_spin_unlock() {
1) 0.864 us | sub_preempt_count();
0) 0.928 us | preempt_schedule();
1) 2.656 us | }
0) 4.480 us | }
1) | load_balance() {
0) | _raw_spin_lock() {
1) 0.960 us | scale_rt_power();
0) | __raw_spin_lock() {
0) 0.896 us | add_preempt_count();
1) 1.088 us | scale_rt_power();
0) 2.720 us | }
0) 4.448 us | }
1) 0.960 us | scale_rt_power();
0) | activate_task() {
0) | enqueue_task() {
1) 0.960 us | scale_rt_power();
0) | enqueue_task_rt() {
0) | cpupri_set() {
1) 0.960 us | scale_rt_power();
0) | _raw_spin_lock_irqsave() {
0) | __raw_spin_lock_irqsave() {
1) 0.928 us | scale_rt_power();
0) 0.896 us | add_preempt_count();
0) 2.720 us | }
0) 4.544 us | }
1) 1.888 us | scale_rt_power();
0) | _raw_spin_unlock_irqrestore() {
0) 0.896 us | sub_preempt_count();
1) 0.960 us | scale_rt_power();
0) 0.896 us | preempt_schedule();
1) + 18.976 us | }
1) 0.928 us | msecs_to_jiffies();
0) 4.576 us | }
0) | _raw_spin_lock_irqsave() {
1) | _raw_spin_lock() {
0) | __raw_spin_lock_irqsave() {
1) | __raw_spin_lock() {
0) 0.864 us | add_preempt_count();
1) 0.928 us | add_preempt_count();
0) 2.784 us | }
1) 2.624 us | }
0) 4.576 us | }
1) 4.448 us | }
0) | _raw_spin_unlock_irqrestore() {
1) | put_prev_task_rt() {
0) 0.864 us | sub_preempt_count();
1) | update_curr_rt() {
1) | _raw_spin_lock() {
0) 0.960 us | preempt_schedule();
1) | __raw_spin_lock() {
1) 0.864 us | add_preempt_count();
0) 4.544 us | }
0) + 22.720 us | }
1) 2.816 us | }
0) 0.864 us | update_rt_migration();
1) 4.480 us | }
1) 0.928 us | balance_runtime();
0) + 26.560 us | }
0) + 28.384 us | }
1) | _raw_spin_unlock() {
0) + 30.176 us | }
1) 1.024 us | sub_preempt_count();
0) 0.896 us | preempt_schedule();
1) 2.816 us | }
0) | check_preempt_curr_idle() {
1) + 11.872 us | }
0) | resched_task() {
1) + 13.760 us | }
0) | smp_send_reschedule() {
1) 0.960 us | pick_next_task_fair();
0) 1.056 us | doorbell_message_pass();
1) 0.864 us | pick_next_task_rt();
0) 2.784 us | }
0) 4.800 us | }
1) 1.120 us | pick_next_task_fair();
0) 6.560 us | }
0) 0.992 us | task_woken_rt();
1) 0.960 us | pick_next_task_idle();
0) | _raw_spin_unlock_irqrestore() {
0) 0.832 us | sub_preempt_count();
1) | __switch_to() {
------------------------------------------
1) 1_l2_Ma-732 => <idle>-0
------------------------------------------
1) ! 131.360 us | } /* __switch_to */
0) 0.832 us | preempt_schedule();
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
0) 4.512 us | }
1) 0.896 us | sub_preempt_count();
0) 0.928 us | sub_preempt_count();
1) 2.688 us | }
0) 0.928 us | preempt_schedule();
1) 4.480 us | }
1) 0.960 us | sub_preempt_count();
0) + 74.912 us | }
0) + 76.672 us | }
1) ! 157.120 us | } /* __schedule */
|
|