kthread_stop always returning -EINTR?

Martin Galvan omgalvan.86 at gmail.com
Tue Jul 18 12:00:11 EDT 2017


Hi everyone! I'm doing a bit of testing on the Linux kthread functions, and have the following module:

#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/smp.h>
#include <linux/cpumask.h>
#include <linux/err.h>

MODULE_LICENSE("GPL");

int function(void *data)
{
    printk(KERN_DEBUG "CPU: %u\n", smp_processor_id());

    do_exit(0); /* Not sure if this is ok */
}

/* Function executed upon loading driver */
int __init init_module(void)
{
    unsigned int cpu;

    printk(KERN_DEBUG "init\n");

    for_each_present_cpu(cpu)
    {
        struct task_struct *thread = kthread_create(function, NULL, "Thread %u", cpu);

        if (!IS_ERR(thread))
        {
            int result;

            /* Bind the thread to the current core */
            kthread_bind(thread, cpu);

            /* Start the thread */
            wake_up_process(thread);

            /* Wait for the thread function to complete */
            result = kthread_stop(thread);

            printk(KERN_DEBUG "Thread %u stopped with result %d\n", cpu, result);
        }
        else
        {
            printk(KERN_ALERT "Could not create a thread bound to core number %u\n", cpu);
            break;
        }
    }

    return 0;
}

/* Function executed when unloading module */
void cleanup_module(void)
{
    printk(KERN_DEBUG "exit\n");
}

>From what I understood, I should be able to see all the "CPU: ..." prints before init_module ends. However, kthread_stop is always returning -EINTR, as if wake_up_process wasn't actually being called. What am I doing wrong?

(Please CC me directly when you answer this)



More information about the Kernelnewbies mailing list