kprobe,函数调度 - 处理器锁定 - Linux内核

时间:2015-02-24 15:11:46

标签: c linux linux-kernel

我为了在所有处理器上运行给定函数而编写了一个函数。除以下情况外,它在所有情况下都能很好地工作:

当我尝试在我注册的kprobe中使用它时。

以下是一些代码:

static DEFINE_MUTEX(entryMutex);
static struct kretprobe my_kprobe = {
.entry_handler = (kprobe_opcode_t *) NULL,
.handler = (kprobe_opcode_t *) process_entry_callback,
.maxactive = 1000,
.data_size = 0
};

static int driver_init(void)
{

    my_kprobe.kp.addr =      (kprobe_opcode_t*)kallsyms_lookup_name("sys_execve");
    if ((ret = register_kretprobe(&my_kprobe)) < 0)
    return -1;
    return 0;
}

void foo(void* nothing)
{
     printk("In foo\n");
}

static int process_entry_callback(struct kretprobe_instance* instance, struct pt_regs* regs)

{
     mutex_lock(&entryMutex);

     for(int i = 0; i < 4; ++i) // assumes there are 4 processors
            run_func(foo, NULL, i);

     mutex_unlock(&entryMutex);
     return 0;
}  


void run_func_wrap(struct function_data* data)
{
    data->func(data->context);
    wake_up_process(data->waiting_task);
    *(data->condition) = TRUE; 
}

void run_func(SCHEDULED_FUNC func, void *context, int processor)
{
    struct function_data data;
    struct task_struct* th;
    BOOLEAN condition = FALSE;

    wait_queue_head_t queue;
init_waitqueue_head(&queue);

     data.func = func;
     data.waiting_task = current;
     data.context = context;
     data.condition = &condition;
     th = kthread_create(sched_func_wrap, &data, "th");
     kthread_bind(th, processor);
     wake_up_process(th);
     wait_event(queue, condition);
}

˚F

在process_entry_callback中调用'run_func'后,我无法运行任何程序。每次我开始一个新的程序它只是卡住了。过了一会儿,我在系统日志中收到“处理器锁定”警告。

我怀疑它与IRQ级别有关。 有什么建议吗?

编辑:

使用以下功能时也会发生这种情况:

smp_call_function_single 

可以在smp.c @ Linux内核源代码中找到。

而不是我的功能:

run_func

0 个答案:

没有答案