spin_unlock успешно работает без spin_lock в модуле ядра - PullRequest
0 голосов
/ 01 октября 2019

Я написал базовый код ядра, чтобы проверить, могу ли я просто вызвать 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);

Означает ли это, что нет владения спин-блокировками?

...