[dpdk-dev] [PATCH v4 02/12] vhost: support multiple queues in virtio dev
Ouyang, Changchun
changchun.ouyang at intel.com
Sun Sep 6 04:25:56 CEST 2015
Hi Tetsuya,
> -----Original Message-----
> From: Tetsuya Mukawa [mailto:mukawa at igel.co.jp]
> Sent: Thursday, September 3, 2015 10:27 AM
> To: dev at dpdk.org; Ouyang, Changchun
> Subject: Re: [dpdk-dev] [PATCH v4 02/12] vhost: support multiple queues in
> virtio dev
>
> On 2015/08/12 17:02, Ouyang Changchun wrote:
> > diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.h
> > b/lib/librte_vhost/vhost_user/virtio-net-user.h
> > index df24860..2429836 100644
> > --- a/lib/librte_vhost/vhost_user/virtio-net-user.h
> > +++ b/lib/librte_vhost/vhost_user/virtio-net-user.h
> > @@ -46,4 +46,6 @@ void user_set_vring_kick(struct vhost_device_ctx,
> > struct VhostUserMsg *);
> >
> > /*
> > @@ -206,9 +213,17 @@ cleanup_device(struct virtio_net *dev) static
> > void free_device(struct virtio_net_config_ll *ll_dev) {
> > - /* Free any malloc'd memory */
> > - rte_free(ll_dev->dev.virtqueue[VIRTIO_RXQ]);
> > - rte_free(ll_dev->dev.virtqueue[VIRTIO_TXQ]);
> > + uint32_t qp_idx;
> > +
> > + /*
> > + * Free any malloc'd memory.
> > + */
> > + /* Free every queue pair. */
> > + for (qp_idx = 0; qp_idx < ll_dev->dev.virt_qp_nb; qp_idx++) {
> > + uint32_t virt_rx_q_idx = qp_idx * VIRTIO_QNUM +
> VIRTIO_RXQ;
> > + rte_free(ll_dev->dev.virtqueue[virt_rx_q_idx]);
>
> Hi Changchun,
>
> Should we free tx queue also here?
>
We don't need do it, as we allocate once for both rx and tx queue.
Thus, we allocate once, free once.
Pls see the following code snippet:
+ * Alloc mem for vring queue pair.
+ */
+int
+alloc_vring_queue_pair(struct virtio_net *dev, uint16_t qp_idx) {
+ struct vhost_virtqueue *virtqueue = NULL;
+ uint32_t virt_rx_q_idx = qp_idx * VIRTIO_QNUM + VIRTIO_RXQ;
+ uint32_t virt_tx_q_idx = qp_idx * VIRTIO_QNUM + VIRTIO_TXQ;
- /* Backends are set to -1 indicating an inactive device. */
- dev->virtqueue[VIRTIO_RXQ]->backend = VIRTIO_DEV_STOPPED;
- dev->virtqueue[VIRTIO_TXQ]->backend = VIRTIO_DEV_STOPPED;
+ virtqueue = rte_malloc(NULL, sizeof(struct vhost_virtqueue) * VIRTIO_QNUM, 0);
+ if (virtqueue == NULL) {
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "Failed to allocate memory for virt qp:%d.\n", qp_idx);
+ return -1;
+ }
+
+ dev->virtqueue[virt_rx_q_idx] = virtqueue;
+ dev->virtqueue[virt_tx_q_idx] = virtqueue + VIRTIO_TXQ;
+
+ init_vring_queue_pair(dev, qp_idx);
+
+ return 0;
}
Thanks
Changchun
>
> > + }
> > + rte_free(ll_dev->dev.virtqueue);
> > rte_free(ll_dev);
> > }
> >
> >
More information about the dev
mailing list