15

在我的驱动程序的 file_operations 结构中,我有:

struct file_operations Fops = {
  read:    device_read,
  write:   device_write,
  unlocked_ioctl:   device_ioctl,
  ...
};

即没有使用ioctl 字段。这足以避免大内核锁并在没有任何同步的情况下进入 device_ioctl() 吗?或者我是否也必须更改代码的用户空间部分中的 ioctl() 调用?

4

3 回答 3

10

阅读这篇 LWN 文章: http: //lwn.net/Articles/119652/

在 2.6.33 和 2.6.35 rc(使用 git-diff 找出哪个提交)之间的某个时候,内核现在会在仅定义 .ioctl 时发出警告。

这是朝着更明确和细粒度的锁定迈出的一步。另请注意,仅更改函数签名和指针将编译但会引入竞争条件的可能性(两个用户空间应用程序同时执行 ioctl 调用)。

于 2010-07-12T18:37:33.693 回答
8

嗯,我解决了这个问题。还需要更改 device_ioctl 函数的签名。没有 inode 参数,而且函数应该返回 long。就像在以下补丁中一样:

-static int st_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd_in, unsigned long arg)
+static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
{

(来自: http: //linux.derkeiler.com/Mailing-Lists/Kernel/2008-01/msg06799.html

于 2009-06-30T13:08:32.823 回答
8

Andi Kleem在 Linux 内核邮件列表上发布了一个使用ioctlto快速和肮脏地转换代码的方法:unlocked_ioctl

[JANITOR PROPOSAL] 将 ioctl 函数切换到 ->unlocked_ioctl

该配方解释了如何调整函数的参数并插入锁定和解锁调用。

于 2011-03-02T22:37:33.137 回答