/* * Reset some variables in device structure, while keeping few * others untouched, such as device_fh, ifname, virt_qp_nb: they * should be same unless the device is removed. */ static void reset_device(struct virtio_net *dev) { uint32_t i; dev->features = 0; dev->protocol_features = 0; dev->flags = 0; for (i = 0; i < dev->virt_qp_nb; i++) init_vring_queue_pair(dev, i); }
/* * Initialise all variables in device structure. */ static void init_device(struct virtio_net *dev) { int vq_offset; uint32_t i; /* * Virtqueues have already been malloced so * we don't want to set them to NULL. */ vq_offset = offsetof(struct virtio_net, virtqueue); memset(dev, 0, vq_offset); for (i = 0; i < dev->virt_qp_nb; i++) init_vring_queue_pair(dev, i); }
static int alloc_vring_queue_pair(struct virtio_net *dev, uint32_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; 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); dev->virt_qp_nb += 1; return 0; }