Я написал базовый код ядра, чтобы проверить, могу ли я просто вызвать spin_unlock из другого пути управления ядром, не вызывая spin_lock, и это сработало.
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/spinlock.h>
#include <linux/slab.h>
#include <linux/kthread.h>
MODULE_LICENSE("GPL");
spinlock_t *my_lock;
struct task_struct *mythread;
static int threadfn(void *data)
{
pr_info("Kernel thread running on processor:%d\n", smp_processor_id());
msleep(1000);
pr_info("Kernel thread unlocking without calling lock on processor:%d\n", smp_processor_id());
spin_unlock(my_lock);
return 0;
}
static int __init test_hello_init(void)
{
my_lock = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
spin_lock_init(my_lock);
pr_info("Init function running on processor:%d\n", smp_processor_id());
spin_lock(my_lock);
pr_info("Init function locked once on processor:%d\n", smp_processor_id());
mythread = kthread_run(threadfn, NULL, "mythread");
pr_info("Init function starting kernel thread\n");
pr_info("Init function trying to lock twice on processor:%d\n", smp_processor_id());
spin_lock(my_lock);
pr_info("Init function locked on processor:%d\n", smp_processor_id());
spin_unlock(my_lock);
pr_info("Init function unlocked on processor:%d\n", smp_processor_id());
kfree(my_lock);
return -1;
}
static void __exit test_hello_exit(void)
{
}
module_init(test_hello_init);
module_exit(test_hello_exit);
Означает ли это, что нет владения спин-блокировками?