変更した別のモジュールから使用されるいくつかの関数を実装するカーネル モジュールを作成しています。システムクラッシュをテストするとき。「アトミック中のスケジューリング」エラーが発生します。
atomic_set()
デバッグ後、 aが呼び出されるとシステムがクラッシュすることに気付きました。非アトミック関数からアトミック関数を呼び出しているということですか? この場合、atomic_set() を使用できませんか? 代わりに何を使用すればよいですか?
また、前述したように、関数を呼び出すために元のカーネル ファイルをいくつか変更しました。自分が作業している場所がアトミック コードかどうかを知るにはどうすればよいですか?
編集:実際のコードを追加する
net/netfilter/ipvs/ip_vs_core.cの451 行目で、関数を呼び出します。
my_callback(svc, skb);
次に、私が持っている別のファイルで:
int my_callback(struct ip_vs_service *svc, struct sk_buff *skb)
{
int swto;
printk(KERN_INFO "callback called \n");
swto = swtoing(svc);
return swto;
}
私の関数は少し長いですが、多くのデバッグを行った結果、行を...swtoing()
でコメントしてもシステムがクラッシュしないことがわかりました。swtoing()
atomic_set()
何か助けはありますか?
編集2:詳細
私が変更しているカーネルモジュールはいっぱいでspin_locks
、そのようなものであることに気付きました.原子的なもの...しかし、私は何を知りません:(