On Wed, Dec 29, 2010 at 01:03:23PM +0000, 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. 

ok krw@

.... Ken

> 
> 
> 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