[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 14/17] plat/xen/drivers/blk: Flush requests
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx> On 10/30/19 5:54 PM, Roxana Nicolescu wrote: > This patch introduces the flush requests. > This operation garantees that all previous write requests are finished. > > Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx> > --- > plat/xen/drivers/blk/blkfront.c | 25 +++++++++++++++++++++++++ > plat/xen/drivers/blk/blkfront.h | 8 ++++++++ > plat/xen/drivers/blk/blkfront_xs.c | 15 +++++++++++++++ > 3 files changed, 48 insertions(+) > > diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c > index 2129f191..5866c8e7 100644 > --- a/plat/xen/drivers/blk/blkfront.c > +++ b/plat/xen/drivers/blk/blkfront.c > @@ -150,6 +150,29 @@ static int blkfront_request_write(struct > blkfront_request *blkfront_req, > return rc; > } > > +static int blkfront_request_flush(struct blkfront_request *blkfront_req, > + struct blkif_request *ring_req) > +{ > + struct blkfront_dev *dev; > + struct uk_blkdev_queue *queue; > + > + UK_ASSERT(ring_req); > + > + queue = blkfront_req->queue; > + dev = queue->dev; > + if (dev->barrier) > + ring_req->operation = BLKIF_OP_WRITE_BARRIER; > + else if (dev->flush) > + ring_req->operation = BLKIF_OP_FLUSH_DISKCACHE; > + else > + return -ENOTSUP; > + > + ring_req->nr_segments = 0; > + ring_req->sector_number = 0; > + > + return 0; > +} > + > static int blkfront_queue_enqueue(struct uk_blkdev_queue *queue, > struct uk_blkreq *req) > { > @@ -179,6 +202,8 @@ static int blkfront_queue_enqueue(struct uk_blkdev_queue > *queue, > if (req->operation == UK_BLKDEV_READ || > req->operation == UK_BLKDEV_WRITE) > rc = blkfront_request_write(blkfront_req, ring_req); > + else if (req->operation == UK_BLKDEV_FFLUSH) > + rc = blkfront_request_flush(blkfront_req, ring_req); > else > rc = -EINVAL; > > diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h > index ec727fc8..93d2905d 100644 > --- a/plat/xen/drivers/blk/blkfront.h > +++ b/plat/xen/drivers/blk/blkfront.h > @@ -89,6 +89,14 @@ struct blkfront_dev { > struct uk_blkdev blkdev; > /* Blkfront device number from Xenstore path. */ > blkif_vdev_t handle; > + /* Value which indicates that the backend can process requests with the > + * BLKIF_OP_WRITE_BARRIER request opcode. > + */ > + int barrier; > + /* Value which indicates that the backend can process requests with the > + * BLKIF_OP_WRITE_FLUSH_DISKCACHE request opcode. > + */ > + int flush; > /* Number of configured queues used for requests */ > uint16_t nb_queues; > /* Vector of queues used for communication with backend */ > diff --git a/plat/xen/drivers/blk/blkfront_xs.c > b/plat/xen/drivers/blk/blkfront_xs.c > index 69a2df9d..e93665c8 100644 > --- a/plat/xen/drivers/blk/blkfront_xs.c > +++ b/plat/xen/drivers/blk/blkfront_xs.c > @@ -191,6 +191,21 @@ static int blkfront_xb_get_capabilities(struct > blkfront_dev *blkdev) > return err; > } > > + err = xs_scanf(XBT_NIL, xendev->otherend, "feature-flush-cache", > + "%d", &blkdev->flush); > + if (err < 0) { > + uk_pr_err("Failed to read feature-flush-cache from xs: %d\n", > + err); > + return err; > + } > + > + err = xs_scanf(XBT_NIL, xendev->otherend, "feature-barrier", > + "%d", &blkdev->barrier); > + if (err < 0) { > + uk_pr_err("Failed to read feature-barrier from xs: %d\n", err); > + return err; > + } > + > mode = xs_read(XBT_NIL, xendev->otherend, "mode"); > if (PTRISERR(mode)) { > uk_pr_err("Failed to read mode from xs: %d.\n", err); > _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |