私はあなたのコードでもう少し防御的であることを提案します:
#include <linux/module.h>
#include <linux/capability.h>
int do_my_work(void)
{
struct module *mod;
char name[MODULE_NAME_LEN];
int ret, forced = 0;
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM;
/* Set up the name, yada yada */
name[MODULE_NAME_LEN - 1] = '\0';
/* Unless you absolutely need an uninterruptible wait, do this. */
if (mutex_lock_interruptible(&module_mutex) != 0) {
ret = -EINTR;
goto out_stop;
}
mod = find_module(name);
if (!mod) {
ret = -ENOENT;
goto out;
}
if (!list_empty(&mod->modules_which_use_me)) {
/* Debug it. */
}
out:
mutex_unlock(&module_mutex);
out_stop:
return(ret);
}
module_mutexは、モジュールのさまざまな操作でカーネルによって取得されます。それらはすべて/kernel/module.cにあり、次のとおりです。
- 各モジュールを個別に初期化する場合、およびすべてのモジュールを初期化する場合(たとえば、起動時)。
- モジュールの削除
- モジュールが誰にも参照(使用)されないまで待機します。
- / procファイルシステムがモジュールのリストを必要とする場合(oprofileとco。はこれを利用します)。
- トレースポイント関連のコード。トレースポイントの反復と更新。