All, Thanks to the keen eye of David Sze, the cause of the instability in the ips driver in FreeBSD 4.x might have been found. If it's affecting you, please try the attached patch and let me know the results. I'll commit it when everyone is happy with it. Thanks, Scott -------------- next part -------------- Index: ips_commands.c ==================================================================RCS file: /usr/ncvs/src/sys/dev/ips/ips_commands.c,v retrieving revision 1.11.6.1 diff -u -r1.11.6.1 ips_commands.c --- ips_commands.c 13 Jan 2005 00:46:40 -0000 1.11.6.1 +++ ips_commands.c 9 Apr 2005 15:09:50 -0000 @@ -162,8 +162,11 @@ void ips_start_io_request(ips_softc_t *sc) { struct buf *iobuf; + int s + s = splbio(); iobuf = bufq_first(&sc->queue); + splx(s); if(!iobuf) { return; } @@ -171,8 +174,10 @@ if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, IPS_NOWAIT_FLAG)){ return; } - + + s = splbio(); bufq_remove(&sc->queue, iobuf); + splx(s); return; } Index: ips_disk.c ==================================================================RCS file: /usr/ncvs/src/sys/dev/ips/ips_disk.c,v retrieving revision 1.6.6.1 diff -u -r1.6.6.1 ips_disk.c --- ips_disk.c 13 Jan 2005 00:46:40 -0000 1.6.6.1 +++ ips_disk.c 9 Apr 2005 15:07:50 -0000 @@ -128,12 +128,15 @@ static void ipsd_strategy(struct buf *iobuf) { ipsdisk_softc_t *dsc; + int s; dsc = iobuf->b_dev->si_drv1; DEVICE_PRINTF(8,dsc->dev,"in strategy\n"); devstat_start_transaction(&dsc->stats); iobuf->b_driver1 = (void *)(uintptr_t)dsc->sc->drives[dsc->disk_number].drivenum; - bufqdisksort(&dsc->sc->queue, iobuf); + s = splbio(); + bufq_insert_tail(&dsc->sc->queue, iobuf); + splx(s); ips_start_io_request(dsc->sc); }
At 09:17 AM 09/04/2005 -0600, Scott Long wrote this to All:>All, > >Thanks to the keen eye of David Sze, the cause of the instability in the >ips driver in FreeBSD 4.x might have been found. If it's affecting you, >please try the attached patch and let me know the results. I'll commit it >when everyone is happy with it.Scott, I think there's a problem with the ips_commands.c patch. After the bufq_first call succeeds, bufq_remove must be called before the splx or else the iobuf can get issued twice. However, if the subsequent ips_get_free_cmd fails, the iobuf must be put back on the bufq. Two patches are attached to this message: 1. ips.RELENG_4.stability.patch is just the stability patch as described. 2. ips.RELENG_4.mfc-and-stability.patch is an MFC of your IPS cleanup and optimization that you committed to HEAD on 01/28/05, plus the stability patch as described. Both patches survived a "make -j8 buildworld" for me. The problem I'm having now is that ips does not appear to be PAE-ified. With either patch the bus_dmamap_create call fails. Any pointers would be appreciated, this is new territory for me.>Thanks, > >Scott > > >Index: ips_commands.c >==================================================================>RCS file: /usr/ncvs/src/sys/dev/ips/ips_commands.c,v >retrieving revision 1.11.6.1 >diff -u -r1.11.6.1 ips_commands.c >--- ips_commands.c 13 Jan 2005 00:46:40 -0000 1.11.6.1 >+++ ips_commands.c 9 Apr 2005 15:09:50 -0000 >@@ -162,8 +162,11 @@ > void ips_start_io_request(ips_softc_t *sc) > { > struct buf *iobuf; >+ int s > >+ s = splbio(); > iobuf = bufq_first(&sc->queue); >+ splx(s); > if(!iobuf) { > return; > } >@@ -171,8 +174,10 @@ > if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, > IPS_NOWAIT_FLAG)){ > return; > } >- >+ >+ s = splbio(); > bufq_remove(&sc->queue, iobuf); >+ splx(s); > return; > } > >Index: ips_disk.c >==================================================================>RCS file: /usr/ncvs/src/sys/dev/ips/ips_disk.c,v >retrieving revision 1.6.6.1 >diff -u -r1.6.6.1 ips_disk.c >--- ips_disk.c 13 Jan 2005 00:46:40 -0000 1.6.6.1 >+++ ips_disk.c 9 Apr 2005 15:07:50 -0000 >@@ -128,12 +128,15 @@ > static void ipsd_strategy(struct buf *iobuf) > { > ipsdisk_softc_t *dsc; >+ int s; > > dsc = iobuf->b_dev->si_drv1; > DEVICE_PRINTF(8,dsc->dev,"in strategy\n"); > devstat_start_transaction(&dsc->stats); > iobuf->b_driver1 = (void > *)(uintptr_t)dsc->sc->drives[dsc->disk_number].drivenum; >- bufqdisksort(&dsc->sc->queue, iobuf); >+ s = splbio(); >+ bufq_insert_tail(&dsc->sc->queue, iobuf); >+ splx(s); > ips_start_io_request(dsc->sc); > } >-------------- next part -------------- A non-text attachment was scrubbed... Name: ips.RELENG_4.stability.patch Type: application/octet-stream Size: 1538 bytes Desc: not available Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20050411/cabb2026/ips.RELENG_4.stability-0001.obj -------------- next part -------------- A non-text attachment was scrubbed... Name: ips.RELENG_4.mfc-and-stability.patch Type: application/octet-stream Size: 22729 bytes Desc: not available Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20050411/cabb2026/ips.RELENG_4.mfc-and-stability-0001.obj
Folks, I have patched and re-built the 4.11 kernel using the ips.RELENG_4.stability.patch. The IBM x342 with ServeRAID 4Lx now appears to work flawlessly, copying 500MB plus without a single error. Thank you both for your time and effort. Cheers, Anthony. -----Original Message----- From: David Sze [mailto:dsze@alumni.uwaterloo.ca] Sent: 11 April 2005 06:12 To: Scott Long Cc: Anthony Downer; mb@imp.ch; stable@freebsd.org Subject: Re: [PATCH] Stability fixes for IPS driver for 4.x At 09:17 AM 09/04/2005 -0600, Scott Long wrote this to All:>All, > >Thanks to the keen eye of David Sze, the cause of the instability in >the ips driver in FreeBSD 4.x might have been found. If it's affecting>you, please try the attached patch and let me know the results. I'll >commit it when everyone is happy with it.Scott, I think there's a problem with the ips_commands.c patch. After the bufq_first call succeeds, bufq_remove must be called before the splx or else the iobuf can get issued twice. However, if the subsequent ips_get_free_cmd fails, the iobuf must be put back on the bufq. Two patches are attached to this message: 1. ips.RELENG_4.stability.patch is just the stability patch as described. 2. ips.RELENG_4.mfc-and-stability.patch is an MFC of your IPS cleanup and optimization that you committed to HEAD on 01/28/05, plus the stability patch as described. Both patches survived a "make -j8 buildworld" for me. The problem I'm having now is that ips does not appear to be PAE-ified. With either patch the bus_dmamap_create call fails. Any pointers would be appreciated, this is new territory for me.>Thanks, > >Scott > > >Index: ips_commands.c >==================================================================>RCS file: /usr/ncvs/src/sys/dev/ips/ips_commands.c,v >retrieving revision 1.11.6.1 >diff -u -r1.11.6.1 ips_commands.c >--- ips_commands.c 13 Jan 2005 00:46:40 -0000 1.11.6.1 >+++ ips_commands.c 9 Apr 2005 15:09:50 -0000 >@@ -162,8 +162,11 @@ > void ips_start_io_request(ips_softc_t *sc) > { > struct buf *iobuf; >+ int s > >+ s = splbio(); > iobuf = bufq_first(&sc->queue); >+ splx(s); > if(!iobuf) { > return; > } >@@ -171,8 +174,10 @@ > if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, >IPS_NOWAIT_FLAG)){ > return; > } >- >+ >+ s = splbio(); > bufq_remove(&sc->queue, iobuf); >+ splx(s); > return; > } > >Index: ips_disk.c >==================================================================>RCS file: /usr/ncvs/src/sys/dev/ips/ips_disk.c,v >retrieving revision 1.6.6.1 >diff -u -r1.6.6.1 ips_disk.c >--- ips_disk.c 13 Jan 2005 00:46:40 -0000 1.6.6.1 >+++ ips_disk.c 9 Apr 2005 15:07:50 -0000 >@@ -128,12 +128,15 @@ > static void ipsd_strategy(struct buf *iobuf) > { > ipsdisk_softc_t *dsc; >+ int s; > > dsc = iobuf->b_dev->si_drv1; > DEVICE_PRINTF(8,dsc->dev,"in strategy\n"); > devstat_start_transaction(&dsc->stats); > iobuf->b_driver1 = (void > *)(uintptr_t)dsc->sc->drives[dsc->disk_number].drivenum; >- bufqdisksort(&dsc->sc->queue, iobuf); >+ s = splbio(); >+ bufq_insert_tail(&dsc->sc->queue, iobuf); >+ splx(s); > ips_start_io_request(dsc->sc); } >----------------------------------------------------------------- Visit our Internet site at http://www.reuters.com To find out more about Reuters Products and Services visit http://www.reuters.com/productinfo Any views expressed in this message are those of the individual sender, except where the sender specifically states them to be the views of Reuters Ltd.