bitkeeper revision 1.873 (4088061aJxAcmfxVFNME07oyCEdeaQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 22 Apr 2004 17:51:22 +0000 (17:51 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 22 Apr 2004 17:51:22 +0000 (17:51 +0000)
Fix free_irq to not deallocate static irqactions.

xenolinux-2.4.26-sparse/arch/xen/kernel/ctrl_if.c
xenolinux-2.4.26-sparse/arch/xen/kernel/irq.c

index d21b0f90b57c87040f6ea3dcb9ffe07b5edf40dc..7d59ad2e1638da738b6c00fa71bf9dbf0afbc1a3 100644 (file)
@@ -294,9 +294,11 @@ void ctrl_if_resume(void)
     ctrl_if_evtchn = start_info.domain_controller_evtchn;
     ctrl_if_irq    = bind_evtchn_to_irq(ctrl_if_evtchn);
 
+#define SA_STATIC_ACTION 0x01000000 /* so that free_irq() doesn't do kfree() */
     memset(&ctrl_if_irq_action, 0, sizeof(ctrl_if_irq_action));
     ctrl_if_irq_action.handler = ctrl_if_interrupt;
     ctrl_if_irq_action.name    = "ctrl-if";
+    ctrl_if_irq_action.flags   = SA_STATIC_ACTION;
     (void)setup_irq(ctrl_if_irq, &ctrl_if_irq_action);
 }
 
index 07dad7e8ca5db2015f9e376d8232f724e787d024..8154c5b7c397c10f1c80c8b342e15b7fbe255482 100644 (file)
@@ -784,7 +784,9 @@ void free_irq(unsigned int irq, void *dev_id)
                                cpu_relax();
                        }
 #endif
-                       kfree(action);
+#define SA_STATIC_ACTION 0x01000000 /* Is it our duty to free the action? */
+                       if (!(action->flags & SA_STATIC_ACTION))
+                               kfree(action);
                        return;
                }
                printk("Trying to free free IRQ%d\n",irq);