MCPcopy Create free account
hub / github.com/F-Stack/f-stack / virtio_init_queue

Function virtio_init_queue

dpdk/drivers/net/virtio/virtio_ethdev.c:230–290  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

228}
229
230static int
231virtio_init_queue(struct rte_eth_dev *dev, uint16_t queue_idx)
232{
233 char vq_name[VIRTQUEUE_MAX_NAME_SZ];
234 unsigned int vq_size;
235 struct virtio_hw *hw = dev->data->dev_private;
236 struct virtqueue *vq;
237 int queue_type = virtio_get_queue_type(hw, queue_idx);
238 int ret;
239 int numa_node = dev->device->numa_node;
240
241 PMD_INIT_LOG(INFO, "setting up queue: %u on NUMA node %d",
242 queue_idx, numa_node);
243
244 /*
245 * Read the virtqueue size from the Queue Size field
246 * Always power of 2 and if 0 virtqueue does not exist
247 */
248 vq_size = VIRTIO_OPS(hw)->get_queue_num(hw, queue_idx);
249 PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size);
250 if (vq_size == 0) {
251 PMD_INIT_LOG(ERR, "virtqueue does not exist");
252 return -EINVAL;
253 }
254
255 if (!virtio_with_packed_queue(hw) && !rte_is_power_of_2(vq_size)) {
256 PMD_INIT_LOG(ERR, "split virtqueue size is not power of 2");
257 return -EINVAL;
258 }
259
260 snprintf(vq_name, sizeof(vq_name), "port%d_vq%d", dev->data->port_id, queue_idx);
261
262 vq = virtqueue_alloc(hw, queue_idx, vq_size, queue_type, numa_node, vq_name);
263 if (!vq) {
264 PMD_INIT_LOG(ERR, "virtqueue init failed");
265 return -ENOMEM;
266 }
267
268 hw->vqs[queue_idx] = vq;
269
270 if (queue_type == VTNET_CQ) {
271 hw->cvq = &vq->cq;
272 vq->cq.notify_queue = &virtio_control_queue_notify;
273 }
274
275 if (VIRTIO_OPS(hw)->setup_queue(hw, vq) < 0) {
276 PMD_INIT_LOG(ERR, "setup_queue failed");
277 ret = -EINVAL;
278 goto clean_vq;
279 }
280
281 return 0;
282
283clean_vq:
284 if (queue_type == VTNET_CQ)
285 hw->cvq = NULL;
286 virtqueue_free(vq);
287 hw->vqs[queue_idx] = NULL;

Callers 1

virtio_alloc_queuesFunction · 0.85

Calls 6

virtio_get_queue_typeFunction · 0.85
virtio_with_packed_queueFunction · 0.85
snprintfFunction · 0.85
virtqueue_allocFunction · 0.85
virtqueue_freeFunction · 0.85
rte_is_power_of_2Function · 0.50

Tested by

no test coverage detected