explanation makes perfect sense to me and the diff is good.

ok dlg@

On 29/12/2010, at 11:03 PM, Thordur Bjornsson wrote:

> hi,
> 
>    so cut vnds over to bufqs. this diff is similar to a diff
>    that was commited, but got backed out after one of the
>    hackathon fiasco's, with a small difference.
> 
>    there is no reason to keep an active count, bufq_peek is
>    enough to figure out if the queue is empty or not.
> 
>    in vndiodone, there is no need to jump through hoops to
>    figure out if we need to disk_unbusy(). We always need to
>    there is a one-to-one against disk_busy() in vndstart, as
>    we set the biodone callback to null so we don't end up there
>    twice.
> 
>    OK?
> 
> ciao, thib. 
> 
> 
> Index: dev/vnd.c
> ===================================================================
> RCS file: /usr/cvs/src/sys/dev/vnd.c,v
> retrieving revision 1.104
> diff -u -p -r1.104 vnd.c
> --- dev/vnd.c 22 Dec 2010 13:12:14 -0000      1.104
> +++ dev/vnd.c 28 Dec 2010 11:54:44 -0000
> @@ -1,4 +1,4 @@
> -/*   $OpenBSD: vnd.c,v 1.104 2010/12/22 13:12:14 jsing Exp $ */
> +/*   $OpenBSD: vnd.c,v 1.92 2009/06/04 05:57:27 krw Exp $    */
> /*    $NetBSD: vnd.c,v 1.26 1996/03/30 23:06:11 christos Exp $        */
> 
> /*
> @@ -127,6 +127,8 @@ struct vnd_softc {
>       struct disk      sc_dk;
>       char             sc_dk_name[16];
> 
> +     struct bufq      sc_bufq;
> +
>       char             sc_file[VNDNLEN];      /* file we're covering */
>       int              sc_flags;              /* flags */
>       size_t           sc_size;               /* size of vnd in sectors */
> @@ -135,7 +137,6 @@ struct vnd_softc {
>       size_t           sc_ntracks;            /* # of tracks per cylinder */
>       struct vnode    *sc_vp;                 /* vnode */
>       struct ucred    *sc_cred;               /* credentials */
> -     struct buf       sc_tab;                /* transfer queue */
>       blf_ctx         *sc_keyctx;             /* key context */
>       struct rwlock    sc_rwlock;
> };
> @@ -209,6 +210,7 @@ vndattach(int num)
>       vnd_softc = (struct vnd_softc *)mem;
>       for (i = 0; i < num; i++) {
>               rw_init(&vnd_softc[i].sc_rwlock, "vndlock");
> +             bufq_init(&vnd_softc[i].sc_bufq, BUFQ_DEFAULT);
>       }
>       numvnd = num;
> 
> @@ -489,8 +491,8 @@ vndstrategy(struct buf *bp)
>                       biodone(bp);
>                       splx(s);
> 
> -                     /* If nothing more is queued, we are done.  */
> -                     if (!vnd->sc_tab.b_active)
> +                     /* If nothing more is queued, we are done. */
> +                     if (!bufq_peek(&vnd->sc_bufq))
>                               return;
> 
>                       /*
> @@ -498,9 +500,8 @@ vndstrategy(struct buf *bp)
>                        * routine might queue using same links.
>                        */
>                       s = splbio();
> -                     bp = vnd->sc_tab.b_actf;
> -                     vnd->sc_tab.b_actf = bp->b_actf;
> -                     vnd->sc_tab.b_active--;
> +                     bp = bufq_dequeue(&vnd->sc_bufq);
> +                     KASSERT(bp != NULL);
>                       splx(s);
>               }
>       }
> @@ -596,13 +597,9 @@ vndstrategy(struct buf *bp)
>                       splx(s);
>                       return;
>               }
> -             /*
> -              * Just sort by block number
> -              */
> -             nbp->vb_buf.b_cylinder = nbp->vb_buf.b_blkno;
> +
> +             bufq_queue(&vnd->sc_bufq, &nbp->vb_buf);
>               s = splbio();
> -             disksort(&vnd->sc_tab, &nbp->vb_buf);
> -             vnd->sc_tab.b_active++;
>               vndstart(vnd);
>               splx(s);
>               bn += sz;
> @@ -625,8 +622,9 @@ vndstart(struct vnd_softc *vnd)
>        * Dequeue now since lower level strategy routine might
>        * queue using same links
>        */
> -     bp = vnd->sc_tab.b_actf;
> -     vnd->sc_tab.b_actf = bp->b_actf;
> +     bp = bufq_dequeue(&vnd->sc_bufq);
> +     if (bp == NULL)
> +             return;
> 
>       DNPRINTF(VDB_IO,
>           "vndstart(%d): bp %p vp %p blkno %lld addr %p cnt %lx\n",
> @@ -675,13 +673,8 @@ vndiodone(struct buf *bp)
> 
> out:
>       putvndbuf(vbp);
> -
> -     if (vnd->sc_tab.b_active) {
> -             disk_unbusy(&vnd->sc_dk, (pbp->b_bcount - pbp->b_resid),
> -                 (pbp->b_flags & B_READ));
> -             if (!vnd->sc_tab.b_actf)
> -                     vnd->sc_tab.b_active--;
> -     }
> +     disk_unbusy(&vnd->sc_dk, (pbp->b_bcount - pbp->b_resid),
> +         (pbp->b_flags & B_READ));
> }
> 
> /* ARGSUSED */

Reply via email to