| 228 | } |
| 229 | |
| 230 | static int |
| 231 | virtio_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 | |
| 283 | clean_vq: |
| 284 | if (queue_type == VTNET_CQ) |
| 285 | hw->cvq = NULL; |
| 286 | virtqueue_free(vq); |
| 287 | hw->vqs[queue_idx] = NULL; |
no test coverage detected