[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netbsd,09989] Re: NetBSD/5.1 amd64 + dom0 + RAIDFrame で panic する



筒井です

> Tsutsuiさんの言われた
> > の len == 0 のチェックを DIAGNOSTIC チェックより前に移動させると
> > どうなるでしょう?
> 
> の部分を変更したamd64のdom0なカーネルを作り、起動した所、すくなくとも13時間
> パニックせずに動作しました。途中ffmpegなどでいじめても元気です。
> 念のために、元のカーネルに戻した所、あえなく1分程度でpanicしてしまいました。

この件、bus_dma(9)の API的には length==0 で bus_dmamap_load(9)
や bus_dmamap_sync(9) を呼ぶことも許されるようなのですが、
実装上は sys/arch/mips/mips/bus_dma.c などでも len == 0 のとき
DIAGNOSTIC で panic(9) する実装になってしまっているので
それらを全部直す必要があり、また、この DIAGNOSTIC チェックで
バグが判明する場合も皆無ではないということから、
ahcisata側を直した方がよさそうです。

x86/bus_dma.c の修正を元に戻した上で、以下のように
ahcisata_core.c 側で len==0 のチェックを入れるようにした場合も
問題解決するか確認してもらえないでしょうか。

Index: ahcisata_core.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/ahcisata_core.c,v
retrieving revision 1.30
diff -u -p -r1.30 ahcisata_core.c
--- ahcisata_core.c	13 Nov 2010 13:52:00 -0000	1.30
+++ ahcisata_core.c	9 Jan 2011 14:32:47 -0000
@@ -769,7 +769,8 @@ ahci_cmd_start(struct ata_channel *chp, 
 	AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
 	    chp->ch_channel, cmd_h), DEBUG_XFERS);
 	if (ahci_dma_setup(chp, slot,
-	    (ata_c->flags & (AT_READ|AT_WRITE)) ? ata_c->data : NULL,
+	    (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) ?
+	    ata_c->data : NULL,
 	    ata_c->bcount,
 	    (ata_c->flags & AT_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)) {
 		ata_c->flags |= AT_DF;
@@ -904,7 +905,7 @@ ahci_cmd_done(struct ata_channel *chp, s
 	/* this comamnd is not active any more */
 	achp->ahcic_cmds_active &= ~(1 << slot);
 
-	if (ata_c->flags & (AT_READ|AT_WRITE)) {
+	if (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) {
 		bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[slot], 0,
 		    achp->ahcic_datad[slot]->dm_mapsize,
 		    (ata_c->flags & AT_READ) ? BUS_DMASYNC_POSTREAD :

---
Izumi Tsutsui