[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
Description: OpenPGP digital signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.