[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [Qemu-devel] [PATCH v2 6/9] xen/9pfs: receive requests from the frontend
On Wed, 15 Mar 2017, Greg Kurz wrote: > 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. OK, thanks. Xen doesn't support big endian today, but they don't hurt. > > + > > + 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) > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |