lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20070724094202.GA11610@elte.hu> Date: Tue, 24 Jul 2007 11:42:02 +0200 From: Ingo Molnar <mingo@...e.hu> To: Marcin ??lusarz <marcin.slusarz@...il.com> Cc: Jarek Poplawski <jarkao2@...pl>, Jean-Baptiste Vignaud <vignaud@...dmail.fr>, linux-kernel <linux-kernel@...r.kernel.org>, shemminger <shemminger@...ux-foundation.org>, linux-net <linux-net@...r.kernel.org>, netdev <netdev@...r.kernel.org>, Thomas Gleixner <tglx@...utronix.de>, Andrew Morton <akpm@...ux-foundation.org>, Linus Torvalds <torvalds@...ux-foundation.org> Subject: Re: 2.6.20->2.6.21 - networking dies after random time * Ingo Molnar <mingo@...e.hu> wrote: > thanks for tracking it down! Could you try the patch below (ontop an > otherwise unmodified kernel)? This tests the theory whether the > problem is related to the disable_irq_nosync() call in the ne2k > driver's xmit path. Does this solve the hangs too? please try the patch below instead. Ingo Index: linux/kernel/irq/chip.c =================================================================== --- linux.orig/kernel/irq/chip.c +++ linux/kernel/irq/chip.c @@ -231,7 +231,7 @@ static void default_enable(unsigned int /* * default disable function */ -static void default_disable(unsigned int irq) +void default_disable(unsigned int irq) { } Index: linux/kernel/irq/internals.h =================================================================== --- linux.orig/kernel/irq/internals.h +++ linux/kernel/irq/internals.h @@ -10,6 +10,8 @@ extern void irq_chip_set_defaults(struct /* Set default handler: */ extern void compat_irq_chip_set_default_handler(struct irq_desc *desc); +extern void default_disable(unsigned int irq); + #ifdef CONFIG_PROC_FS extern void register_irq_proc(unsigned int irq); extern void register_handler_proc(unsigned int irq, struct irqaction *action); Index: linux/kernel/irq/manage.c =================================================================== --- linux.orig/kernel/irq/manage.c +++ linux/kernel/irq/manage.c @@ -102,7 +102,19 @@ void disable_irq_nosync(unsigned int irq spin_lock_irqsave(&desc->lock, flags); if (!desc->depth++) { desc->status |= IRQ_DISABLED; - desc->chip->disable(irq); + /* + * the _nosync variant of irq-disable suggests that the + * caller is not worried about concurrency but about the + * ordering of the irq flow itself. (such as hardware + * getting confused about certain, normally valid irq + * handling sequences.) So if the default disable handler + * is in place then try the more conservative masking + * instead: + */ + if (desc->chip->disable == default_disable && desc->chip->mask) + desc->chip->mask(irq); + else + desc->chip->disable(irq); } spin_unlock_irqrestore(&desc->lock, flags); } - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists