Linux内核中的__verify_pcpu_ptr函数 - 它有什么作用?

时间:2015-06-14 15:45:06

标签: linux-kernel

#define __verify_pcpu_ptr(ptr)                      
do {                                    
const void __percpu *__vpp_verify = (typeof((ptr) + 0))NULL;    
(void)__vpp_verify;                     
} while (0)

#define VERIFY_PERCPU_PTR(__p)                      
({                                  
__verify_pcpu_ptr(__p);                     
(typeof(*(__p)) __kernel __force *)(__p);           
})

这两个功能有什么作用?它们用于什么?他们是如何运作的?

感谢。

1 个答案:

答案 0 :(得分:1)

这是per_cpu_ptr用来支持指针的方案的一部分,该指针为每个CPU获取不同的值。这里有两个动机:

  1. 确保仅通过per_cpu_ptr宏访问per-cpu数据结构。
  2. 确保为宏指定的参数类型正确。
  3. 重申,这确保了(a)你不会在没有宏的情况下意外访问每个cpu指针(这只会引用N个成员中的第一个),以及(b)你不会无意中使用宏将不正确声明类型的指针强制转换为。

    通过使用这些宏,您可以在类型检查中获得编译器的支持,而无需任何运行时开销。编译器足够智能,最终能够识别出所有这些复杂的机制都会导致没有可观察到的状态变化,但是类型检查将会被执行。因此,您可以获得类型检查的好处,但编译器不会发出实际的可执行代码。