[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 16/17] plat/xen/drivers/blk: Grant references support
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx> On 10/30/19 5:55 PM, Roxana Nicolescu wrote: > This patch introduces the functions used for allocating > new grant references in order to share data for requests. > > Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx> > --- > plat/xen/drivers/blk/blkfront.c | 92 +++++++++++++++++++++++++++++++++ > plat/xen/drivers/blk/blkfront.h | 10 ++++ > 2 files changed, 102 insertions(+) > > diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c > index 1b4d2938..d233dac8 100644 > --- a/plat/xen/drivers/blk/blkfront.c > +++ b/plat/xen/drivers/blk/blkfront.c > @@ -65,6 +65,87 @@ > > static struct uk_alloc *drv_allocator; > > +static int blkfront_request_set_grefs(struct blkfront_request *blkfront_req) > +{ > + struct blkfront_gref *ref_elem; > + uint16_t nb_segments; > + int grefi = 0, grefj; > + int err = 0; > + > + UK_ASSERT(blkfront_req != NULL); > + nb_segments = blkfront_req->nb_segments; > + > + /* we allocate new ones */ > + for (; grefi < nb_segments; ++grefi) { > + ref_elem = uk_malloc(drv_allocator, sizeof(*ref_elem)); > + if (!ref_elem) { > + err = -ENOMEM; > + goto err; > + } > + > + blkfront_req->gref[grefi] = ref_elem; > + } > + > +out: > + return err; > +err: > + /* Free all the elements from 0 index to where the error happens */ > + for (grefj = 0; grefj < grefi; ++grefj) { > + ref_elem = blkfront_req->gref[grefj]; > + uk_free(drv_allocator, ref_elem); > + } > + goto out; > +} > + > +static void blkfront_request_reset_grefs(struct blkfront_request *req) > +{ > + uint16_t gref_id = 0; > + struct blkfront_gref *gref_elem; > + uint16_t nb_segments; > + int rc; > + > + UK_ASSERT(req); > + nb_segments = req->nb_segments; > + > + for (; gref_id < nb_segments; ++gref_id) { > + gref_elem = req->gref[gref_id]; > + if (gref_elem->ref != GRANT_INVALID_REF) { > + rc = gnttab_end_access(gref_elem->ref); > + UK_ASSERT(rc); > + } > + > + uk_free(drv_allocator, gref_elem); > + } > +} > + > +static void blkfront_request_map_grefs(struct blkif_request *ring_req, > + domid_t otherend_id) > +{ > + uint16_t gref_index; > + struct blkfront_request *blkfront_req; > + struct uk_blkreq *req; > + uint16_t nb_segments; > + uintptr_t data; > + uintptr_t start_sector; > + struct blkfront_gref *ref_elem; > + > + UK_ASSERT(ring_req); > + > + blkfront_req = (struct blkfront_request *)ring_req->id; > + req = blkfront_req->req; > + start_sector = round_pgdown((uintptr_t)req->aio_buf); > + nb_segments = blkfront_req->nb_segments; > + > + for (gref_index = 0; gref_index < nb_segments; ++gref_index) { > + data = start_sector + gref_index * PAGE_SIZE; > + ref_elem = blkfront_req->gref[gref_index]; > + ref_elem->ref = gnttab_grant_access(otherend_id, > + virtual_to_mfn(data), ring_req->operation); > + > + UK_ASSERT(ref_elem->ref != GRANT_INVALID_REF); > + ring_req->seg[gref_index].gref = ref_elem->ref; > + } > +} > > static void blkif_request_init(struct blkif_request *ring_req, > __sector sector_size) > @@ -147,6 +228,15 @@ static int blkfront_request_write(struct > blkfront_request *blkfront_req, > blkif_request_init(ring_req, sector_size); > blkfront_req->nb_segments = ring_req->nr_segments; > > + /* Get blkfront_grefs from pool or allocate new ones */ > + rc = blkfront_request_set_grefs(blkfront_req); > + if (rc) > + goto out; > + > + /* Map grant references to ring_req */ > + blkfront_request_map_grefs(ring_req, dev->xendev->otherend_id); > + > +out: > return rc; > } > > @@ -318,9 +408,11 @@ static int blkfront_queue_dequeue(struct uk_blkdev_queue > *queue, > switch (rsp->operation) { > case BLKIF_OP_READ: > CHECK_STATUS(req_from_q, status, "read"); > + blkfront_request_reset_grefs(blkfront_req); > break; > case BLKIF_OP_WRITE: > CHECK_STATUS(req_from_q, status, "write"); > + blkfront_request_reset_grefs(blkfront_req); > break; > case BLKIF_OP_WRITE_BARRIER: > if (status != BLKIF_RSP_OKAY) > diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h > index 93d2905d..9620a8d6 100644 > --- a/plat/xen/drivers/blk/blkfront.h > +++ b/plat/xen/drivers/blk/blkfront.h > @@ -47,12 +47,22 @@ > #include <common/events.h> > > > +/** > + * Structure used to describe a grant ref element. > + */ > +struct blkfront_gref { > + /* Grant ref number. */ > + grant_ref_t ref; > +}; > + > /** > * Structure used to describe a front device request. > */ > struct blkfront_request { > /* Request from the API. */ > struct uk_blkreq *req; > + /* List with maximum number of blkfront_grefs for a request. */ > + struct blkfront_gref *gref[BLKIF_MAX_SEGMENTS_PER_REQUEST]; > /* Number of segments. */ > uint16_t nb_segments; > /* Queue in which the request will be stored */ > _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |