- 论坛徽章:
- 0
|
瀚海书香 发表于 2014-02-19 19:24
回复 40# humjb_1983
@humjb_1983@noted2011
首先特别感谢大家,特别是瀚海书香 和humjb_1983。
我查看了一下源码,x86_64平台,的确有你说的这个限制__notrace_funcgraph。
忘记之前说我们这个平台用的是powerpc平台,不好意思。我看了一下源代码,powerpc实现的__switch_to没有__notrace_funcgraph。具体代码:前期测试的时间不是很长,同时用ftrace又再跟踪了一下,的确__switch_to(<idle>-0 => 1_l2_Ma-734)有1089.664 us(正常的是800多us),整个syscall(sys_wait_wakeup)的时间有1216.640 us,整个延迟有200多us。因为ftrace的数据量比较大,找到异常的地方不容易,就没有抓取延迟有800多us的。
ftrace的部分测试数据:
1) | sys_wait_wakeup() {
1) 0.864 us | __osp_int_wake_reg();
1) | schedule() {
1) | __schedule() {
1) 1.056 us | rcu_sched_qs();
1) 0.960 us | add_preempt_count();
1) | _raw_spin_lock_irq() {
1) | __raw_spin_lock_irqsave() {
1) 0.864 us | add_preempt_count();
1) 2.688 us | }
1) 4.640 us | }
1) | deactivate_task() {
1) | dequeue_task() {
1) | dequeue_task_rt() {
1) | update_curr_rt() {
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.864 us | add_preempt_count();
1) 2.720 us | }
1) 4.480 us | }
1) 0.960 us | balance_runtime();
1) | _raw_spin_unlock() {
1) 0.928 us | sub_preempt_count();
1) 2.720 us | }
1) + 12.768 us | }
1) | __dequeue_rt_entity() {
1) | cpupri_set() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.928 us | add_preempt_count();
1) 2.816 us | }
1) 4.512 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.720 us | }
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.816 us | }
1) 4.544 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.832 us | sub_preempt_count();
1) 2.656 us | }
1) + 19.104 us | }
1) 0.960 us | update_rt_migration();
1) + 22.912 us | }
1) 0.928 us | dequeue_pushable_task();
1) + 40.256 us | }
1) + 42.080 us | }
1) + 43.968 us | }
1) | pre_schedule_rt() {
1) 0.928 us | pull_rt_task();
1) 2.720 us | }
1) | _raw_spin_unlock() {
1) 0.832 us | sub_preempt_count();
1) 2.784 us | }
1) | load_balance() {
1) 1.088 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) + 18.240 us | }
1) 0.928 us | msecs_to_jiffies();
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.896 us | add_preempt_count();
1) 2.656 us | }
1) 4.448 us | }
1) | put_prev_task_rt() {
1) | update_curr_rt() {
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.928 us | add_preempt_count();
1) 2.688 us | }
1) 4.448 us | }
1) 0.928 us | balance_runtime();
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.656 us | }
1) + 11.712 us | }
1) + 13.504 us | }
1) 0.960 us | pick_next_task_fair();
1) 0.928 us | pick_next_task_rt();
1) 0.928 us | pick_next_task_fair();
1) 0.928 us | pick_next_task_idle();
1) | __switch_to() {
------------------------------------------
1) 1_l2_Ma-734 => <idle>-0
------------------------------------------
1) ! 131.456 us | } /* __switch_to */
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.688 us | }
1) 4.480 us | }
1) 0.992 us | sub_preempt_count();
1) ! 156.544 us | } /* __schedule */
1) 1.056 us | add_preempt_count();
1) | tick_nohz_stop_sched_tick() {
1) | ktime_get() {
1) 1.728 us | ktime_add_ns();
1) 3.680 us | }
1) 0.960 us | timekeeping_max_deferment();
1) 0.960 us | rcu_needs_cpu();
1) 0.960 us | printk_needs_cpu();
1) | get_next_timer_interrupt() {
1) | rt_spin_trylock() {
1) 0.928 us | rt_mutex_trylock();
1) 2.752 us | }
1) 0.960 us | rt_spin_unlock();
1) | hrtimer_get_next_event() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.784 us | }
1) 4.608 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.896 us | sub_preempt_count();
1) 2.784 us | }
1) + 10.112 us | }
1) + 20.224 us | }
1) 0.960 us | ktime_add_ns();
1) 1.184 us | select_nohz_load_balancer();
1) 1.184 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.480 us | }
1) 6.240 us | }
1) | __remove_hrtimer() {
1) | hrtimer_force_reprogram() {
1) | tick_program_event() {
1) | tick_dev_program_event() {
1) | ktime_get() {
1) 0.864 us | ktime_add_ns();
1) 2.816 us | }
1) 1.056 us | clockevents_program_event();
1) 6.592 us | }
1) 8.320 us | }
1) + 10.144 us | }
1) + 12.224 us | }
1) 1.024 us | ktime_add_ns();
1) 0.960 us | ktime_add_safe();
1) 1.024 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.496 us | }
1) 8.256 us | }
1) + 10.112 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.720 us | }
1) + 41.600 us | }
1) + 43.392 us | }
1) + 82.976 us | }
1) | doorbell_exception() {
1) 0.864 us | smp_message_recv();
1) 3.008 us | }
1) | tick_nohz_restart_sched_tick() {
1) | ktime_get() {
1) 0.928 us | ktime_add_ns();
1) 3.040 us | }
1) 0.960 us | tick_nohz_stop_idle();
1) 1.056 us | rcu_exit_nohz();
1) 1.152 us | select_nohz_load_balancer();
1) 1.056 us | tick_do_update_jiffies64();
1) | account_idle_ticks() {
1) 0.960 us | account_idle_time();
1) 2.752 us | }
1) | hrtimer_cancel() {
1) | hrtimer_try_to_cancel() {
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.720 us | }
1) 5.248 us | }
1) 7.008 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.720 us | }
1) 1.024 us | clockevents_program_event();
1) 6.400 us | }
1) 8.128 us | }
1) 9.920 us | }
1) + 11.744 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 0.928 us | preempt_schedule();
1) 4.512 us | }
1) + 26.912 us | }
1) + 28.768 us | }
1) | hrtimer_forward() {
1) 0.928 us | ktime_add_safe();
1) 0.960 us | ktime_add_safe();
1) 4.736 us | }
1) | hrtimer_start_range_ns() {
1) | __hrtimer_start_range_ns() {
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.864 us | add_preempt_count();
1) 2.688 us | }
1) 4.448 us | }
1) 6.208 us | }
1) 0.960 us | ktime_add_ns();
1) 0.960 us | ktime_add_safe();
1) 1.024 us | enqueue_hrtimer();
1) | hrtimer_reprogram() {
1) | tick_program_event() {
1) | tick_dev_program_event() {
1) | ktime_get() {
1) 0.960 us | ktime_add_ns();
1) 2.720 us | }
1) 0.992 us | clockevents_program_event();
1) 6.464 us | }
1) 8.256 us | }
1) + 10.080 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.896 us | sub_preempt_count();
1) 0.928 us | preempt_schedule();
1) 4.576 us | }
1) + 30.144 us | }
1) + 31.936 us | }
1) + 84.864 us | }
1) 1.056 us | sub_preempt_count();
1) | __schedule() {
1) 1.024 us | rcu_sched_qs();
1) 0.960 us | add_preempt_count();
1) | _raw_spin_lock_irq() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.816 us | }
1) 4.608 us | }
1) 0.928 us | put_prev_task_idle();
1) | pick_next_task_rt() {
1) 0.928 us | dequeue_pushable_task();
1) 2.848 us | }
1) | __switch_to() {
------------------------------------------
1) <idle>-0 => 1_l2_Ma-734
------------------------------------------
1) ! 1089.664 us | } /* __switch_to */
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.688 us | }
1) 4.608 us | }
1) 0.992 us | sub_preempt_count();
1) ! 1209.248 us | } /* __schedule */
1) ! 1211.072 us | } /* schedule */
1) 0.928 us | __osp_int_wake_unreg();
1) ! 1216.640 us | } /* sys_wait_wakeup */
1) | sys_wait_wakeup() {
1) 0.896 us | __osp_int_wake_reg();
1) | schedule() {
1) | __schedule() {
1) 1.056 us | rcu_sched_qs();
1) 0.992 us | add_preempt_count();
1) | _raw_spin_lock_irq() {
1) | __raw_spin_lock_irqsave() {
1) 0.864 us | add_preempt_count();
1) 2.688 us | }
1) 4.480 us | }
1) | deactivate_task() {
1) | dequeue_task() {
1) | dequeue_task_rt() {
1) | update_curr_rt() {
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.896 us | add_preempt_count();
1) 2.720 us | }
1) 4.480 us | }
1) 0.960 us | balance_runtime();
1) | _raw_spin_unlock() {
1) 0.864 us | sub_preempt_count();
1) 2.720 us | }
1) + 11.968 us | }
1) | __dequeue_rt_entity() {
1) | cpupri_set() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.928 us | add_preempt_count();
1) 2.784 us | }
1) 4.544 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.816 us | }
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.784 us | }
1) 4.608 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.688 us | }
1) + 19.264 us | }
1) 0.960 us | update_rt_migration();
1) + 23.072 us | }
1) 0.960 us | dequeue_pushable_task();
1) + 39.648 us | }
1) + 41.440 us | }
1) + 43.296 us | }
1) | pre_schedule_rt() {
1) 0.928 us | pull_rt_task();
1) 2.752 us | }
1) | _raw_spin_unlock() {
1) 0.832 us | sub_preempt_count();
1) 2.656 us | }
1) | load_balance() {
1) 0.928 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.896 us | scale_rt_power();
1) 1.056 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) | double_rq_lock() {
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.864 us | add_preempt_count();
1) 2.656 us | }
1) 4.480 us | }
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.864 us | add_preempt_count();
1) 2.656 us | }
1) 4.448 us | }
1) + 11.840 us | }
1) | double_rq_unlock() {
1) | _raw_spin_unlock() {
1) 0.864 us | sub_preempt_count();
1) 2.656 us | }
1) | _raw_spin_unlock() {
1) 1.696 us | sub_preempt_count();
1) 3.520 us | }
1) 8.864 us | }
1) 0.992 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) 0.960 us | scale_rt_power();
1) 0.928 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) 0.992 us | scale_rt_power();
1) + 58.112 us | }
1) 0.960 us | msecs_to_jiffies();
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.896 us | add_preempt_count();
1) 2.688 us | }
1) 4.512 us | }
1) | put_prev_task_rt() {
1) | update_curr_rt() {
1) | _raw_spin_lock() {
1) | __raw_spin_lock() {
1) 0.928 us | add_preempt_count();
1) 2.688 us | }
1) 4.416 us | }
1) 0.928 us | balance_runtime();
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.688 us | }
1) + 11.744 us | }
1) + 13.568 us | }
1) 0.992 us | pick_next_task_fair();
1) 0.960 us | pick_next_task_rt();
1) 0.928 us | pick_next_task_fair();
1) 0.928 us | pick_next_task_idle();
1) | __switch_to() {
------------------------------------------
1) 1_l2_Ma-734 => <idle>-0
------------------------------------------
1) ! 171.392 us | } /* __switch_to */
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
1) 0.928 us | sub_preempt_count();
1) 2.688 us | }
1) 4.544 us | }
1) 0.992 us | sub_preempt_count();
1) ! 196.416 us | } /* __schedule */
1) 1.024 us | add_preempt_count();
1) | tick_nohz_stop_sched_tick() {
1) | ktime_get() {
1) 0.992 us | ktime_add_ns();
1) 3.008 us | }
1) 1.056 us | timekeeping_max_deferment();
1) 0.960 us | rcu_needs_cpu();
1) 0.960 us | printk_needs_cpu();
1) | get_next_timer_interrupt() {
1) | rt_spin_trylock() {
1) 0.928 us | rt_mutex_trylock();
1) 2.688 us | }
1) 0.960 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.912 us | }
1) 4.640 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.752 us | }
1) + 10.240 us | }
1) + 20.384 us | }
1) 0.928 us | ktime_add_ns();
1) 1.216 us | select_nohz_load_balancer();
1) 1.024 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) 1.696 us | add_preempt_count();
1) 3.552 us | }
1) 5.312 us | }
1) 7.104 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.848 us | }
1) 1.088 us | clockevents_program_event();
1) 6.560 us | }
1) 8.352 us | }
1) + 10.208 us | }
1) + 12.192 us | }
1) 0.960 us | ktime_add_ns();
1) 0.960 us | ktime_add_safe();
1) 1.056 us | enqueue_hrtimer();
1) | hrtimer_reprogram() {
1) | tick_program_event() {
1) | tick_dev_program_event() {
1) | ktime_get() {
1) 0.896 us | ktime_add_ns();
1) 2.752 us | }
1) 1.024 us | clockevents_program_event();
1) 6.464 us | }
1) 8.192 us | }
1) + 10.080 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.864 us | sub_preempt_count();
1) 2.720 us | }
1) + 42.624 us | }
1) + 44.576 us | }
1) + 83.488 us | }
1) | doorbell_exception() {
1) 1.024 us | smp_message_recv();
1) 3.168 us | }
1) | tick_nohz_restart_sched_tick() {
1) | ktime_get() {
1) 0.928 us | ktime_add_ns();
1) 2.976 us | }
1) 0.992 us | tick_nohz_stop_idle();
1) 1.056 us | rcu_exit_nohz();
1) 1.088 us | select_nohz_load_balancer();
1) 1.056 us | tick_do_update_jiffies64();
1) | account_idle_ticks() {
1) 0.928 us | account_idle_time();
1) 2.720 us | }
1) | hrtimer_cancel() {
1) | hrtimer_try_to_cancel() {
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.864 us | add_preempt_count();
1) 2.720 us | }
1) 4.544 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.864 us | ktime_add_ns();
1) 2.752 us | }
1) 0.992 us | clockevents_program_event();
1) 6.368 us | }
1) 8.128 us | }
1) 9.952 us | }
1) + 11.840 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.832 us | sub_preempt_count();
1) 0.896 us | preempt_schedule();
1) 4.544 us | }
1) + 26.304 us | }
1) + 28.128 us | }
1) | hrtimer_forward() {
1) 0.928 us | ktime_add_safe();
1) 0.960 us | ktime_add_safe();
1) 4.608 us | }
1) | hrtimer_start_range_ns() {
1) | __hrtimer_start_range_ns() {
1) | lock_hrtimer_base() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.864 us | add_preempt_count();
1) 3.488 us | }
1) 5.248 us | }
1) 7.072 us | }
1) 0.928 us | ktime_add_ns();
1) 0.928 us | ktime_add_safe();
1) 1.056 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) 1.024 us | clockevents_program_event();
1) 6.464 us | }
1) 8.256 us | }
1) + 10.080 us | }
1) | _raw_spin_unlock_irqrestore() {
1) 0.928 us | sub_preempt_count();
1) 0.928 us | preempt_schedule();
1) 4.512 us | }
1) + 30.816 us | }
1) + 32.608 us | }
1) + 84.576 us | }
1) 1.088 us | sub_preempt_count();
1) | __schedule() {
1) 0.992 us | rcu_sched_qs();
1) 0.960 us | add_preempt_count();
1) | _raw_spin_lock_irq() {
1) | __raw_spin_lock_irqsave() {
1) 0.896 us | add_preempt_count();
1) 2.816 us | }
1) 4.608 us | }
1) 0.928 us | put_prev_task_idle();
1) | pick_next_task_rt() {
1) 0.928 us | dequeue_pushable_task();
1) 2.848 us | }
1) | __switch_to() {
------------------------------------------
1) <idle>-0 => 1_l2_Ma-734
------------------------------------------
1) ! 846.400 us | } /* __switch_to */
1) | finish_task_switch() {
1) | _raw_spin_unlock() {
1) 0.896 us | sub_preempt_count();
1) 2.688 us | }
1) 4.544 us | }
1) 0.992 us | sub_preempt_count();
1) ! 1004.864 us | } /* __schedule */
1) ! 1006.720 us | } /* schedule */
1) 0.896 us | __osp_int_wake_unreg();
1) ! 1012.384 us | } /* sys_wait_wakeup */
|
|