lkml.org 
[lkml]   [2001]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [BUG()] IrDA in 2.4.16 + preempt

[Jean added to CC]

On Fri, 14 Dec 2001, Pawel Kot wrote:

> I found an annoying problem with irda on 2.4.16.
> When I remove irlan module I get sementation fault:
> root@blurp:~# rmmod irlan
> Dec 14 02:27:35 blurp kernel: kernel BUG at slab.c:1200!
> Dec 14 02:27:35 blurp kernel: invalid operand: 0000
> Dec 14 02:27:35 blurp kernel: CPU: 0
> Dec 14 02:27:35 blurp kernel: EIP: 0010:[kmem_extra_free_checks+81/140] Not tainted
[...]
> Dec 14 02:27:35 blurp kernel: Process rmmod (pid: 110, stackpage=cc045000)
[..]
> Dec 14 02:27:35 blurp kernel: Call Trace:
[kfree+450/576]
[netdev_finish_unregister+145/152]
[unregister_netdevice+451/632]
[unregister_netdev+16/40]

Seems some inconsistency in the way how the irlan netdev is handled:
having NETIF_F_DYNALLOC set for a netdev which is not allocated as an
independent object doesn't seem to be a good idea to me ;-)

The patch below simply removes NETIF_F_DYNALLOC just before calling
unregister_netdev() und should fix the issue. It's untested however,
since I'm unable to reproduce the Oops on UP without preempt (but it
should be there as well, due to ipfrag_time for example). At least it
compiles and doesn't do any harm to me.

IMHO, retiring dynalloc is just some sort of band-aid because I do
believe, using it would be a good idea - but would need some more
changes for irlan.

Btw., I'm not sure about the status of irlan - I'm only using ppp over
ircomm or irnet.

HTH
Martin

-----------------------------

--- linux-2.4.16/net/irda/irlan/irlan_common.c Fri Oct 12 22:04:30 2001
+++ v2.4.16-md/net/irda/irlan/irlan_common.c Mon Dec 17 10:01:53 2001
@@ -282,6 +282,18 @@
while ((skb = skb_dequeue(&self->client.txq)))
dev_kfree_skb(skb);

+ /* NETIF_F_DYNALLOC feature was set by irlan_eth_init() and would
+ * cause the unregister_netdev() to do asynch completion _and_
+ * kfree self->dev afterwards. Which is really bad because the
+ * netdevice was not allocated separately but is embedded in
+ * our control block and therefore gets freed with *self.
+ * Probably there are better solutions, but simply removing
+ * the feature before unregister should solve the Oops.
+ * Note however, this may cause unregister_netdev() to block
+ * until the refcount decreases to zero - which might take
+ * some time, say /proc/sys/net/ipv4/ipfrag_time for example.
+ */
+ self->dev.features &= ~NETIF_F_DYNALLOC;
unregister_netdev(&self->dev);

self->magic = 0;

-
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/

\
 
 \ /
  Last update: 2005-03-22 13:14    [W:0.141 / U:0.232 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site