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);
> >  }
> >
> >

Reply via email to