gpt4 book ai didi

multithreading - 识别linux内核模块中的错误

转载 作者:行者123 更新时间:2023-12-04 23:23:37 25 4
gpt4 key购买 nike

我正在标记迈克尔,因为他是第一个。感谢 osgx 和本月最佳员工提供更多信息和帮助。

我正在尝试识别消费者/生产内核模块中的错误。这是大学类(class)给我的一个问题。我的助教想不通,我的教授说如果我上传到网上也没关系( 他认为 Stack 不能弄明白 !)。

  • 我已经包含了模块、makefile 和 Kbuild。
  • 运行程序并不能保证错误会出现。
  • 我认为问题出在第 30 行,因为一个线程可能会冲到第 36 行,并饿死其他线程。我的教授说这不是他想要的。
  • 不相关的问题:第 40 行的目的是什么?这对我来说似乎不合适,但我的教授说这是有目的的。
  • 我的教授说这个错误非常微妙。该错误不是死锁。
  • 我的方法是识别关键部分和共享变量,但我很难过。我不熟悉跟踪(作为一种调试方法),并被告知虽然它可能会有所帮助,但没有必要识别问题。

  • 文件:final.c
    #include <linux/completion.h>
    #include <linux/init.h>
    #include <linux/kthread.h>
    #include <linux/module.h>

    static int actor_kthread(void *);
    static int writer_kthread(void *);

    static DECLARE_COMPLETION(episode_cv);
    static DEFINE_SPINLOCK(lock);
    static int episodes_written;
    static const int MAX_EPISODES = 21;
    static bool show_over;
    static struct task_info {
    struct task_struct *task;
    const char *name;
    int (*threadfn) (void *);
    } task_info[] = {
    {.name = "Liz", .threadfn = writer_kthread},
    {.name = "Tracy", .threadfn = actor_kthread},
    {.name = "Jenna", .threadfn = actor_kthread},
    {.name = "Josh", .threadfn = actor_kthread},
    };

    static int actor_kthread(void *data) {
    struct task_info *actor_info = (struct task_info *)data;
    spin_lock(&lock);
    while (!show_over) {
    spin_unlock(&lock);
    wait_for_completion_interruptible(&episode_cv); //Line 30
    spin_lock(&lock);
    while (episodes_written) {
    pr_info("%s is in a skit\n", actor_info->name);
    episodes_written--;
    }
    reinit_completion(&episode_cv); // Line 36
    }

    pr_info("%s is done for the season\n", actor_info->name);
    complete(&episode_cv); //Why do we need this line?
    actor_info->task = NULL;
    spin_unlock(&lock);
    return 0;
    }

    static int writer_kthread(void *data) {
    struct task_info *writer_info = (struct task_info *)data;
    size_t ep_num;

    spin_lock(&lock);
    for (ep_num = 0; ep_num < MAX_EPISODES && !show_over; ep_num++) {
    spin_unlock(&lock);

    /* spend some time writing the next episode */
    schedule_timeout_interruptible(2 * HZ);

    spin_lock(&lock);
    episodes_written++;
    complete_all(&episode_cv);
    }

    pr_info("%s wrote the last episode for the season\n", writer_info->name);
    show_over = true;
    complete_all(&episode_cv);
    writer_info->task = NULL;
    spin_unlock(&lock);
    return 0;
    }

    static int __init tgs_init(void) {
    size_t i;
    for (i = 0; i < ARRAY_SIZE(task_info); i++) {
    struct task_info *info = &task_info[i];
    info->task = kthread_run(info->threadfn, info, info->name);
    }
    return 0;
    }

    static void __exit tgs_exit(void) {
    size_t i;
    spin_lock(&lock);
    show_over = true;
    spin_unlock(&lock);
    for (i = 0; i < ARRAY_SIZE(task_info); i++)
    if (task_info[i].task)
    kthread_stop(task_info[i].task);
    }

    module_init(tgs_init);
    module_exit(tgs_exit);
    MODULE_DESCRIPTION("CS421 Final");
    MODULE_LICENSE("GPL");

    文件:kbuild
    Kobj-m := final.o

    文件:生成文件
    # Basic Makefile to pull in kernel's KBuild to build an out-of-tree
    # kernel module

    KDIR ?= /lib/modules/$(shell uname -r)/build

    all: modules

    clean modules:

    最佳答案

    tgs_exit() 中清理时该函数在不持有自旋锁的情况下执行以下操作:

        if (task_info[i].task)
    kthread_stop(task_info[i].task);

    结束的线程可以设置为 task_info[i].task在检查和调用 kthread_stop() 之间为 NULL .

    关于multithreading - 识别linux内核模块中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44014116/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com