15

私のドライバーの file_operations 構造には、次のものがあります。

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

つまり、使用される ioctl フィールドはありません。Big Kernel Lock を回避し、同期せずに device_ioctl() に入るには、これで十分ですか? または、コードのユーザー空間部分でも ioctl() 呼び出しを変更する必要がありますか?

4

3 に答える 3

10

この LWN 記事を読む: http://lwn.net/Articles/119652/

また、2.6.33 と 2.6.35 rc の間のいずれかで (git-diff を使用してどのコミットを見つけるか)、カーネルは .ioctl のみが定義されている場合に WARN するようになりました。

これは、より明示的できめ細かいロックへの移行です。また、関数シグネチャとポインターのみを変更するとコンパイルは行われますが、競合状態 (2 つのユーザー空間アプリが同時に ioctl 呼び出しを行う) が発生する可能性があることに注意してください。

于 2010-07-12T18:37:33.693 に答える
8

Andi Kleem は、 Linux カーネルのメーリング リストに、 ioctltoを使用したコードの簡単な変換のレシピを投稿しました。unlocked_ioctl

[JANITOR PROPOSAL] ioctl 関数を ->unlocked_ioctl に切り替えます

レシピでは、関数のパラメーターを微調整し、ロックとロック解除の呼び出しを挿入する方法について説明しています。

于 2011-03-02T22:37:33.137 に答える
8

Uhm, I solved this. It is also required to change signature of device_ioctl function. There is no inode parameter, and also the function should return long. Just like in following patch:

-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)
{

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

于 2009-06-30T13:08:32.823 に答える