[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 4/5] plat/drivers: Add 9P transport for virtio 9P
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx> On 9/7/19 12:45 PM, Vlad-Andrei BĂDOIU (78692) wrote: > From: Cristian Banu <cristb@xxxxxxxxx> > > This patch adds the 9P transport driver skeleton for virtio 9P devices, > by providing the required connect, disconnect and request callbacks. The > request callback is left as a stub to be implemented in the following > patches. > > Signed-off-by: Cristian Banu <cristb@xxxxxxxxx> > --- > plat/drivers/virtio/virtio_9p.c | 86 +++++++++++++++++++++++++++++++-- > 1 file changed, 83 insertions(+), 3 deletions(-) > > diff --git a/plat/drivers/virtio/virtio_9p.c b/plat/drivers/virtio/virtio_9p.c > index ab3a1b16..8094ec70 100644 > --- a/plat/drivers/virtio/virtio_9p.c > +++ b/plat/drivers/virtio/virtio_9p.c > @@ -35,6 +35,7 @@ > #include <inttypes.h> > #include <uk/alloc.h> > #include <uk/essentials.h> > +#include <uk/9pdev_trans.h> > #include <virtio/virtio_bus.h> > #include <virtio/virtio_9p.h> > #include <uk/plat/spinlock.h> > @@ -58,6 +59,83 @@ struct virtio_9p_device { > struct virtqueue *vq; > /* Hw queue identifier. */ > uint16_t hwvq_id; > + /* libuk9p associated device (NULL if the device is not in use). */ > + struct uk_9pdev *p9dev; > +}; > + > +static int virtio_9p_connect(struct uk_9pdev *p9dev, > + const char *device_identifier, > + const char *mount_args __unused) > +{ > + struct virtio_9p_device *dev = NULL; > + int rc = 0; > + int found = 0; > + > + ukarch_spin_lock(&virtio_9p_device_list_lock); > + uk_list_for_each_entry(dev, &virtio_9p_device_list, _list) { > + if (!strcmp(dev->tag, device_identifier)) { > + if (dev->p9dev != NULL) { > + rc = -EBUSY; > + goto out; > + } > + found = 1; > + break; > + } > + } > + > + if (!found) { > + rc = -EINVAL; > + goto out; > + } > + > + /* > + * The maximum message size is given by the number of segments. > + * > + * For read requests, the reply will be able to make use of the large > + * msize, and the request will not exceed one segment. > + * Similarly for write requests, but in reverse. Other requests should > + * not exceed one page for both recv and xmit fcalls. > + */ > + p9dev->max_msize = (NUM_SEGMENTS - 1) * __PAGE_SIZE; > + > + dev->p9dev = p9dev; > + p9dev->priv = dev; > + > +out: > + ukarch_spin_unlock(&virtio_9p_device_list_lock); > + return rc; > +} > + > +static int virtio_9p_disconnect(struct uk_9pdev *p9dev) > +{ > + struct virtio_9p_device *dev; > + > + UK_ASSERT(p9dev); > + dev = p9dev->priv; > + > + ukarch_spin_lock(&virtio_9p_device_list_lock); > + dev->p9dev = NULL; > + ukarch_spin_unlock(&virtio_9p_device_list_lock); > + > + return 0; > +} > + > +static int virtio_9p_request(struct uk_9pdev *p9dev __unused, > + struct uk_9preq *req __unused) > +{ > + return -EOPNOTSUPP; > +} > + > +static const struct uk_9pdev_trans_ops v9p_trans_ops = { > + .connect = virtio_9p_connect, > + .disconnect = virtio_9p_disconnect, > + .request = virtio_9p_request > +}; > + > +static struct uk_9pdev_trans v9p_trans = { > + .name = "virtio", > + .ops = &v9p_trans_ops, > + .a = NULL /* Set by the driver initialization. */ > }; > > static int virtio_9p_recv(struct virtqueue *vq __unused, void *priv __unused) > @@ -185,7 +263,6 @@ static int virtio_9p_start(struct virtio_9p_device *d) > static int virtio_9p_add_dev(struct virtio_dev *vdev) > { > struct virtio_9p_device *d; > - unsigned long flags; > int rc = 0; > > UK_ASSERT(vdev != NULL); > @@ -204,9 +281,9 @@ static int virtio_9p_add_dev(struct virtio_dev *vdev) > if (rc) > goto out_free; > > - ukplat_spin_lock_irqsave(&virtio_9p_device_list_lock, flags); > + ukarch_spin_lock(&virtio_9p_device_list_lock); > uk_list_add(&d->_list, &virtio_9p_device_list); > - ukplat_spin_unlock_irqrestore(&virtio_9p_device_list_lock, flags); > + ukarch_spin_unlock(&virtio_9p_device_list_lock); > out: > return rc; > out_free: > @@ -224,6 +301,9 @@ static int virtio_9p_drv_init(struct uk_alloc > *drv_allocator) > } > > a = drv_allocator; > + v9p_trans.a = a; > + > + rc = uk_9pdev_trans_register(&v9p_trans); > out: > return rc; > } > _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |