小编Eva*_*van的帖子

寻找Linux内核模块中意外抢占的原因

我有一个小的Linux内核模块,它是用于尚不存在的硬件的设备驱动程序的原型.代码需要从开始到结束尽可能快地执行一小段计算,持续时间为几微秒.我试图用intel rdtscp指令测量是否可以使用ndelay()模拟计算的调用.我发现它有99.9%的时间按预期运行,但0.1%的时间它有一个非常大的延迟,好像其他东西正在抢占代码,尽管在一个应该禁用中断的自旋锁内运行.这是使用库存Ubuntu 64位内核(4.4.0-112)运行的,没有额外的实时或低延迟补丁.

下面是一些复制此行为的示例代码.这是作为/proc文件系统条目的处理程序编写的,以便于测试,但我只显示了实际计算延迟的函数:

#define ITERATIONS 50000
#define SKIPITER 10
DEFINE_SPINLOCK(timer_lock);
static int timing_test_show(struct seq_file *m, void *v) 
{
  uint64_t i;
  uint64_t first, start, stop, delta, max=0, min=1000000;
  uint64_t avg_ticks;
  uint32_t a, d, c;
  unsigned long flags;
  int above30k=0;

  __asm__ volatile ("rdtscp" : "=a" (a), "=d" (d) : : "rcx");
  first = a | (((uint64_t)d)<<32);
  for (i=0; i<ITERATIONS; i++) {
    spin_lock_irqsave(&timer_lock, flags);
    __asm__ volatile ("rdtscp" : "=a" (a), "=d" (d) : : "rcx");
    start = a …
Run Code Online (Sandbox Code Playgroud)

c real-time smp linux-kernel

14
推荐指数
1
解决办法
478
查看次数

标签 统计

c ×1

linux-kernel ×1

real-time ×1

smp ×1