]> Zhao Yanbai Git Server - kernel.git/commitdiff
时钟中断打断了下半部逻辑的情况下不再添加下半部处理程序
authoracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 11:05:29 +0000 (19:05 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 11 May 2024 11:05:29 +0000 (19:05 +0800)
kernel/clock.c
kernel/irq.c

index e78622f606192fe8746870449f5b7286a354fcfb..66b6764669e9083f4cd86fe143c89521921b84fa 100644 (file)
@@ -42,6 +42,7 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     // 打断后该时钟中断不应该继续减少该进程的时间片,因为这会造成该进程在后续的调底中少了实际的运行时间
     if (1 == current->need_resched) {
         // 这种情况必然已经发生了该时钟中断打断了下半部处理程序
+        // 反之时钟中断打断了下半部处理程序不一定need_resched就为1
         return;
     }
 
@@ -55,7 +56,9 @@ void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
 
     assert(current->ticks >= 0);  // 防止ticks被减到0后再减溢出
 
-    add_irq_bh_handler(clk_bh_handler, NULL);
+    if (reenter == 0) {
+        add_irq_bh_handler(clk_bh_handler, NULL);
+    }
 }
 
 // 开中断执行这个函数
index b25f38244628bab97f982524f3b20940eb4edf8e..2b03adb6444b9a6d391ad813f3d169992d8f2ba0 100644 (file)
@@ -77,6 +77,8 @@ void dump_irq_nr_stack() {
 void irq_bh_handler();
 void schedule();
 
+volatile int reenter_count = 0;
+
 __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     unsigned int irq = regs->irq;
     if (irq >= NR_IRQS) {
@@ -86,8 +88,11 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     irq_desc_t *p = irq_desc + irq;
     irq_action_t *action = p->action;
 
-    assert(irq_disabled());
     reenter++;
+    reenter_count += reenter == 0 ? 0 : 1;
+    assert(irq_disabled());
+    assert(reenter >= 0);
+    assert(reenter <= 1);
 
     // 屏蔽当前中断
     p->chip->disable(irq);
@@ -100,8 +105,8 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
 #if 1
     unsigned long esp;
     asm("movl %%esp, %%eax" : "=a"(esp));
-    printl(MPL_CURRENT, "current %08x %-6s cr3 %08x reenter %d esp %08x ticks %u", current, current->name, current->cr3,
-           reenter, esp, current->ticks);
+    printl(MPL_CURRENT, "current %08x %-6s cr3 %08x reenter %d:%u esp %08x ticks %u", current, current->name,
+           current->cr3, reenter, reenter_count, esp, current->ticks);
 #endif
 
     while (action && action->handler) {