具有关键区域的Linux内核调度

时间:2019-03-21 10:22:29

标签: linux-kernel locking scheduling

我已经为USB设备编写了Linux内核模块。 USB驱动程序提供2个只读字符设备,这些设备只能通过一个进程专门打开:

  • /dev/cdev_a
  • /dev/cdev_b

USB设备一次只能处理一个请求。

测试设置如下:

  • 进程A从第一个设备dd if=/dev/cdev_a of=/tmp/a bs=X读取数据
  • 进程B从第二个设备读取数据:dd if=/dev/cdev_b of=/tmp/b bs=X
  • 进程A和B并行运行
  • 10秒后,两个进程都被杀死,并且比较了两个输出文件的大小。

对于X的某些值,两个文件之间的大小差异很大,这是我所不希望的。

对驱动程序的读取调用将执行以下操作:

  1. mutex_lock_interruptible(iolock)
  2. usb_bulk_msg(dev, pipe, buf, X, timeout)
  3. mutex_unlock(iolock)
  4. copy_to_user(buf)

我期望的是以下内容:

  1. 步骤A:mutex_lock_interruptible(iolock)
  2. 步骤A:usb_bulk_msg(dev, pipe, buf, X, timeout)
  3. 计划:A-> B
  4. 过程B:mutex_lock_interruptible(iolock)->块
  5. 计划:B-> A
  6. 步骤A:mutex_unlock(iolock)
  7. 步骤A:copy_to_user(buf)
  8. 步骤A:mutex_lock_interruptible(iolock)->块
  9. 计划:A-> B
  10. 过程B:usb_bulk_msg(dev, pipe, buf, X, timeout)

但是我在ftrace中看到的是,在步骤8中,进程A仍在继续。似乎对于某些X值,关键区域内的时间是时间片的倍数,因此,当关键区域被阻塞时,进程B总是获得时间片。什么是最佳实践解决方案?我正在考虑在复制到用户空间或使用不错的值或使用wait_queues之后每次调用schedule()吗?

0 个答案:

没有答案