deleting timer that re-registers itself

Hyeonggon Yoo 42.hyeyoo at gmail.com
Wed May 5 03:22:23 EDT 2021


Thank you Greg and Valdis! I applied simple spinlock and it's now
looks much more safe!
Below is my modified version.

timer.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/time.h>
#include <linux/spinlock.h>

#define MODULE_NAME "TIMER"
#define DELAY (1 * HZ)

struct timer_data {
        int value;
        spinlock_t lock;
        struct timer_list timer;
        bool isActive;
};

struct timer_data my_data = {};

void timer_callback(struct timer_list *timer) {
        struct timer_data *data = from_timer(data, timer, timer);

        data->value++;
        printk(KERN_INFO "[%s] value is = %d\n", __func__, data->value);
        spin_lock(&data->lock);
        if (data->isActive)
                mod_timer(timer, jiffies + DELAY);
        spin_unlock(&data->lock);
}

int __init timer_init(void) {
        printk("[%s] creating timer...\n", __func__);

        /* initialization */
        my_data.isActive = true;
        spin_lock_init(&my_data.lock);
        timer_setup(&my_data.timer, timer_callback, 0);

        /* register timer */
        mod_timer(&my_data.timer, jiffies + DELAY);
        return 0;
}

void __exit timer_exit(void) {
        int ret;

        spin_lock(&my_data.lock);
        my_data.isActive = false;
        ret = del_timer(&my_data.timer);
        spin_unlock(&my_data.lock);

        printk("[%s] deleting timer..., ret = %d\n", __func__, ret);
}

module_init(timer_init);
module_exit(timer_exit);

MODULE_LICENSE("GPL");

2021년 5월 5일 (수) 오전 2:02, Greg KH <greg at kroah.com>님이 작성:
>
> On Tue, May 04, 2021 at 12:35:06PM -0400, Valdis Klētnieks wrote:
> > On Tue, 04 May 2021 12:17:56 -0400, "Valdis KlD tnieks" said:
> >
> > > void __exit timer_exit(void) {
> > >         exiting = 1;
> >
> > -ENOCAFFEINE
> >
> > That still needs a few memory barriers. See Documentation/memory_barriers.txt
> > for the gory details.
>
> Use a real lock, it's much simpler :)
>



More information about the Kernelnewbies mailing list