Panic with dummynet, RELENG_4 (dummynet: heap_extract).
Pawel Malachowski
pawmal-posting at freebsd.lublin.pl
Wed Dec 15 07:07:26 PST 2004
Hello,
It hit me some time ago. 4.10-STABLE, perfectly stable, no
configuration changes for months (only xl(4) replaced with dc(4)),
works rock solid for years. IPFW2, kernel Tue Sep 28 16:04:43 CEST 2004.
This is direct call to panic(9) so probaly this is something
that Should Never Happen. Question: how could it happen?! :)
Details:
panic: dummynet: heap_extract
syncing disks... 2
done
Uptime: 56d3h32m3s
dumping to dev #ad/0x30001, offset 1572992
dump ata0: resetting devices .. done
(kgdb) bt
#0 dumpsys () at ../../kern/kern_shutdown.c:487
#1 0xc023c76f in boot (howto=256) at ../../kern/kern_shutdown.c:316
#2 0xc023cb94 in poweroff_wait (junk=0xc04160b6, howto=-1069457280)
at ../../kern/kern_shutdown.c:595
#3 0xc0293af9 in heap_extract (h=0xc77df138, obj=0xc7251a00)
at ../../netinet/ip_dummynet.c:297
#4 0xc0294df0 in dummynet_io (m=0xc1137b00, pipe_nr=412, dir=1, fwa=0xd8675dd8)
at ../../netinet/ip_dummynet.c:1222
#5 0xc029c8cd in ip_output (m0=0xc1137b00, opt=0x0, ro=0xc04cb7a4, flags=1,
imo=0x0, inp=0x0) at ../../netinet/ip_output.c:1007
#6 0xc029bc82 in ip_forward (m=0xc1137b00, srcrt=0, next_hop=0x0)
at ../../netinet/ip_input.c:1865
#7 0xc029aa87 in ip_input (m=0xc1137b00) at ../../netinet/ip_input.c:699
#8 0xc029ae0f in ipintr () at ../../netinet/ip_input.c:955
#9 0xc03ac1b9 in swi_net_next ()
#10 0xc0242845 in softclock () at ../../kern/kern_timeout.c:131
#11 0xc03ac173 in doreti_swi ()
#12 0x8049edf in ?? ()
#13 0x804a5e6 in ?? ()
#14 0x804b530 in ?? ()
#15 0x2807ae89 in ?? ()
#16 0x2807a9db in ?? ()
#17 0x80498b6 in ?? ()
#18 0x804926d in ?? ()
(kgdb) up 3
#3 0xc0293af9 in heap_extract (h=0xc77df138, obj=0xc7251a00)
at ../../netinet/ip_dummynet.c:297
297 panic("dummynet: heap_extract");
(kgdb) l
292 panic("dummynet: heap_extract from middle not supported
on this heap!!!\n");
293 father = *((int *)((char *)obj + h->offset)) ;
294 if (father < 0 || father >= h->elements) {
295 printf("dummynet: heap_extract, father %d out of bound
0..%d\n",
296 father, h->elements);
297 panic("dummynet: heap_extract");
298 }
299 }
300 RESET_OFFSET(h, father);
301 child = HEAP_LEFT(father) ; /* left child */
Sources:
static void
heap_extract(struct dn_heap *h, void *obj)
{
int child, father, max = h->elements - 1 ;
if (max < 0) {
printf("dummynet: warning, extract from empty heap 0x%p\n", h);
return ;
}
father = 0 ; /* default: move up smallest child */
if (obj != NULL) { /* extract specific element, index is at offset */
if (h->offset <= 0)
panic("dummynet: heap_extract from middle not supported on this heap!!!
father = *((int *)((char *)obj + h->offset)) ;
if (father < 0 || father >= h->elements) {
printf("dummynet: heap_extract, father %d out of bound 0..%d\n",
father, h->elements);
panic("dummynet: heap_extract");
}
}
So: (father < 0 || father >= h->elements) was true.
pipe_nr=412 is a queue, configured like this:
q00412: weight 99 pipe 4 8 KB 512 queues (512 buckets) droptail
mask: 0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
q00410: weight 1 pipe 4 8 KB 0 queues (512 buckets) droptail
mask: 0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
q00411: weight 1 pipe 4 8 KB 515 queues (512 buckets) droptail
mask: 0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
00004: 1.800 Mbit/s 0 ms 12 KB 0 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
--
Paweł Małachowski
More information about the freebsd-ipfw
mailing list