Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1260149
| From | pawandeep oza <oza.contri.linux.kernel@gmail.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH] manage/irq.c <misleading WARNING: Trying to free already-free IRQ> |
| Date | 2015-11-01 12:50 +0100 |
| Message-ID | <qpZj3-7Fy-5@gated-at.bofh.it> (permalink) |
| Organization | linux.* mail to news gateway |
Hello,
there is this WARNING coming "Trying to free already-free IRQ"
but that warning suggests that we are either calling free_irq twice
or
request_irq has not been made.
bu the problem was, free_irq was being called with invalid/NULL device id.
but the warning is misleading which does not hint to the invalid/NULL device id.
and this is not a shared interrupt, should not be some "meaningful
warning to be given" ??
also why to iterate through the list if it is not shared ?
patch below to address this.
(though I am still thinking if this is an optimal/good way to address it)
or even there is a need to address !
------------------------------------------------------------------------------
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 3dc6a61..87a3ea0 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1305,6 +1305,7 @@ static struct irqaction *__free_irq(unsigned int
irq, void *dev_id)
struct irq_desc *desc = irq_to_desc(irq);
struct irqaction *action, **action_ptr;
unsigned long flags;
+ bool shared = false;
WARN(in_interrupt(), "Trying to free IRQ %d from IRQ context!\n", irq);
@@ -1322,15 +1323,34 @@ static struct irqaction *__free_irq(unsigned
int irq, void *dev_id)
action = *action_ptr;
if (!action) {
- WARN(1, "Trying to free already-free IRQ %d\n", irq);
+ if (!shared) {
+ WARN(1, "Trying to free already-free
IRQ %d\n", irq);
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+
+ return NULL;
+ }
+ else {
+ WARN(1, "irq mismatch with device %d\n", irq);
+ raw_spin_unlock_irqrestore(&desc->lock, flags);
+
+ return NULL;
+ }
+ }
+
+ if (action->dev_id == dev_id)
+ break;
+
+ if (action->flags & IRQF_SHARED) {
+ action_ptr = &action->next;
+ shared = true;
+ }
+ else {
+ WARN(1, "irq mismatch with device %d\n", irq);
raw_spin_unlock_irqrestore(&desc->lock, flags);
return NULL;
}
- if (action->dev_id == dev_id)
- break;
- action_ptr = &action->next;
}
/* Found it - now remove it from the list of entries: */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next | Find similar | Unroll thread
[PATCH] manage/irq.c <misleading WARNING: Trying to free already-free IRQ> pawandeep oza <oza.contri.linux.kernel@gmail.com> - 2015-11-01 12:50 +0100
csiph-web