谁在Linux上调用delay_tsc()

edd*_*yxu 4 linux-kernel

我使用OProfile来分析我的Linux盒子.在分析过程中,我发现除了" native_safe_halt"函数之外," delay_tsc"是消耗cpu周期的第二个最重要的函数(大约10%).这似乎delay_tsc()是一个繁忙的循环.但是谁叫它,它的功能是什么?

pax*_*blo 6

没有人直接调用它,因为它是你链接到的那个源代码中的本地函数.调用它的方法是发布的__delay()函数.

当您调用时__delay(),这将使用delay_fn函数指针(也是该文件的本地)来选择几个延迟函数之一.默认情况下,选择的是delay_loop(),使用x86指令尝试标记时间.

但是,如果use_tsc_delay()已经调用(在引导时),它会将函数指针切换到delay_tsc(),它使用时间戳计数器(CPU计数器)来标记时间.

任何需要合理可靠的高分辨率延迟功能的内核代码都会调用它.你可以看到在引用所有的内核代码__delay 在这里(相当多的地方).

我认为,在分析方面,忽略花在该函数上的时间可能是非常安全的,因为它的意图是延迟.换句话说,花费很长时间才能完成这项工作并不是很有用 - 如果打电话者不想延迟,他们就不会打电话.

该列表中的一些示例:

  • 看门狗定时器使用它来调整内核的速度,使其输出不会相互混淆,延迟当前内核ID的某些倍数.
  • ATI帧缓冲驱动程序似乎将其用于低级访问硬件之间的延迟.实际上,它在许多设备驱动程序中用于此目的相当多.
  • 它在启动时用于计算jiffies与实际硬件速度之间的关系.