On 10/21/2015 11:48 AM, Yuanhan Liu wrote: > All queue pairs, including the default (the first) queue pair, > are allocated dynamically, when a vring_call message is received > first time for a specific queue pair. > > This is a refactor work for enabling vhost-user multiple queue; > it should not break anything as it does no functional changes: > we don't support mq set, so there is only one mq at max. > > This patch is based on Changchun's patch. > [...] > > void > @@ -290,13 +298,9 @@ user_get_vring_base(struct vhost_device_ctx ctx, > * sent and only sent in vhost_vring_stop. > * TODO: cleanup the vring, it isn't usable since here. > */ > - if ((dev->virtqueue[VIRTIO_RXQ]->kickfd) >= 0) { > - close(dev->virtqueue[VIRTIO_RXQ]->kickfd); > - dev->virtqueue[VIRTIO_RXQ]->kickfd = -1; > - } > - if ((dev->virtqueue[VIRTIO_TXQ]->kickfd) >= 0) { > - close(dev->virtqueue[VIRTIO_TXQ]->kickfd); > - dev->virtqueue[VIRTIO_TXQ]->kickfd = -1; > + if ((dev->virtqueue[state->index]->kickfd) >= 0) { > + close(dev->virtqueue[state->index]->kickfd); > + dev->virtqueue[state->index]->kickfd = -1; > } Since we change the behavior here, better list in the commit message as well.
> > > @@ -680,13 +704,21 @@ set_vring_call(struct vhost_device_ctx ctx, struct > vhost_vring_file *file) > { > struct virtio_net *dev; > struct vhost_virtqueue *vq; > + uint32_t cur_qp_idx = file->index / VIRTIO_QNUM; > > dev = get_device(ctx); > if (dev == NULL) > return -1; > > + /* alloc vring queue pair if it is a new queue pair */ > + if (cur_qp_idx + 1 > dev->virt_qp_nb) { > + if (alloc_vring_queue_pair(dev, cur_qp_idx) < 0) > + return -1; > + } > + Here we rely on the fact that this set_vring_call message is sent in the continuous ascending order of queue idx 0, 1, 2, ... > /* file->index refers to the queue index. The txq is 1, rxq is 0. */ > vq = dev->virtqueue[file->index]; > + assert(vq != NULL); > If we allocate the queue until the we receive the first vring message, better add comment that we rely on this fact. Could we add the vhost-user message to tell us the queue number QEMU allocates before vring message? > if (vq->callfd >= 0) > close(vq->callfd);