lkml.org 
[lkml]   [2011]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: Help with implementing some form of barriers in 3.0 kernels.
    On Wed, Sep 14, 2011 at 10:32 AM, Konrad Rzeszutek Wilk
    <konrad.wilk@oracle.com> wrote:
    >
    > > > +   if (drain) {
    > > > +           struct request_queue *q = bdev_get_queue(preq.bdev);
    > > > +           unsigned long flags;
    > > > +
    >
    > > > +           /* Emulate the original behavior of write barriers */
    > > > +           spin_lock_irqsave(q->queue_lock, flags);
    > > > +           elv_drain_elevator(q);
    > > > +           __blk_run_queue(q);
    > > > +           spin_unlock_irqrestore(q->queue_lock, flags);
    > > > +   }
    > I also had to add:
    >
    > diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
    > index eaf49d1..20fddbc 100644
    > --- a/drivers/block/xen-blkback/blkback.c
    > +++ b/drivers/block/xen-blkback/blkback.c
    > @@ -679,6 +679,10 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
    >                struct request_queue *q = bdev_get_queue(preq.bdev);
    >                unsigned long flags;
    >
    > +               if (!q->elevator) {
    > +                       __end_block_io_op(pending_req, -EOPNOTSUPP);
    > +                       return -EOPNOTSUPP;
    > +               }
    >                /* Emulate the original behavior of write barriers */
    >                spin_lock_irqsave(q->queue_lock, flags);
    >                elv_drain_elevator(q);
    > diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
    > index 52d8893..722714a 100644
    > --- a/drivers/block/xen-blkback/common.h
    > +++ b/drivers/block/xen-blkback/common.h
    > @@ -157,6 +157,7 @@ struct xen_vbd {
    >        /* Cached size parameter. */
    >        sector_t                size;
    >        bool                    flush_support;
    > +       bool                    barrier_support;
    >  };
    >
    >  struct backend_info;
    > diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
    > index da1e27a..7189ecd 100644
    > --- a/drivers/block/xen-blkback/xenbus.c
    > +++ b/drivers/block/xen-blkback/xenbus.c
    > @@ -384,6 +384,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
    >        if (q && q->flush_flags)
    >                vbd->flush_support = true;
    >
    > +       if (q && q->elevator && q->elevator->ops)
    > +               vbd->barrier_support = true;
    > +
    >        DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
    >                handle, blkif->domid);
    >        return 0;
    > @@ -728,7 +731,7 @@ again:
    >        if (err)
    >                goto abort;
    >
    > -       err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);
    > +       err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.barrier_support);
    >
    >        err = xen_blkbk_discard(xbt, be);
    >
    >
    > Otherwise it would crash.. Thought I am not sure why the elevator is not
    > set (the guest is on a LVM LV).

    bio-based DM devices do not have an elevator. But that doesn't mean
    barriers (or FLUSH/FUA) aren't supported and/or needed by the
    underlying devices.
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2011-09-14 17:37    [W:0.025 / U:31.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site