From owner-freebsd-current@FreeBSD.ORG Wed Oct 5 13:14:01 2005 Return-Path: X-Original-To: freebsd-current@freebsd.org Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DA64516A448 for ; Wed, 5 Oct 2005 13:14:00 +0000 (GMT) (envelope-from peadar.edwards@gmail.com) Received: from zproxy.gmail.com (zproxy.gmail.com [64.233.162.207]) by mx1.FreeBSD.org (Postfix) with ESMTP id A4CE643D49 for ; Wed, 5 Oct 2005 13:13:59 +0000 (GMT) (envelope-from peadar.edwards@gmail.com) Received: by zproxy.gmail.com with SMTP id z31so29976nzd for ; Wed, 05 Oct 2005 06:13:59 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:references; b=j5N9FzBv4UbrdNDwKde/BvkY3dSGhu4GKmvvHzNTpuCl/zKgC78eVSJWQ5eP6zgNeNNm/XYJq/FcscUMjMX3unJEJ94yByhLYrC/paWUDExWNb93JPWxZEe4khcscgVsBtgobwITpJO0Lw76zYing8mZIUfu0V9Rt+SY3qZ8w4U= Received: by 10.36.227.3 with SMTP id z3mr466205nzg; Wed, 05 Oct 2005 06:13:59 -0700 (PDT) Received: by 10.36.68.16 with HTTP; Wed, 5 Oct 2005 06:13:59 -0700 (PDT) Message-ID: <34cb7c840510050613u36e76be1pef82c41130da8804@mail.gmail.com> Date: Wed, 5 Oct 2005 14:13:59 +0100 From: Peter Edwards To: freebsd-current@freebsd.org In-Reply-To: <200509291303.41181.jhb@FreeBSD.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_12820_8414373.1128518039151" References: <34cb7c8405092815247dc89bf6@mail.gmail.com> <1127978233.3383.12.camel@berloga.shadowland> <200509291303.41181.jhb@FreeBSD.org> Cc: jkim@freebsd.org Subject: Re: biodone panics X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Peter Edwards List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Oct 2005 13:14:01 -0000 ------=_Part_12820_8414373.1128518039151 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Take 2 for the biodone() panics: acd_geom_start() implements request limiting by breaking up a large request in the passed bio into a sequence of smaller ones. As each request is created, acd_strategy is invoked to start the IO. However, I think this IO can complete while still issuing the child requests, leading to the parent being retired early. (ie, when a child operation completes, it checks if its the last operation to complete, and, if so, retires the parent: see g_std_done.) The attached patch makes my qemu box much more reliable (I could crash a qemu hosted system 100% with a "tar fc" of the 6.0-BETA bootonly ISO without the patch, and it's gone through many iterations fine with it) Any opinions/testing results welcome. ------=_Part_12820_8414373.1128518039151 Content-Type: text/plain; name=ata-geom.txt; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ata-geom.txt" Index: sys/dev/ata/atapi-cd.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-cd.c,v retrieving revision 1.179.2.1 diff -u -r1.179.2.1 atapi-cd.c --- sys/dev/ata/atapi-cd.c 25 Aug 2005 16:21:05 -0000 1.179.2.1 +++ sys/dev/ata/atapi-cd.c 5 Oct 2005 12:01:33 -0000 @@ -760,7 +760,7 @@ } else { u_int pos, size = cdp->iomax - cdp->iomax % bp->bio_to->sectorsize; - struct bio *bp2; + struct bio *bp2, *first, *cur, **next = &first; for (pos = 0; pos < bp->bio_length; pos += size) { if (!(bp2 = g_clone_bio(bp))) { @@ -773,7 +773,13 @@ bp2->bio_data += pos; bp2->bio_length = MIN(size, bp->bio_length - pos); bp2->bio_pblkno = bp2->bio_offset / bp2->bio_to->sectorsize; - acd_strategy(bp2); + *next = bp2; + next = (struct bio **)&bp2->bio_driver1; + } + *next = 0; + while ((cur = first) != 0) { + first = (struct bio *)cur->bio_driver1; + acd_strategy(cur); } } } ------=_Part_12820_8414373.1128518039151--