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