panic: kmem_malloc
Michael Butler
imb at protected-networks.net
Tue Jan 24 04:49:56 PST 2006
GreenX FreeBSD wrote:
> #sysctl -a | grep ^ata
> ata_composit: 192, 0, 22663, 617, 65421
> ata_request: 200, 0, 45326, 1015, 468333
Right - this is a symptom of a memory leak in the ATA raid driver ..
> But, I little cvsup system.
> #uname -a
> FreeBSD crom.azimutprint.ru 6.0-STABLE FreeBSD 6.0-STABLE #0: Mon Jan 23
> 11:18:32 MSK 2006 -skip-
.. which has not been merged from current. It should look like ..
ITEM SIZE LIMIT USED FREE REQUESTS
[ .. ]
ata_composit: 196, 0, 0, 320, 2039342
ata_request: 200, 0, 0, 437, 9260705
^^^^
Use the attached patch until the fix is merged into 6.x,
Michael Butler, CISSP
Security Consultant
www.protected-networks.net
-------------- next part --------------
*** /usr/src/sys/dev/ata/ata-all.h.orig Sun Nov 27 14:17:57 2005
--- /usr/src/sys/dev/ata/ata-all.h Sun Nov 27 14:22:05 2005
***************
*** 331,336 ****
--- 331,337 ----
u_int32_t wr_depend; /* write depends on subdisks */
u_int32_t wr_done; /* done write subdisks */
struct ata_request *request[32]; /* size must match maps above */
+ long count; /* count required of this composite */
caddr_t data_1;
caddr_t data_2;
};
*** ata-raid.c.orig Mon Nov 28 18:02:01 2005
--- ata-raid.c Mon Nov 28 22:52:53 2005
***************
*** 410,415 ****
--- 410,416 ----
mtx_init(&composite->lock,
"ATA PseudoRAID rebuild lock",
NULL, MTX_DEF);
+ composite->count = request->bytecount;
composite->rd_needed |= (1 << drv);
composite->wr_depend |= (1 << drv);
composite->wr_needed |= (1 << this);
***************
*** 468,473 ****
--- 469,475 ----
mtx_init(&composite->lock,
"ATA PseudoRAID mirror lock",
NULL, MTX_DEF);
+ composite->count = request->bytecount;
composite->wr_needed |= (1 << drv);
composite->wr_needed |= (1 << this);
composite->request[drv] = request;
***************
*** 607,613 ****
/* good data, update how far we've gotten */
else {
bp->bio_resid -= request->donecount;
! if (bp->bio_resid == 0) {
if (composite->wr_done & (1 << mirror))
finished = 1;
}
--- 609,616 ----
/* good data, update how far we've gotten */
else {
bp->bio_resid -= request->donecount;
! composite->count -= request->donecount;
! if (composite->count == 0) {
if (composite->wr_done & (1 << mirror))
finished = 1;
}
***************
*** 621,627 ****
printf("DOH! rebuild failed\n"); /* XXX SOS */
rdp->rebuild_lba = blk;
}
! if (bp->bio_resid == 0)
finished = 1;
}
}
--- 624,630 ----
printf("DOH! rebuild failed\n"); /* XXX SOS */
rdp->rebuild_lba = blk;
}
! if (composite->count == 0)
finished = 1;
}
}
***************
*** 658,667 ****
}
bp->bio_resid -=
composite->request[mirror]->donecount;
}
! else
bp->bio_resid -= request->donecount;
! if (bp->bio_resid == 0)
finished = 1;
}
mtx_unlock(&composite->lock);
--- 661,674 ----
}
bp->bio_resid -=
composite->request[mirror]->donecount;
+ composite->count -=
+ composite->request[mirror]->donecount;
}
! else {
bp->bio_resid -= request->donecount;
! composite->count -= request->donecount;
! }
! if (composite->count == 0)
finished = 1;
}
mtx_unlock(&composite->lock);
***************
*** 723,729 ****
rdp->status &= ~AR_S_REBUILDING;
ata_raid_config_changed(rdp, 1);
}
! biodone(bp);
}
if (composite) {
--- 730,738 ----
rdp->status &= ~AR_S_REBUILDING;
ata_raid_config_changed(rdp, 1);
}
! /* cover the case of a series of composites which are only partly complete */
! if (bp->bio_resid == 0)
! biodone(bp);
}
if (composite) {
More information about the freebsd-stable
mailing list