[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 6/9] xen/9pfs: receive requests from the frontend
On Mon, 13 Mar 2017 16:55:57 -0700 Stefano Stabellini <sstabellini@xxxxxxxxxx> wrote: > Upon receiving an event channel notification from the frontend, schedule > the bottom half. From the bottom half, read one request from the ring, > create a pdu and call pdu_submit to handle it. > > For now, only handle one request per ring at a time. > > Signed-off-by: Stefano Stabellini <stefano@xxxxxxxxxxx> > CC: anthony.perard@xxxxxxxxxx > CC: jgross@xxxxxxxx > CC: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxxxxxxx> > CC: Greg Kurz <groug@xxxxxxxx> > --- Oops, one more remark I forgot in my the previous mail. See below. > hw/9pfs/xen-9p-backend.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 47 insertions(+) > > diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c > index 0e4a133..741dd31 100644 > --- a/hw/9pfs/xen-9p-backend.c > +++ b/hw/9pfs/xen-9p-backend.c > @@ -94,12 +94,59 @@ static int xen_9pfs_init(struct XenDevice *xendev) > return 0; > } > > +static int xen_9pfs_receive(struct Xen9pfsRing *ring) > +{ > + struct xen_9pfs_header h; > + RING_IDX cons, prod, masked_prod, masked_cons; > + V9fsPDU *pdu; > + > + if (ring->inprogress) { > + return 0; > + } > + > + cons = ring->intf->out_cons; > + prod = ring->intf->out_prod; > + xen_rmb(); > + > + if (xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE) < sizeof(h)) { > + return 0; > + } > + ring->inprogress = true; > + > + masked_prod = xen_9pfs_mask(prod, XEN_9PFS_RING_SIZE); > + masked_cons = xen_9pfs_mask(cons, XEN_9PFS_RING_SIZE); > + > + xen_9pfs_read_packet(ring->ring.out, masked_prod, &masked_cons, > + XEN_9PFS_RING_SIZE, (uint8_t*) &h, sizeof(h)); > + > + pdu = pdu_alloc(&ring->priv->state); > + pdu->size = h.size; 9P uses little-endian, so this should be: pdu->size = le32_to_cpu(h.size); > + pdu->id = h.id; > + pdu->tag = h.tag; and: pdu->tag = le16_to_cpu(h.tag); > + ring->out_size = h.size; > + ring->out_cons = cons + h.size; Same here. > + > + qemu_co_queue_init(&pdu->complete); > + pdu_submit(pdu); > + > + return 0; > +} > + > static void xen_9pfs_bh(void *opaque) > { > + struct Xen9pfsRing *ring = opaque; > + xen_9pfs_receive(ring); > } > > static void xen_9pfs_evtchn_event(void *opaque) > { > + struct Xen9pfsRing *ring = opaque; > + evtchn_port_t port; > + > + port = xenevtchn_pending(ring->evtchndev); > + xenevtchn_unmask(ring->evtchndev, port); > + > + qemu_bh_schedule(ring->bh); > } > > static int xen_9pfs_free(struct XenDevice *xendev) Attachment:
pgpbz1N5gMDIo.pgp _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |