【问题标题】:How to modify kernel timer_list timeout如何修改内核 timer_list 超时
【发布时间】:2015-07-13 10:22:43
【问题描述】:

我正在为我的内核模块中的某些参数实现超时。

所以我使用 struct timer_list 和相关 API 来实现 12 秒计时器。

正如我在 IBM developer Works guide for kernel timers 中提到的那样:

struct timer_list my_timer;
init_timer_on_stack(&my_timer);

void tick_timer()
{
    my_timer.expires = jiffies + delay * HZ; //delay is global variable int = 12.
    my_timer.data=0;
    my_timer.function = my_timer_func;
    add_timer(&my_timer);
}

所以每次我的计时器到期时,我都会在my_timer_func 中工作并再次致电tick_timer 以重置计时器。

接下来,我想将delay 实现为 sysctl 条目。 但更改应立即调用tick_timer 函数并使用新的delay 重置计时器。那么我怎样才能检测到这种变化并删除任何当前的计时器或重置它。

是否应该有内核线程来检测delay的变化

【问题讨论】:

    标签: timer linux-kernel timeout linux-device-driver kernel-module


    【解决方案1】:

    内核没有检测变量变化的机制。相反,您应该在您的代码更改您的变量之前/之后执行相应的操作。

    当您添加 sysctl 条目时,您还为其设置了处理程序 (ctl_table->proc_handler)。此处理程序定义了在调用条目的读/写方法时执行的操作。标准proc_do* 函数仅设置/获取变量的值,因此您应该定义您的处理程序。像这样的:

    int my_handler(struct ctl_table *table, int write,
         void __user *buffer, size_t *lenp, loff_t *ppos)
    {
        // Call standard helper..
        int res = proc_dointvec(table, write, buffer, lenp, ppos);
        if(write && !res) { 
           // Additional actions on successfull write.
        }
        return res;
    }
    

    可以使用mod_timer函数修改定时器的超时时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2019-05-12
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多