1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2018 Intel Corporation 3 */ 4 5 /* Security model 6 * -------------- 7 * The vhost-user protocol connection is an external interface, so it must be 8 * robust against invalid inputs. 9 * 10 * This is important because the vhost-user master is only one step removed 11 * from the guest. Malicious guests that have escaped will then launch further 12 * attacks from the vhost-user master. 13 * 14 * Even in deployments where guests are trusted, a bug in the vhost-user master 15 * can still cause invalid messages to be sent. Such messages must not 16 * compromise the stability of the DPDK application by causing crashes, memory 17 * corruption, or other problematic behavior. 18 * 19 * Do not assume received VhostUserMsg fields contain sensible values! 20 */ 21 22 #include <stdint.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 #include <unistd.h> 27 #include <fcntl.h> 28 #include <sys/ioctl.h> 29 #include <sys/mman.h> 30 #include <sys/types.h> 31 #include <sys/stat.h> 32 #include <sys/syscall.h> 33 #include <assert.h> 34 #ifdef RTE_LIBRTE_VHOST_NUMA 35 #include <numaif.h> 36 #endif 37 #ifdef RTE_LIBRTE_VHOST_POSTCOPY 38 #include <linux/userfaultfd.h> 39 #endif 40 41 #include <rte_common.h> 42 #include <rte_malloc.h> 43 #include <rte_log.h> 44 45 #include "iotlb.h" 46 #include "vhost.h" 47 #include "vhost_user.h" 48 49 #define VIRTIO_MIN_MTU 68 50 #define VIRTIO_MAX_MTU 65535 51 52 static const char *vhost_message_str[VHOST_USER_MAX] = { 53 [VHOST_USER_NONE] = "VHOST_USER_NONE", 54 [VHOST_USER_GET_FEATURES] = "VHOST_USER_GET_FEATURES", 55 [VHOST_USER_SET_FEATURES] = "VHOST_USER_SET_FEATURES", 56 [VHOST_USER_SET_OWNER] = "VHOST_USER_SET_OWNER", 57 [VHOST_USER_RESET_OWNER] = "VHOST_USER_RESET_OWNER", 58 [VHOST_USER_SET_MEM_TABLE] = "VHOST_USER_SET_MEM_TABLE", 59 [VHOST_USER_SET_LOG_BASE] = "VHOST_USER_SET_LOG_BASE", 60 [VHOST_USER_SET_LOG_FD] = "VHOST_USER_SET_LOG_FD", 61 [VHOST_USER_SET_VRING_NUM] = "VHOST_USER_SET_VRING_NUM", 62 [VHOST_USER_SET_VRING_ADDR] = "VHOST_USER_SET_VRING_ADDR", 63 [VHOST_USER_SET_VRING_BASE] = "VHOST_USER_SET_VRING_BASE", 64 [VHOST_USER_GET_VRING_BASE] = "VHOST_USER_GET_VRING_BASE", 65 [VHOST_USER_SET_VRING_KICK] = "VHOST_USER_SET_VRING_KICK", 66 [VHOST_USER_SET_VRING_CALL] = "VHOST_USER_SET_VRING_CALL", 67 [VHOST_USER_SET_VRING_ERR] = "VHOST_USER_SET_VRING_ERR", 68 [VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES", 69 [VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES", 70 [VHOST_USER_GET_QUEUE_NUM] = "VHOST_USER_GET_QUEUE_NUM", 71 [VHOST_USER_SET_VRING_ENABLE] = "VHOST_USER_SET_VRING_ENABLE", 72 [VHOST_USER_SEND_RARP] = "VHOST_USER_SEND_RARP", 73 [VHOST_USER_NET_SET_MTU] = "VHOST_USER_NET_SET_MTU", 74 [VHOST_USER_SET_SLAVE_REQ_FD] = "VHOST_USER_SET_SLAVE_REQ_FD", 75 [VHOST_USER_IOTLB_MSG] = "VHOST_USER_IOTLB_MSG", 76 [VHOST_USER_CRYPTO_CREATE_SESS] = "VHOST_USER_CRYPTO_CREATE_SESS", 77 [VHOST_USER_CRYPTO_CLOSE_SESS] = "VHOST_USER_CRYPTO_CLOSE_SESS", 78 [VHOST_USER_POSTCOPY_ADVISE] = "VHOST_USER_POSTCOPY_ADVISE", 79 [VHOST_USER_POSTCOPY_LISTEN] = "VHOST_USER_POSTCOPY_LISTEN", 80 [VHOST_USER_POSTCOPY_END] = "VHOST_USER_POSTCOPY_END", 81 }; 82 83 static int send_vhost_reply(int sockfd, struct VhostUserMsg *msg); 84 static int read_vhost_message(int sockfd, struct VhostUserMsg *msg); 85 86 static void 87 close_msg_fds(struct VhostUserMsg *msg) 88 { 89 int i; 90 91 for (i = 0; i < msg->fd_num; i++) 92 close(msg->fds[i]); 93 } 94 95 /* 96 * Ensure the expected number of FDs is received, 97 * close all FDs and return an error if this is not the case. 98 */ 99 static int 100 validate_msg_fds(struct VhostUserMsg *msg, int expected_fds) 101 { 102 if (msg->fd_num == expected_fds) 103 return 0; 104 105 RTE_LOG(ERR, VHOST_CONFIG, 106 " Expect %d FDs for request %s, received %d\n", 107 expected_fds, 108 vhost_message_str[msg->request.master], 109 msg->fd_num); 110 111 close_msg_fds(msg); 112 113 return -1; 114 } 115 116 static uint64_t 117 get_blk_size(int fd) 118 { 119 struct stat stat; 120 int ret; 121 122 ret = fstat(fd, &stat); 123 return ret == -1 ? (uint64_t)-1 : (uint64_t)stat.st_blksize; 124 } 125 126 /* 127 * Reclaim all the outstanding zmbufs for a virtqueue. 128 */ 129 static void 130 drain_zmbuf_list(struct vhost_virtqueue *vq) 131 { 132 struct zcopy_mbuf *zmbuf, *next; 133 134 for (zmbuf = TAILQ_FIRST(&vq->zmbuf_list); 135 zmbuf != NULL; zmbuf = next) { 136 next = TAILQ_NEXT(zmbuf, next); 137 138 while (!mbuf_is_consumed(zmbuf->mbuf)) 139 usleep(1000); 140 141 TAILQ_REMOVE(&vq->zmbuf_list, zmbuf, next); 142 restore_mbuf(zmbuf->mbuf); 143 rte_pktmbuf_free(zmbuf->mbuf); 144 put_zmbuf(zmbuf); 145 vq->nr_zmbuf -= 1; 146 } 147 } 148 149 static void 150 free_mem_region(struct virtio_net *dev) 151 { 152 uint32_t i; 153 struct rte_vhost_mem_region *reg; 154 struct vhost_virtqueue *vq; 155 156 if (!dev || !dev->mem) 157 return; 158 159 if (dev->dequeue_zero_copy) { 160 for (i = 0; i < dev->nr_vring; i++) { 161 vq = dev->virtqueue[i]; 162 if (vq) 163 drain_zmbuf_list(vq); 164 } 165 } 166 167 for (i = 0; i < dev->mem->nregions; i++) { 168 reg = &dev->mem->regions[i]; 169 if (reg->host_user_addr) { 170 munmap(reg->mmap_addr, reg->mmap_size); 171 close(reg->fd); 172 } 173 } 174 } 175 176 void 177 vhost_backend_cleanup(struct virtio_net *dev) 178 { 179 if (dev->mem) { 180 free_mem_region(dev); 181 rte_free(dev->mem); 182 dev->mem = NULL; 183 } 184 185 free(dev->guest_pages); 186 dev->guest_pages = NULL; 187 188 if (dev->log_addr) { 189 munmap((void *)(uintptr_t)dev->log_addr, dev->log_size); 190 dev->log_addr = 0; 191 } 192 193 if (dev->slave_req_fd >= 0) { 194 close(dev->slave_req_fd); 195 dev->slave_req_fd = -1; 196 } 197 198 if (dev->postcopy_ufd >= 0) { 199 close(dev->postcopy_ufd); 200 dev->postcopy_ufd = -1; 201 } 202 203 dev->postcopy_listening = 0; 204 } 205 206 /* 207 * This function just returns success at the moment unless 208 * the device hasn't been initialised. 209 */ 210 static int 211 vhost_user_set_owner(struct virtio_net **pdev __rte_unused, 212 struct VhostUserMsg *msg, 213 int main_fd __rte_unused) 214 { 215 if (validate_msg_fds(msg, 0) != 0) 216 return VH_RESULT_ERR; 217 218 return VH_RESULT_OK; 219 } 220 221 static int 222 vhost_user_reset_owner(struct virtio_net **pdev, 223 struct VhostUserMsg *msg, 224 int main_fd __rte_unused) 225 { 226 struct virtio_net *dev = *pdev; 227 228 if (validate_msg_fds(msg, 0) != 0) 229 return VH_RESULT_ERR; 230 231 vhost_destroy_device_notify(dev); 232 233 cleanup_device(dev, 0); 234 reset_device(dev); 235 return VH_RESULT_OK; 236 } 237 238 /* 239 * The features that we support are requested. 240 */ 241 static int 242 vhost_user_get_features(struct virtio_net **pdev, struct VhostUserMsg *msg, 243 int main_fd __rte_unused) 244 { 245 struct virtio_net *dev = *pdev; 246 uint64_t features = 0; 247 248 if (validate_msg_fds(msg, 0) != 0) 249 return VH_RESULT_ERR; 250 251 rte_vhost_driver_get_features(dev->ifname, &features); 252 253 msg->payload.u64 = features; 254 msg->size = sizeof(msg->payload.u64); 255 msg->fd_num = 0; 256 257 return VH_RESULT_REPLY; 258 } 259 260 /* 261 * The queue number that we support are requested. 262 */ 263 static int 264 vhost_user_get_queue_num(struct virtio_net **pdev, struct VhostUserMsg *msg, 265 int main_fd __rte_unused) 266 { 267 struct virtio_net *dev = *pdev; 268 uint32_t queue_num = 0; 269 270 if (validate_msg_fds(msg, 0) != 0) 271 return VH_RESULT_ERR; 272 273 rte_vhost_driver_get_queue_num(dev->ifname, &queue_num); 274 275 msg->payload.u64 = (uint64_t)queue_num; 276 msg->size = sizeof(msg->payload.u64); 277 msg->fd_num = 0; 278 279 return VH_RESULT_REPLY; 280 } 281 282 /* 283 * We receive the negotiated features supported by us and the virtio device. 284 */ 285 static int 286 vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg, 287 int main_fd __rte_unused) 288 { 289 struct virtio_net *dev = *pdev; 290 uint64_t features = msg->payload.u64; 291 uint64_t vhost_features = 0; 292 struct rte_vdpa_device *vdpa_dev; 293 int did = -1; 294 295 if (validate_msg_fds(msg, 0) != 0) 296 return VH_RESULT_ERR; 297 298 rte_vhost_driver_get_features(dev->ifname, &vhost_features); 299 if (features & ~vhost_features) { 300 RTE_LOG(ERR, VHOST_CONFIG, 301 "(%d) received invalid negotiated features.\n", 302 dev->vid); 303 return VH_RESULT_ERR; 304 } 305 306 if (dev->flags & VIRTIO_DEV_RUNNING) { 307 if (dev->features == features) 308 return VH_RESULT_OK; 309 310 /* 311 * Error out if master tries to change features while device is 312 * in running state. The exception being VHOST_F_LOG_ALL, which 313 * is enabled when the live-migration starts. 314 */ 315 if ((dev->features ^ features) & ~(1ULL << VHOST_F_LOG_ALL)) { 316 RTE_LOG(ERR, VHOST_CONFIG, 317 "(%d) features changed while device is running.\n", 318 dev->vid); 319 return VH_RESULT_ERR; 320 } 321 322 if (dev->notify_ops->features_changed) 323 dev->notify_ops->features_changed(dev->vid, features); 324 } 325 326 dev->features = features; 327 if (dev->features & 328 ((1 << VIRTIO_NET_F_MRG_RXBUF) | (1ULL << VIRTIO_F_VERSION_1))) { 329 dev->vhost_hlen = sizeof(struct virtio_net_hdr_mrg_rxbuf); 330 } else { 331 dev->vhost_hlen = sizeof(struct virtio_net_hdr); 332 } 333 VHOST_LOG_DEBUG(VHOST_CONFIG, 334 "(%d) mergeable RX buffers %s, virtio 1 %s\n", 335 dev->vid, 336 (dev->features & (1 << VIRTIO_NET_F_MRG_RXBUF)) ? "on" : "off", 337 (dev->features & (1ULL << VIRTIO_F_VERSION_1)) ? "on" : "off"); 338 339 if ((dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET) && 340 !(dev->features & (1ULL << VIRTIO_NET_F_MQ))) { 341 /* 342 * Remove all but first queue pair if MQ hasn't been 343 * negotiated. This is safe because the device is not 344 * running at this stage. 345 */ 346 while (dev->nr_vring > 2) { 347 struct vhost_virtqueue *vq; 348 349 vq = dev->virtqueue[--dev->nr_vring]; 350 if (!vq) 351 continue; 352 353 dev->virtqueue[dev->nr_vring] = NULL; 354 cleanup_vq(vq, 1); 355 free_vq(dev, vq); 356 } 357 } 358 359 did = dev->vdpa_dev_id; 360 vdpa_dev = rte_vdpa_get_device(did); 361 if (vdpa_dev && vdpa_dev->ops->set_features) 362 vdpa_dev->ops->set_features(dev->vid); 363 364 return VH_RESULT_OK; 365 } 366 367 /* 368 * The virtio device sends us the size of the descriptor ring. 369 */ 370 static int 371 vhost_user_set_vring_num(struct virtio_net **pdev, 372 struct VhostUserMsg *msg, 373 int main_fd __rte_unused) 374 { 375 struct virtio_net *dev = *pdev; 376 struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; 377 378 if (validate_msg_fds(msg, 0) != 0) 379 return VH_RESULT_ERR; 380 381 vq->size = msg->payload.state.num; 382 383 /* VIRTIO 1.0, 2.4 Virtqueues says: 384 * 385 * Queue Size value is always a power of 2. The maximum Queue Size 386 * value is 32768. 387 */ 388 if ((vq->size & (vq->size - 1)) || vq->size > 32768) { 389 RTE_LOG(ERR, VHOST_CONFIG, 390 "invalid virtqueue size %u\n", vq->size); 391 return VH_RESULT_ERR; 392 } 393 394 if (dev->dequeue_zero_copy) { 395 vq->nr_zmbuf = 0; 396 vq->last_zmbuf_idx = 0; 397 vq->zmbuf_size = vq->size; 398 if (vq->zmbufs) 399 rte_free(vq->zmbufs); 400 vq->zmbufs = rte_zmalloc(NULL, vq->zmbuf_size * 401 sizeof(struct zcopy_mbuf), 0); 402 if (vq->zmbufs == NULL) { 403 RTE_LOG(WARNING, VHOST_CONFIG, 404 "failed to allocate mem for zero copy; " 405 "zero copy is force disabled\n"); 406 dev->dequeue_zero_copy = 0; 407 } 408 TAILQ_INIT(&vq->zmbuf_list); 409 } 410 411 if (vq_is_packed(dev)) { 412 if (vq->shadow_used_packed) 413 rte_free(vq->shadow_used_packed); 414 vq->shadow_used_packed = rte_malloc(NULL, 415 vq->size * 416 sizeof(struct vring_used_elem_packed), 417 RTE_CACHE_LINE_SIZE); 418 if (!vq->shadow_used_packed) { 419 RTE_LOG(ERR, VHOST_CONFIG, 420 "failed to allocate memory for shadow used ring.\n"); 421 return VH_RESULT_ERR; 422 } 423 424 } else { 425 if (vq->shadow_used_split) 426 rte_free(vq->shadow_used_split); 427 vq->shadow_used_split = rte_malloc(NULL, 428 vq->size * sizeof(struct vring_used_elem), 429 RTE_CACHE_LINE_SIZE); 430 if (!vq->shadow_used_split) { 431 RTE_LOG(ERR, VHOST_CONFIG, 432 "failed to allocate memory for shadow used ring.\n"); 433 return VH_RESULT_ERR; 434 } 435 } 436 437 if (vq->batch_copy_elems) 438 rte_free(vq->batch_copy_elems); 439 vq->batch_copy_elems = rte_malloc(NULL, 440 vq->size * sizeof(struct batch_copy_elem), 441 RTE_CACHE_LINE_SIZE); 442 if (!vq->batch_copy_elems) { 443 RTE_LOG(ERR, VHOST_CONFIG, 444 "failed to allocate memory for batching copy.\n"); 445 return VH_RESULT_ERR; 446 } 447 448 return VH_RESULT_OK; 449 } 450 451 /* 452 * Reallocate virtio_dev and vhost_virtqueue data structure to make them on the 453 * same numa node as the memory of vring descriptor. 454 */ 455 #ifdef RTE_LIBRTE_VHOST_NUMA 456 static struct virtio_net* 457 numa_realloc(struct virtio_net *dev, int index) 458 { 459 int oldnode, newnode; 460 struct virtio_net *old_dev; 461 struct vhost_virtqueue *old_vq, *vq; 462 struct zcopy_mbuf *new_zmbuf; 463 struct vring_used_elem *new_shadow_used_split; 464 struct vring_used_elem_packed *new_shadow_used_packed; 465 struct batch_copy_elem *new_batch_copy_elems; 466 int ret; 467 468 old_dev = dev; 469 vq = old_vq = dev->virtqueue[index]; 470 471 ret = get_mempolicy(&newnode, NULL, 0, old_vq->desc, 472 MPOL_F_NODE | MPOL_F_ADDR); 473 474 /* check if we need to reallocate vq */ 475 ret |= get_mempolicy(&oldnode, NULL, 0, old_vq, 476 MPOL_F_NODE | MPOL_F_ADDR); 477 if (ret) { 478 RTE_LOG(ERR, VHOST_CONFIG, 479 "Unable to get vq numa information.\n"); 480 return dev; 481 } 482 if (oldnode != newnode) { 483 RTE_LOG(INFO, VHOST_CONFIG, 484 "reallocate vq from %d to %d node\n", oldnode, newnode); 485 vq = rte_malloc_socket(NULL, sizeof(*vq), 0, newnode); 486 if (!vq) 487 return dev; 488 489 memcpy(vq, old_vq, sizeof(*vq)); 490 TAILQ_INIT(&vq->zmbuf_list); 491 492 if (dev->dequeue_zero_copy) { 493 new_zmbuf = rte_malloc_socket(NULL, vq->zmbuf_size * 494 sizeof(struct zcopy_mbuf), 0, newnode); 495 if (new_zmbuf) { 496 rte_free(vq->zmbufs); 497 vq->zmbufs = new_zmbuf; 498 } 499 } 500 501 if (vq_is_packed(dev)) { 502 new_shadow_used_packed = rte_malloc_socket(NULL, 503 vq->size * 504 sizeof(struct vring_used_elem_packed), 505 RTE_CACHE_LINE_SIZE, 506 newnode); 507 if (new_shadow_used_packed) { 508 rte_free(vq->shadow_used_packed); 509 vq->shadow_used_packed = new_shadow_used_packed; 510 } 511 } else { 512 new_shadow_used_split = rte_malloc_socket(NULL, 513 vq->size * 514 sizeof(struct vring_used_elem), 515 RTE_CACHE_LINE_SIZE, 516 newnode); 517 if (new_shadow_used_split) { 518 rte_free(vq->shadow_used_split); 519 vq->shadow_used_split = new_shadow_used_split; 520 } 521 } 522 523 new_batch_copy_elems = rte_malloc_socket(NULL, 524 vq->size * sizeof(struct batch_copy_elem), 525 RTE_CACHE_LINE_SIZE, 526 newnode); 527 if (new_batch_copy_elems) { 528 rte_free(vq->batch_copy_elems); 529 vq->batch_copy_elems = new_batch_copy_elems; 530 } 531 532 rte_free(old_vq); 533 } 534 535 /* check if we need to reallocate dev */ 536 ret = get_mempolicy(&oldnode, NULL, 0, old_dev, 537 MPOL_F_NODE | MPOL_F_ADDR); 538 if (ret) { 539 RTE_LOG(ERR, VHOST_CONFIG, 540 "Unable to get dev numa information.\n"); 541 goto out; 542 } 543 if (oldnode != newnode) { 544 RTE_LOG(INFO, VHOST_CONFIG, 545 "reallocate dev from %d to %d node\n", 546 oldnode, newnode); 547 dev = rte_malloc_socket(NULL, sizeof(*dev), 0, newnode); 548 if (!dev) { 549 dev = old_dev; 550 goto out; 551 } 552 553 memcpy(dev, old_dev, sizeof(*dev)); 554 rte_free(old_dev); 555 } 556 557 out: 558 dev->virtqueue[index] = vq; 559 vhost_devices[dev->vid] = dev; 560 561 if (old_vq != vq) 562 vhost_user_iotlb_init(dev, index); 563 564 return dev; 565 } 566 #else 567 static struct virtio_net* 568 numa_realloc(struct virtio_net *dev, int index __rte_unused) 569 { 570 return dev; 571 } 572 #endif 573 574 /* Converts QEMU virtual address to Vhost virtual address. */ 575 static uint64_t 576 qva_to_vva(struct virtio_net *dev, uint64_t qva, uint64_t *len) 577 { 578 struct rte_vhost_mem_region *r; 579 uint32_t i; 580 581 if (unlikely(!dev || !dev->mem)) 582 goto out_error; 583 584 /* Find the region where the address lives. */ 585 for (i = 0; i < dev->mem->nregions; i++) { 586 r = &dev->mem->regions[i]; 587 588 if (qva >= r->guest_user_addr && 589 qva < r->guest_user_addr + r->size) { 590 591 if (unlikely(*len > r->guest_user_addr + r->size - qva)) 592 *len = r->guest_user_addr + r->size - qva; 593 594 return qva - r->guest_user_addr + 595 r->host_user_addr; 596 } 597 } 598 out_error: 599 *len = 0; 600 601 return 0; 602 } 603 604 605 /* 606 * Converts ring address to Vhost virtual address. 607 * If IOMMU is enabled, the ring address is a guest IO virtual address, 608 * else it is a QEMU virtual address. 609 */ 610 static uint64_t 611 ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq, 612 uint64_t ra, uint64_t *size) 613 { 614 if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { 615 uint64_t vva; 616 617 vva = vhost_user_iotlb_cache_find(vq, ra, 618 size, VHOST_ACCESS_RW); 619 if (!vva) 620 vhost_user_iotlb_miss(dev, ra, VHOST_ACCESS_RW); 621 622 return vva; 623 } 624 625 return qva_to_vva(dev, ra, size); 626 } 627 628 static struct virtio_net * 629 translate_ring_addresses(struct virtio_net *dev, int vq_index) 630 { 631 struct vhost_virtqueue *vq = dev->virtqueue[vq_index]; 632 struct vhost_vring_addr *addr = &vq->ring_addrs; 633 uint64_t len, expected_len; 634 635 if (vq_is_packed(dev)) { 636 len = sizeof(struct vring_packed_desc) * vq->size; 637 vq->desc_packed = (struct vring_packed_desc *)(uintptr_t) 638 ring_addr_to_vva(dev, vq, addr->desc_user_addr, &len); 639 vq->log_guest_addr = 0; 640 if (vq->desc_packed == NULL || 641 len != sizeof(struct vring_packed_desc) * 642 vq->size) { 643 RTE_LOG(DEBUG, VHOST_CONFIG, 644 "(%d) failed to map desc_packed ring.\n", 645 dev->vid); 646 return dev; 647 } 648 649 dev = numa_realloc(dev, vq_index); 650 vq = dev->virtqueue[vq_index]; 651 addr = &vq->ring_addrs; 652 653 len = sizeof(struct vring_packed_desc_event); 654 vq->driver_event = (struct vring_packed_desc_event *) 655 (uintptr_t)ring_addr_to_vva(dev, 656 vq, addr->avail_user_addr, &len); 657 if (vq->driver_event == NULL || 658 len != sizeof(struct vring_packed_desc_event)) { 659 RTE_LOG(DEBUG, VHOST_CONFIG, 660 "(%d) failed to find driver area address.\n", 661 dev->vid); 662 return dev; 663 } 664 665 len = sizeof(struct vring_packed_desc_event); 666 vq->device_event = (struct vring_packed_desc_event *) 667 (uintptr_t)ring_addr_to_vva(dev, 668 vq, addr->used_user_addr, &len); 669 if (vq->device_event == NULL || 670 len != sizeof(struct vring_packed_desc_event)) { 671 RTE_LOG(DEBUG, VHOST_CONFIG, 672 "(%d) failed to find device area address.\n", 673 dev->vid); 674 return dev; 675 } 676 677 return dev; 678 } 679 680 /* The addresses are converted from QEMU virtual to Vhost virtual. */ 681 if (vq->desc && vq->avail && vq->used) 682 return dev; 683 684 len = sizeof(struct vring_desc) * vq->size; 685 vq->desc = (struct vring_desc *)(uintptr_t)ring_addr_to_vva(dev, 686 vq, addr->desc_user_addr, &len); 687 if (vq->desc == 0 || len != sizeof(struct vring_desc) * vq->size) { 688 RTE_LOG(DEBUG, VHOST_CONFIG, 689 "(%d) failed to map desc ring.\n", 690 dev->vid); 691 return dev; 692 } 693 694 dev = numa_realloc(dev, vq_index); 695 vq = dev->virtqueue[vq_index]; 696 addr = &vq->ring_addrs; 697 698 len = sizeof(struct vring_avail) + sizeof(uint16_t) * vq->size; 699 if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) 700 len += sizeof(uint16_t); 701 expected_len = len; 702 vq->avail = (struct vring_avail *)(uintptr_t)ring_addr_to_vva(dev, 703 vq, addr->avail_user_addr, &len); 704 if (vq->avail == 0 || len != expected_len) { 705 RTE_LOG(DEBUG, VHOST_CONFIG, 706 "(%d) failed to map avail ring.\n", 707 dev->vid); 708 return dev; 709 } 710 711 len = sizeof(struct vring_used) + 712 sizeof(struct vring_used_elem) * vq->size; 713 if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) 714 len += sizeof(uint16_t); 715 expected_len = len; 716 vq->used = (struct vring_used *)(uintptr_t)ring_addr_to_vva(dev, 717 vq, addr->used_user_addr, &len); 718 if (vq->used == 0 || len != expected_len) { 719 RTE_LOG(DEBUG, VHOST_CONFIG, 720 "(%d) failed to map used ring.\n", 721 dev->vid); 722 return dev; 723 } 724 725 if (vq->last_used_idx != vq->used->idx) { 726 RTE_LOG(WARNING, VHOST_CONFIG, 727 "last_used_idx (%u) and vq->used->idx (%u) mismatches; " 728 "some packets maybe resent for Tx and dropped for Rx\n", 729 vq->last_used_idx, vq->used->idx); 730 vq->last_used_idx = vq->used->idx; 731 vq->last_avail_idx = vq->used->idx; 732 } 733 734 vq->log_guest_addr = addr->log_guest_addr; 735 736 VHOST_LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address desc: %p\n", 737 dev->vid, vq->desc); 738 VHOST_LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address avail: %p\n", 739 dev->vid, vq->avail); 740 VHOST_LOG_DEBUG(VHOST_CONFIG, "(%d) mapped address used: %p\n", 741 dev->vid, vq->used); 742 VHOST_LOG_DEBUG(VHOST_CONFIG, "(%d) log_guest_addr: %" PRIx64 "\n", 743 dev->vid, vq->log_guest_addr); 744 745 return dev; 746 } 747 748 /* 749 * The virtio device sends us the desc, used and avail ring addresses. 750 * This function then converts these to our address space. 751 */ 752 static int 753 vhost_user_set_vring_addr(struct virtio_net **pdev, struct VhostUserMsg *msg, 754 int main_fd __rte_unused) 755 { 756 struct virtio_net *dev = *pdev; 757 struct vhost_virtqueue *vq; 758 struct vhost_vring_addr *addr = &msg->payload.addr; 759 760 if (validate_msg_fds(msg, 0) != 0) 761 return VH_RESULT_ERR; 762 763 if (dev->mem == NULL) 764 return VH_RESULT_ERR; 765 766 /* addr->index refers to the queue index. The txq 1, rxq is 0. */ 767 vq = dev->virtqueue[msg->payload.addr.index]; 768 769 /* 770 * Rings addresses should not be interpreted as long as the ring is not 771 * started and enabled 772 */ 773 memcpy(&vq->ring_addrs, addr, sizeof(*addr)); 774 775 vring_invalidate(dev, vq); 776 777 if (vq->enabled && (dev->features & 778 (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) { 779 dev = translate_ring_addresses(dev, msg->payload.addr.index); 780 if (!dev) 781 return VH_RESULT_ERR; 782 783 *pdev = dev; 784 } 785 786 return VH_RESULT_OK; 787 } 788 789 /* 790 * The virtio device sends us the available ring last used index. 791 */ 792 static int 793 vhost_user_set_vring_base(struct virtio_net **pdev, 794 struct VhostUserMsg *msg, 795 int main_fd __rte_unused) 796 { 797 struct virtio_net *dev = *pdev; 798 struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; 799 uint64_t val = msg->payload.state.num; 800 801 if (validate_msg_fds(msg, 0) != 0) 802 return VH_RESULT_ERR; 803 804 if (vq_is_packed(dev)) { 805 /* 806 * Bit[0:14]: avail index 807 * Bit[15]: avail wrap counter 808 */ 809 vq->last_avail_idx = val & 0x7fff; 810 vq->avail_wrap_counter = !!(val & (0x1 << 15)); 811 /* 812 * Set used index to same value as available one, as 813 * their values should be the same since ring processing 814 * was stopped at get time. 815 */ 816 vq->last_used_idx = vq->last_avail_idx; 817 vq->used_wrap_counter = vq->avail_wrap_counter; 818 } else { 819 vq->last_used_idx = msg->payload.state.num; 820 vq->last_avail_idx = msg->payload.state.num; 821 } 822 823 return VH_RESULT_OK; 824 } 825 826 static int 827 add_one_guest_page(struct virtio_net *dev, uint64_t guest_phys_addr, 828 uint64_t host_phys_addr, uint64_t size) 829 { 830 struct guest_page *page, *last_page; 831 struct guest_page *old_pages; 832 833 if (dev->nr_guest_pages == dev->max_guest_pages) { 834 dev->max_guest_pages *= 2; 835 old_pages = dev->guest_pages; 836 dev->guest_pages = realloc(dev->guest_pages, 837 dev->max_guest_pages * sizeof(*page)); 838 if (!dev->guest_pages) { 839 RTE_LOG(ERR, VHOST_CONFIG, "cannot realloc guest_pages\n"); 840 free(old_pages); 841 return -1; 842 } 843 } 844 845 if (dev->nr_guest_pages > 0) { 846 last_page = &dev->guest_pages[dev->nr_guest_pages - 1]; 847 /* merge if the two pages are continuous */ 848 if (host_phys_addr == last_page->host_phys_addr + 849 last_page->size) { 850 last_page->size += size; 851 return 0; 852 } 853 } 854 855 page = &dev->guest_pages[dev->nr_guest_pages++]; 856 page->guest_phys_addr = guest_phys_addr; 857 page->host_phys_addr = host_phys_addr; 858 page->size = size; 859 860 return 0; 861 } 862 863 static int 864 add_guest_pages(struct virtio_net *dev, struct rte_vhost_mem_region *reg, 865 uint64_t page_size) 866 { 867 uint64_t reg_size = reg->size; 868 uint64_t host_user_addr = reg->host_user_addr; 869 uint64_t guest_phys_addr = reg->guest_phys_addr; 870 uint64_t host_phys_addr; 871 uint64_t size; 872 873 host_phys_addr = rte_mem_virt2iova((void *)(uintptr_t)host_user_addr); 874 size = page_size - (guest_phys_addr & (page_size - 1)); 875 size = RTE_MIN(size, reg_size); 876 877 if (add_one_guest_page(dev, guest_phys_addr, host_phys_addr, size) < 0) 878 return -1; 879 880 host_user_addr += size; 881 guest_phys_addr += size; 882 reg_size -= size; 883 884 while (reg_size > 0) { 885 size = RTE_MIN(reg_size, page_size); 886 host_phys_addr = rte_mem_virt2iova((void *)(uintptr_t) 887 host_user_addr); 888 if (add_one_guest_page(dev, guest_phys_addr, host_phys_addr, 889 size) < 0) 890 return -1; 891 892 host_user_addr += size; 893 guest_phys_addr += size; 894 reg_size -= size; 895 } 896 897 return 0; 898 } 899 900 #ifdef RTE_LIBRTE_VHOST_DEBUG 901 /* TODO: enable it only in debug mode? */ 902 static void 903 dump_guest_pages(struct virtio_net *dev) 904 { 905 uint32_t i; 906 struct guest_page *page; 907 908 for (i = 0; i < dev->nr_guest_pages; i++) { 909 page = &dev->guest_pages[i]; 910 911 RTE_LOG(INFO, VHOST_CONFIG, 912 "guest physical page region %u\n" 913 "\t guest_phys_addr: %" PRIx64 "\n" 914 "\t host_phys_addr : %" PRIx64 "\n" 915 "\t size : %" PRIx64 "\n", 916 i, 917 page->guest_phys_addr, 918 page->host_phys_addr, 919 page->size); 920 } 921 } 922 #else 923 #define dump_guest_pages(dev) 924 #endif 925 926 static bool 927 vhost_memory_changed(struct VhostUserMemory *new, 928 struct rte_vhost_memory *old) 929 { 930 uint32_t i; 931 932 if (new->nregions != old->nregions) 933 return true; 934 935 for (i = 0; i < new->nregions; ++i) { 936 VhostUserMemoryRegion *new_r = &new->regions[i]; 937 struct rte_vhost_mem_region *old_r = &old->regions[i]; 938 939 if (new_r->guest_phys_addr != old_r->guest_phys_addr) 940 return true; 941 if (new_r->memory_size != old_r->size) 942 return true; 943 if (new_r->userspace_addr != old_r->guest_user_addr) 944 return true; 945 } 946 947 return false; 948 } 949 950 static int 951 vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, 952 int main_fd) 953 { 954 struct virtio_net *dev = *pdev; 955 struct VhostUserMemory *memory = &msg->payload.memory; 956 struct rte_vhost_mem_region *reg; 957 void *mmap_addr; 958 uint64_t mmap_size; 959 uint64_t mmap_offset; 960 uint64_t alignment; 961 uint32_t i; 962 int populate; 963 int fd; 964 965 if (validate_msg_fds(msg, memory->nregions) != 0) 966 return VH_RESULT_ERR; 967 968 if (memory->nregions > VHOST_MEMORY_MAX_NREGIONS) { 969 RTE_LOG(ERR, VHOST_CONFIG, 970 "too many memory regions (%u)\n", memory->nregions); 971 return VH_RESULT_ERR; 972 } 973 974 if (dev->mem && !vhost_memory_changed(memory, dev->mem)) { 975 RTE_LOG(INFO, VHOST_CONFIG, 976 "(%d) memory regions not changed\n", dev->vid); 977 978 close_msg_fds(msg); 979 980 return VH_RESULT_OK; 981 } 982 983 if (dev->mem) { 984 free_mem_region(dev); 985 rte_free(dev->mem); 986 dev->mem = NULL; 987 } 988 989 /* Flush IOTLB cache as previous HVAs are now invalid */ 990 if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) 991 for (i = 0; i < dev->nr_vring; i++) 992 vhost_user_iotlb_flush_all(dev->virtqueue[i]); 993 994 dev->nr_guest_pages = 0; 995 if (!dev->guest_pages) { 996 dev->max_guest_pages = 8; 997 dev->guest_pages = malloc(dev->max_guest_pages * 998 sizeof(struct guest_page)); 999 if (dev->guest_pages == NULL) { 1000 RTE_LOG(ERR, VHOST_CONFIG, 1001 "(%d) failed to allocate memory " 1002 "for dev->guest_pages\n", 1003 dev->vid); 1004 return VH_RESULT_ERR; 1005 } 1006 } 1007 1008 dev->mem = rte_zmalloc("vhost-mem-table", sizeof(struct rte_vhost_memory) + 1009 sizeof(struct rte_vhost_mem_region) * memory->nregions, 0); 1010 if (dev->mem == NULL) { 1011 RTE_LOG(ERR, VHOST_CONFIG, 1012 "(%d) failed to allocate memory for dev->mem\n", 1013 dev->vid); 1014 return VH_RESULT_ERR; 1015 } 1016 dev->mem->nregions = memory->nregions; 1017 1018 for (i = 0; i < memory->nregions; i++) { 1019 fd = msg->fds[i]; 1020 reg = &dev->mem->regions[i]; 1021 1022 reg->guest_phys_addr = memory->regions[i].guest_phys_addr; 1023 reg->guest_user_addr = memory->regions[i].userspace_addr; 1024 reg->size = memory->regions[i].memory_size; 1025 reg->fd = fd; 1026 1027 mmap_offset = memory->regions[i].mmap_offset; 1028 1029 /* Check for memory_size + mmap_offset overflow */ 1030 if (mmap_offset >= -reg->size) { 1031 RTE_LOG(ERR, VHOST_CONFIG, 1032 "mmap_offset (%#"PRIx64") and memory_size " 1033 "(%#"PRIx64") overflow\n", 1034 mmap_offset, reg->size); 1035 goto err_mmap; 1036 } 1037 1038 mmap_size = reg->size + mmap_offset; 1039 1040 /* mmap() without flag of MAP_ANONYMOUS, should be called 1041 * with length argument aligned with hugepagesz at older 1042 * longterm version Linux, like 2.6.32 and 3.2.72, or 1043 * mmap() will fail with EINVAL. 1044 * 1045 * to avoid failure, make sure in caller to keep length 1046 * aligned. 1047 */ 1048 alignment = get_blk_size(fd); 1049 if (alignment == (uint64_t)-1) { 1050 RTE_LOG(ERR, VHOST_CONFIG, 1051 "couldn't get hugepage size through fstat\n"); 1052 goto err_mmap; 1053 } 1054 mmap_size = RTE_ALIGN_CEIL(mmap_size, alignment); 1055 1056 populate = (dev->dequeue_zero_copy) ? MAP_POPULATE : 0; 1057 mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, 1058 MAP_SHARED | populate, fd, 0); 1059 1060 if (mmap_addr == MAP_FAILED) { 1061 RTE_LOG(ERR, VHOST_CONFIG, 1062 "mmap region %u failed.\n", i); 1063 goto err_mmap; 1064 } 1065 1066 reg->mmap_addr = mmap_addr; 1067 reg->mmap_size = mmap_size; 1068 reg->host_user_addr = (uint64_t)(uintptr_t)mmap_addr + 1069 mmap_offset; 1070 1071 if (dev->dequeue_zero_copy) 1072 if (add_guest_pages(dev, reg, alignment) < 0) { 1073 RTE_LOG(ERR, VHOST_CONFIG, 1074 "adding guest pages to region %u failed.\n", 1075 i); 1076 goto err_mmap; 1077 } 1078 1079 RTE_LOG(INFO, VHOST_CONFIG, 1080 "guest memory region %u, size: 0x%" PRIx64 "\n" 1081 "\t guest physical addr: 0x%" PRIx64 "\n" 1082 "\t guest virtual addr: 0x%" PRIx64 "\n" 1083 "\t host virtual addr: 0x%" PRIx64 "\n" 1084 "\t mmap addr : 0x%" PRIx64 "\n" 1085 "\t mmap size : 0x%" PRIx64 "\n" 1086 "\t mmap align: 0x%" PRIx64 "\n" 1087 "\t mmap off : 0x%" PRIx64 "\n", 1088 i, reg->size, 1089 reg->guest_phys_addr, 1090 reg->guest_user_addr, 1091 reg->host_user_addr, 1092 (uint64_t)(uintptr_t)mmap_addr, 1093 mmap_size, 1094 alignment, 1095 mmap_offset); 1096 1097 if (dev->postcopy_listening) { 1098 /* 1099 * We haven't a better way right now than sharing 1100 * DPDK's virtual address with Qemu, so that Qemu can 1101 * retrieve the region offset when handling userfaults. 1102 */ 1103 memory->regions[i].userspace_addr = 1104 reg->host_user_addr; 1105 } 1106 } 1107 if (dev->postcopy_listening) { 1108 /* Send the addresses back to qemu */ 1109 msg->fd_num = 0; 1110 send_vhost_reply(main_fd, msg); 1111 1112 /* Wait for qemu to acknolwedge it's got the addresses 1113 * we've got to wait before we're allowed to generate faults. 1114 */ 1115 VhostUserMsg ack_msg; 1116 if (read_vhost_message(main_fd, &ack_msg) <= 0) { 1117 RTE_LOG(ERR, VHOST_CONFIG, 1118 "Failed to read qemu ack on postcopy set-mem-table\n"); 1119 goto err_mmap; 1120 } 1121 1122 if (validate_msg_fds(&ack_msg, 0) != 0) 1123 goto err_mmap; 1124 1125 if (ack_msg.request.master != VHOST_USER_SET_MEM_TABLE) { 1126 RTE_LOG(ERR, VHOST_CONFIG, 1127 "Bad qemu ack on postcopy set-mem-table (%d)\n", 1128 ack_msg.request.master); 1129 goto err_mmap; 1130 } 1131 1132 /* Now userfault register and we can use the memory */ 1133 for (i = 0; i < memory->nregions; i++) { 1134 #ifdef RTE_LIBRTE_VHOST_POSTCOPY 1135 reg = &dev->mem->regions[i]; 1136 struct uffdio_register reg_struct; 1137 1138 /* 1139 * Let's register all the mmap'ed area to ensure 1140 * alignment on page boundary. 1141 */ 1142 reg_struct.range.start = 1143 (uint64_t)(uintptr_t)reg->mmap_addr; 1144 reg_struct.range.len = reg->mmap_size; 1145 reg_struct.mode = UFFDIO_REGISTER_MODE_MISSING; 1146 1147 if (ioctl(dev->postcopy_ufd, UFFDIO_REGISTER, 1148 ®_struct)) { 1149 RTE_LOG(ERR, VHOST_CONFIG, 1150 "Failed to register ufd for region %d: (ufd = %d) %s\n", 1151 i, dev->postcopy_ufd, 1152 strerror(errno)); 1153 goto err_mmap; 1154 } 1155 RTE_LOG(INFO, VHOST_CONFIG, 1156 "\t userfaultfd registered for range : %llx - %llx\n", 1157 reg_struct.range.start, 1158 reg_struct.range.start + 1159 reg_struct.range.len - 1); 1160 #else 1161 goto err_mmap; 1162 #endif 1163 } 1164 } 1165 1166 for (i = 0; i < dev->nr_vring; i++) { 1167 struct vhost_virtqueue *vq = dev->virtqueue[i]; 1168 1169 if (vq->desc || vq->avail || vq->used) { 1170 /* 1171 * If the memory table got updated, the ring addresses 1172 * need to be translated again as virtual addresses have 1173 * changed. 1174 */ 1175 vring_invalidate(dev, vq); 1176 1177 dev = translate_ring_addresses(dev, i); 1178 if (!dev) { 1179 dev = *pdev; 1180 goto err_mmap; 1181 } 1182 1183 *pdev = dev; 1184 } 1185 } 1186 1187 dump_guest_pages(dev); 1188 1189 return VH_RESULT_OK; 1190 1191 err_mmap: 1192 free_mem_region(dev); 1193 rte_free(dev->mem); 1194 dev->mem = NULL; 1195 return VH_RESULT_ERR; 1196 } 1197 1198 static bool 1199 vq_is_ready(struct virtio_net *dev, struct vhost_virtqueue *vq) 1200 { 1201 bool rings_ok; 1202 1203 if (!vq) 1204 return false; 1205 1206 if (vq_is_packed(dev)) 1207 rings_ok = !!vq->desc_packed; 1208 else 1209 rings_ok = vq->desc && vq->avail && vq->used; 1210 1211 return rings_ok && 1212 vq->kickfd != VIRTIO_UNINITIALIZED_EVENTFD && 1213 vq->callfd != VIRTIO_UNINITIALIZED_EVENTFD; 1214 } 1215 1216 static int 1217 virtio_is_ready(struct virtio_net *dev) 1218 { 1219 struct vhost_virtqueue *vq; 1220 uint32_t i; 1221 1222 if (dev->nr_vring == 0) 1223 return 0; 1224 1225 for (i = 0; i < dev->nr_vring; i++) { 1226 vq = dev->virtqueue[i]; 1227 1228 if (!vq_is_ready(dev, vq)) 1229 return 0; 1230 } 1231 1232 RTE_LOG(INFO, VHOST_CONFIG, 1233 "virtio is now ready for processing.\n"); 1234 return 1; 1235 } 1236 1237 static int 1238 vhost_user_set_vring_call(struct virtio_net **pdev, struct VhostUserMsg *msg, 1239 int main_fd __rte_unused) 1240 { 1241 struct virtio_net *dev = *pdev; 1242 struct vhost_vring_file file; 1243 struct vhost_virtqueue *vq; 1244 int expected_fds; 1245 1246 expected_fds = (msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK) ? 0 : 1; 1247 if (validate_msg_fds(msg, expected_fds) != 0) 1248 return VH_RESULT_ERR; 1249 1250 file.index = msg->payload.u64 & VHOST_USER_VRING_IDX_MASK; 1251 if (msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK) 1252 file.fd = VIRTIO_INVALID_EVENTFD; 1253 else 1254 file.fd = msg->fds[0]; 1255 RTE_LOG(INFO, VHOST_CONFIG, 1256 "vring call idx:%d file:%d\n", file.index, file.fd); 1257 1258 vq = dev->virtqueue[file.index]; 1259 if (vq->callfd >= 0) 1260 close(vq->callfd); 1261 1262 vq->callfd = file.fd; 1263 1264 return VH_RESULT_OK; 1265 } 1266 1267 static int vhost_user_set_vring_err(struct virtio_net **pdev __rte_unused, 1268 struct VhostUserMsg *msg, 1269 int main_fd __rte_unused) 1270 { 1271 int expected_fds; 1272 1273 expected_fds = (msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK) ? 0 : 1; 1274 if (validate_msg_fds(msg, expected_fds) != 0) 1275 return VH_RESULT_ERR; 1276 1277 if (!(msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK)) 1278 close(msg->fds[0]); 1279 RTE_LOG(INFO, VHOST_CONFIG, "not implemented\n"); 1280 1281 return VH_RESULT_OK; 1282 } 1283 1284 static int 1285 vhost_user_set_vring_kick(struct virtio_net **pdev, struct VhostUserMsg *msg, 1286 int main_fd __rte_unused) 1287 { 1288 struct virtio_net *dev = *pdev; 1289 struct vhost_vring_file file; 1290 struct vhost_virtqueue *vq; 1291 int expected_fds; 1292 1293 expected_fds = (msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK) ? 0 : 1; 1294 if (validate_msg_fds(msg, expected_fds) != 0) 1295 return VH_RESULT_ERR; 1296 1297 file.index = msg->payload.u64 & VHOST_USER_VRING_IDX_MASK; 1298 if (msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK) 1299 file.fd = VIRTIO_INVALID_EVENTFD; 1300 else 1301 file.fd = msg->fds[0]; 1302 RTE_LOG(INFO, VHOST_CONFIG, 1303 "vring kick idx:%d file:%d\n", file.index, file.fd); 1304 1305 /* Interpret ring addresses only when ring is started. */ 1306 dev = translate_ring_addresses(dev, file.index); 1307 if (!dev) 1308 return VH_RESULT_ERR; 1309 1310 *pdev = dev; 1311 1312 vq = dev->virtqueue[file.index]; 1313 1314 /* 1315 * When VHOST_USER_F_PROTOCOL_FEATURES is not negotiated, 1316 * the ring starts already enabled. Otherwise, it is enabled via 1317 * the SET_VRING_ENABLE message. 1318 */ 1319 if (!(dev->features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) { 1320 vq->enabled = 1; 1321 if (dev->notify_ops->vring_state_changed) 1322 dev->notify_ops->vring_state_changed( 1323 dev->vid, file.index, 1); 1324 } 1325 1326 if (vq->kickfd >= 0) 1327 close(vq->kickfd); 1328 vq->kickfd = file.fd; 1329 1330 return VH_RESULT_OK; 1331 } 1332 1333 static void 1334 free_zmbufs(struct vhost_virtqueue *vq) 1335 { 1336 drain_zmbuf_list(vq); 1337 1338 rte_free(vq->zmbufs); 1339 } 1340 1341 /* 1342 * when virtio is stopped, qemu will send us the GET_VRING_BASE message. 1343 */ 1344 static int 1345 vhost_user_get_vring_base(struct virtio_net **pdev, 1346 struct VhostUserMsg *msg, 1347 int main_fd __rte_unused) 1348 { 1349 struct virtio_net *dev = *pdev; 1350 struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; 1351 uint64_t val; 1352 1353 if (validate_msg_fds(msg, 0) != 0) 1354 return VH_RESULT_ERR; 1355 1356 /* We have to stop the queue (virtio) if it is running. */ 1357 vhost_destroy_device_notify(dev); 1358 1359 dev->flags &= ~VIRTIO_DEV_READY; 1360 dev->flags &= ~VIRTIO_DEV_VDPA_CONFIGURED; 1361 1362 /* Here we are safe to get the indexes */ 1363 if (vq_is_packed(dev)) { 1364 /* 1365 * Bit[0:14]: avail index 1366 * Bit[15]: avail wrap counter 1367 */ 1368 val = vq->last_avail_idx & 0x7fff; 1369 val |= vq->avail_wrap_counter << 15; 1370 msg->payload.state.num = val; 1371 } else { 1372 msg->payload.state.num = vq->last_avail_idx; 1373 } 1374 1375 RTE_LOG(INFO, VHOST_CONFIG, 1376 "vring base idx:%d file:%d\n", msg->payload.state.index, 1377 msg->payload.state.num); 1378 /* 1379 * Based on current qemu vhost-user implementation, this message is 1380 * sent and only sent in vhost_vring_stop. 1381 * TODO: cleanup the vring, it isn't usable since here. 1382 */ 1383 if (vq->kickfd >= 0) 1384 close(vq->kickfd); 1385 1386 vq->kickfd = VIRTIO_UNINITIALIZED_EVENTFD; 1387 1388 if (vq->callfd >= 0) 1389 close(vq->callfd); 1390 1391 vq->callfd = VIRTIO_UNINITIALIZED_EVENTFD; 1392 1393 vq->signalled_used_valid = false; 1394 1395 if (dev->dequeue_zero_copy) 1396 free_zmbufs(vq); 1397 if (vq_is_packed(dev)) { 1398 rte_free(vq->shadow_used_packed); 1399 vq->shadow_used_packed = NULL; 1400 } else { 1401 rte_free(vq->shadow_used_split); 1402 vq->shadow_used_split = NULL; 1403 } 1404 1405 rte_free(vq->batch_copy_elems); 1406 vq->batch_copy_elems = NULL; 1407 1408 msg->size = sizeof(msg->payload.state); 1409 msg->fd_num = 0; 1410 1411 return VH_RESULT_REPLY; 1412 } 1413 1414 /* 1415 * when virtio queues are ready to work, qemu will send us to 1416 * enable the virtio queue pair. 1417 */ 1418 static int 1419 vhost_user_set_vring_enable(struct virtio_net **pdev, 1420 struct VhostUserMsg *msg, 1421 int main_fd __rte_unused) 1422 { 1423 struct virtio_net *dev = *pdev; 1424 int enable = (int)msg->payload.state.num; 1425 int index = (int)msg->payload.state.index; 1426 struct rte_vdpa_device *vdpa_dev; 1427 int did = -1; 1428 1429 if (validate_msg_fds(msg, 0) != 0) 1430 return VH_RESULT_ERR; 1431 1432 RTE_LOG(INFO, VHOST_CONFIG, 1433 "set queue enable: %d to qp idx: %d\n", 1434 enable, index); 1435 1436 did = dev->vdpa_dev_id; 1437 vdpa_dev = rte_vdpa_get_device(did); 1438 if (vdpa_dev && vdpa_dev->ops->set_vring_state) 1439 vdpa_dev->ops->set_vring_state(dev->vid, index, enable); 1440 1441 if (dev->notify_ops->vring_state_changed) 1442 dev->notify_ops->vring_state_changed(dev->vid, 1443 index, enable); 1444 1445 /* On disable, rings have to be stopped being processed. */ 1446 if (!enable && dev->dequeue_zero_copy) 1447 drain_zmbuf_list(dev->virtqueue[index]); 1448 1449 dev->virtqueue[index]->enabled = enable; 1450 1451 return VH_RESULT_OK; 1452 } 1453 1454 static int 1455 vhost_user_get_protocol_features(struct virtio_net **pdev, 1456 struct VhostUserMsg *msg, 1457 int main_fd __rte_unused) 1458 { 1459 struct virtio_net *dev = *pdev; 1460 uint64_t features, protocol_features; 1461 1462 if (validate_msg_fds(msg, 0) != 0) 1463 return VH_RESULT_ERR; 1464 1465 rte_vhost_driver_get_features(dev->ifname, &features); 1466 rte_vhost_driver_get_protocol_features(dev->ifname, &protocol_features); 1467 1468 /* 1469 * REPLY_ACK protocol feature is only mandatory for now 1470 * for IOMMU feature. If IOMMU is explicitly disabled by the 1471 * application, disable also REPLY_ACK feature for older buggy 1472 * Qemu versions (from v2.7.0 to v2.9.0). 1473 */ 1474 if (!(features & (1ULL << VIRTIO_F_IOMMU_PLATFORM))) 1475 protocol_features &= ~(1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK); 1476 1477 msg->payload.u64 = protocol_features; 1478 msg->size = sizeof(msg->payload.u64); 1479 msg->fd_num = 0; 1480 1481 return VH_RESULT_REPLY; 1482 } 1483 1484 static int 1485 vhost_user_set_protocol_features(struct virtio_net **pdev, 1486 struct VhostUserMsg *msg, 1487 int main_fd __rte_unused) 1488 { 1489 struct virtio_net *dev = *pdev; 1490 uint64_t protocol_features = msg->payload.u64; 1491 uint64_t slave_protocol_features = 0; 1492 1493 if (validate_msg_fds(msg, 0) != 0) 1494 return VH_RESULT_ERR; 1495 1496 rte_vhost_driver_get_protocol_features(dev->ifname, 1497 &slave_protocol_features); 1498 if (protocol_features & ~slave_protocol_features) { 1499 RTE_LOG(ERR, VHOST_CONFIG, 1500 "(%d) received invalid protocol features.\n", 1501 dev->vid); 1502 return VH_RESULT_ERR; 1503 } 1504 1505 dev->protocol_features = protocol_features; 1506 1507 return VH_RESULT_OK; 1508 } 1509 1510 static int 1511 vhost_user_set_log_base(struct virtio_net **pdev, struct VhostUserMsg *msg, 1512 int main_fd __rte_unused) 1513 { 1514 struct virtio_net *dev = *pdev; 1515 int fd = msg->fds[0]; 1516 uint64_t size, off; 1517 void *addr; 1518 1519 if (validate_msg_fds(msg, 1) != 0) 1520 return VH_RESULT_ERR; 1521 1522 if (fd < 0) { 1523 RTE_LOG(ERR, VHOST_CONFIG, "invalid log fd: %d\n", fd); 1524 return VH_RESULT_ERR; 1525 } 1526 1527 if (msg->size != sizeof(VhostUserLog)) { 1528 RTE_LOG(ERR, VHOST_CONFIG, 1529 "invalid log base msg size: %"PRId32" != %d\n", 1530 msg->size, (int)sizeof(VhostUserLog)); 1531 return VH_RESULT_ERR; 1532 } 1533 1534 size = msg->payload.log.mmap_size; 1535 off = msg->payload.log.mmap_offset; 1536 1537 /* Don't allow mmap_offset to point outside the mmap region */ 1538 if (off > size) { 1539 RTE_LOG(ERR, VHOST_CONFIG, 1540 "log offset %#"PRIx64" exceeds log size %#"PRIx64"\n", 1541 off, size); 1542 return VH_RESULT_ERR; 1543 } 1544 1545 RTE_LOG(INFO, VHOST_CONFIG, 1546 "log mmap size: %"PRId64", offset: %"PRId64"\n", 1547 size, off); 1548 1549 /* 1550 * mmap from 0 to workaround a hugepage mmap bug: mmap will 1551 * fail when offset is not page size aligned. 1552 */ 1553 addr = mmap(0, size + off, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 1554 close(fd); 1555 if (addr == MAP_FAILED) { 1556 RTE_LOG(ERR, VHOST_CONFIG, "mmap log base failed!\n"); 1557 return VH_RESULT_ERR; 1558 } 1559 1560 /* 1561 * Free previously mapped log memory on occasionally 1562 * multiple VHOST_USER_SET_LOG_BASE. 1563 */ 1564 if (dev->log_addr) { 1565 munmap((void *)(uintptr_t)dev->log_addr, dev->log_size); 1566 } 1567 dev->log_addr = (uint64_t)(uintptr_t)addr; 1568 dev->log_base = dev->log_addr + off; 1569 dev->log_size = size; 1570 1571 /* 1572 * The spec is not clear about it (yet), but QEMU doesn't expect 1573 * any payload in the reply. 1574 */ 1575 msg->size = 0; 1576 msg->fd_num = 0; 1577 1578 return VH_RESULT_REPLY; 1579 } 1580 1581 static int vhost_user_set_log_fd(struct virtio_net **pdev __rte_unused, 1582 struct VhostUserMsg *msg, 1583 int main_fd __rte_unused) 1584 { 1585 if (validate_msg_fds(msg, 1) != 0) 1586 return VH_RESULT_ERR; 1587 1588 close(msg->fds[0]); 1589 RTE_LOG(INFO, VHOST_CONFIG, "not implemented.\n"); 1590 1591 return VH_RESULT_OK; 1592 } 1593 1594 /* 1595 * An rarp packet is constructed and broadcasted to notify switches about 1596 * the new location of the migrated VM, so that packets from outside will 1597 * not be lost after migration. 1598 * 1599 * However, we don't actually "send" a rarp packet here, instead, we set 1600 * a flag 'broadcast_rarp' to let rte_vhost_dequeue_burst() inject it. 1601 */ 1602 static int 1603 vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg, 1604 int main_fd __rte_unused) 1605 { 1606 struct virtio_net *dev = *pdev; 1607 uint8_t *mac = (uint8_t *)&msg->payload.u64; 1608 struct rte_vdpa_device *vdpa_dev; 1609 int did = -1; 1610 1611 if (validate_msg_fds(msg, 0) != 0) 1612 return VH_RESULT_ERR; 1613 1614 RTE_LOG(DEBUG, VHOST_CONFIG, 1615 ":: mac: %02x:%02x:%02x:%02x:%02x:%02x\n", 1616 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 1617 memcpy(dev->mac.addr_bytes, mac, 6); 1618 1619 /* 1620 * Set the flag to inject a RARP broadcast packet at 1621 * rte_vhost_dequeue_burst(). 1622 * 1623 * rte_smp_wmb() is for making sure the mac is copied 1624 * before the flag is set. 1625 */ 1626 rte_smp_wmb(); 1627 rte_atomic16_set(&dev->broadcast_rarp, 1); 1628 did = dev->vdpa_dev_id; 1629 vdpa_dev = rte_vdpa_get_device(did); 1630 if (vdpa_dev && vdpa_dev->ops->migration_done) 1631 vdpa_dev->ops->migration_done(dev->vid); 1632 1633 return VH_RESULT_OK; 1634 } 1635 1636 static int 1637 vhost_user_net_set_mtu(struct virtio_net **pdev, struct VhostUserMsg *msg, 1638 int main_fd __rte_unused) 1639 { 1640 struct virtio_net *dev = *pdev; 1641 1642 if (validate_msg_fds(msg, 0) != 0) 1643 return VH_RESULT_ERR; 1644 1645 if (msg->payload.u64 < VIRTIO_MIN_MTU || 1646 msg->payload.u64 > VIRTIO_MAX_MTU) { 1647 RTE_LOG(ERR, VHOST_CONFIG, "Invalid MTU size (%"PRIu64")\n", 1648 msg->payload.u64); 1649 1650 return VH_RESULT_ERR; 1651 } 1652 1653 dev->mtu = msg->payload.u64; 1654 1655 return VH_RESULT_OK; 1656 } 1657 1658 static int 1659 vhost_user_set_req_fd(struct virtio_net **pdev, struct VhostUserMsg *msg, 1660 int main_fd __rte_unused) 1661 { 1662 struct virtio_net *dev = *pdev; 1663 int fd = msg->fds[0]; 1664 1665 if (validate_msg_fds(msg, 1) != 0) 1666 return VH_RESULT_ERR; 1667 1668 if (fd < 0) { 1669 RTE_LOG(ERR, VHOST_CONFIG, 1670 "Invalid file descriptor for slave channel (%d)\n", 1671 fd); 1672 return VH_RESULT_ERR; 1673 } 1674 1675 dev->slave_req_fd = fd; 1676 1677 return VH_RESULT_OK; 1678 } 1679 1680 static int 1681 is_vring_iotlb_update(struct vhost_virtqueue *vq, struct vhost_iotlb_msg *imsg) 1682 { 1683 struct vhost_vring_addr *ra; 1684 uint64_t start, end; 1685 1686 start = imsg->iova; 1687 end = start + imsg->size; 1688 1689 ra = &vq->ring_addrs; 1690 if (ra->desc_user_addr >= start && ra->desc_user_addr < end) 1691 return 1; 1692 if (ra->avail_user_addr >= start && ra->avail_user_addr < end) 1693 return 1; 1694 if (ra->used_user_addr >= start && ra->used_user_addr < end) 1695 return 1; 1696 1697 return 0; 1698 } 1699 1700 static int 1701 is_vring_iotlb_invalidate(struct vhost_virtqueue *vq, 1702 struct vhost_iotlb_msg *imsg) 1703 { 1704 uint64_t istart, iend, vstart, vend; 1705 1706 istart = imsg->iova; 1707 iend = istart + imsg->size - 1; 1708 1709 vstart = (uintptr_t)vq->desc; 1710 vend = vstart + sizeof(struct vring_desc) * vq->size - 1; 1711 if (vstart <= iend && istart <= vend) 1712 return 1; 1713 1714 vstart = (uintptr_t)vq->avail; 1715 vend = vstart + sizeof(struct vring_avail); 1716 vend += sizeof(uint16_t) * vq->size - 1; 1717 if (vstart <= iend && istart <= vend) 1718 return 1; 1719 1720 vstart = (uintptr_t)vq->used; 1721 vend = vstart + sizeof(struct vring_used); 1722 vend += sizeof(struct vring_used_elem) * vq->size - 1; 1723 if (vstart <= iend && istart <= vend) 1724 return 1; 1725 1726 return 0; 1727 } 1728 1729 static int 1730 vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, 1731 int main_fd __rte_unused) 1732 { 1733 struct virtio_net *dev = *pdev; 1734 struct vhost_iotlb_msg *imsg = &msg->payload.iotlb; 1735 uint16_t i; 1736 uint64_t vva, len; 1737 1738 if (validate_msg_fds(msg, 0) != 0) 1739 return VH_RESULT_ERR; 1740 1741 switch (imsg->type) { 1742 case VHOST_IOTLB_UPDATE: 1743 len = imsg->size; 1744 vva = qva_to_vva(dev, imsg->uaddr, &len); 1745 if (!vva) 1746 return VH_RESULT_ERR; 1747 1748 for (i = 0; i < dev->nr_vring; i++) { 1749 struct vhost_virtqueue *vq = dev->virtqueue[i]; 1750 1751 vhost_user_iotlb_cache_insert(vq, imsg->iova, vva, 1752 len, imsg->perm); 1753 1754 if (is_vring_iotlb_update(vq, imsg)) 1755 *pdev = dev = translate_ring_addresses(dev, i); 1756 } 1757 break; 1758 case VHOST_IOTLB_INVALIDATE: 1759 for (i = 0; i < dev->nr_vring; i++) { 1760 struct vhost_virtqueue *vq = dev->virtqueue[i]; 1761 1762 vhost_user_iotlb_cache_remove(vq, imsg->iova, 1763 imsg->size); 1764 1765 if (is_vring_iotlb_invalidate(vq, imsg)) 1766 vring_invalidate(dev, vq); 1767 } 1768 break; 1769 default: 1770 RTE_LOG(ERR, VHOST_CONFIG, "Invalid IOTLB message type (%d)\n", 1771 imsg->type); 1772 return VH_RESULT_ERR; 1773 } 1774 1775 return VH_RESULT_OK; 1776 } 1777 1778 static int 1779 vhost_user_set_postcopy_advise(struct virtio_net **pdev, 1780 struct VhostUserMsg *msg, 1781 int main_fd __rte_unused) 1782 { 1783 struct virtio_net *dev = *pdev; 1784 #ifdef RTE_LIBRTE_VHOST_POSTCOPY 1785 struct uffdio_api api_struct; 1786 1787 if (validate_msg_fds(msg, 0) != 0) 1788 return VH_RESULT_ERR; 1789 1790 dev->postcopy_ufd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); 1791 1792 if (dev->postcopy_ufd == -1) { 1793 RTE_LOG(ERR, VHOST_CONFIG, "Userfaultfd not available: %s\n", 1794 strerror(errno)); 1795 return VH_RESULT_ERR; 1796 } 1797 api_struct.api = UFFD_API; 1798 api_struct.features = 0; 1799 if (ioctl(dev->postcopy_ufd, UFFDIO_API, &api_struct)) { 1800 RTE_LOG(ERR, VHOST_CONFIG, "UFFDIO_API ioctl failure: %s\n", 1801 strerror(errno)); 1802 close(dev->postcopy_ufd); 1803 dev->postcopy_ufd = -1; 1804 return VH_RESULT_ERR; 1805 } 1806 msg->fds[0] = dev->postcopy_ufd; 1807 msg->fd_num = 1; 1808 1809 return VH_RESULT_REPLY; 1810 #else 1811 dev->postcopy_ufd = -1; 1812 msg->fd_num = 0; 1813 1814 return VH_RESULT_ERR; 1815 #endif 1816 } 1817 1818 static int 1819 vhost_user_set_postcopy_listen(struct virtio_net **pdev, 1820 struct VhostUserMsg *msg __rte_unused, 1821 int main_fd __rte_unused) 1822 { 1823 struct virtio_net *dev = *pdev; 1824 1825 if (validate_msg_fds(msg, 0) != 0) 1826 return VH_RESULT_ERR; 1827 1828 if (dev->mem && dev->mem->nregions) { 1829 RTE_LOG(ERR, VHOST_CONFIG, 1830 "Regions already registered at postcopy-listen\n"); 1831 return VH_RESULT_ERR; 1832 } 1833 dev->postcopy_listening = 1; 1834 1835 return VH_RESULT_OK; 1836 } 1837 1838 static int 1839 vhost_user_postcopy_end(struct virtio_net **pdev, struct VhostUserMsg *msg, 1840 int main_fd __rte_unused) 1841 { 1842 struct virtio_net *dev = *pdev; 1843 1844 if (validate_msg_fds(msg, 0) != 0) 1845 return VH_RESULT_ERR; 1846 1847 dev->postcopy_listening = 0; 1848 if (dev->postcopy_ufd >= 0) { 1849 close(dev->postcopy_ufd); 1850 dev->postcopy_ufd = -1; 1851 } 1852 1853 msg->payload.u64 = 0; 1854 msg->size = sizeof(msg->payload.u64); 1855 msg->fd_num = 0; 1856 1857 return VH_RESULT_REPLY; 1858 } 1859 1860 typedef int (*vhost_message_handler_t)(struct virtio_net **pdev, 1861 struct VhostUserMsg *msg, 1862 int main_fd); 1863 static vhost_message_handler_t vhost_message_handlers[VHOST_USER_MAX] = { 1864 [VHOST_USER_NONE] = NULL, 1865 [VHOST_USER_GET_FEATURES] = vhost_user_get_features, 1866 [VHOST_USER_SET_FEATURES] = vhost_user_set_features, 1867 [VHOST_USER_SET_OWNER] = vhost_user_set_owner, 1868 [VHOST_USER_RESET_OWNER] = vhost_user_reset_owner, 1869 [VHOST_USER_SET_MEM_TABLE] = vhost_user_set_mem_table, 1870 [VHOST_USER_SET_LOG_BASE] = vhost_user_set_log_base, 1871 [VHOST_USER_SET_LOG_FD] = vhost_user_set_log_fd, 1872 [VHOST_USER_SET_VRING_NUM] = vhost_user_set_vring_num, 1873 [VHOST_USER_SET_VRING_ADDR] = vhost_user_set_vring_addr, 1874 [VHOST_USER_SET_VRING_BASE] = vhost_user_set_vring_base, 1875 [VHOST_USER_GET_VRING_BASE] = vhost_user_get_vring_base, 1876 [VHOST_USER_SET_VRING_KICK] = vhost_user_set_vring_kick, 1877 [VHOST_USER_SET_VRING_CALL] = vhost_user_set_vring_call, 1878 [VHOST_USER_SET_VRING_ERR] = vhost_user_set_vring_err, 1879 [VHOST_USER_GET_PROTOCOL_FEATURES] = vhost_user_get_protocol_features, 1880 [VHOST_USER_SET_PROTOCOL_FEATURES] = vhost_user_set_protocol_features, 1881 [VHOST_USER_GET_QUEUE_NUM] = vhost_user_get_queue_num, 1882 [VHOST_USER_SET_VRING_ENABLE] = vhost_user_set_vring_enable, 1883 [VHOST_USER_SEND_RARP] = vhost_user_send_rarp, 1884 [VHOST_USER_NET_SET_MTU] = vhost_user_net_set_mtu, 1885 [VHOST_USER_SET_SLAVE_REQ_FD] = vhost_user_set_req_fd, 1886 [VHOST_USER_IOTLB_MSG] = vhost_user_iotlb_msg, 1887 [VHOST_USER_POSTCOPY_ADVISE] = vhost_user_set_postcopy_advise, 1888 [VHOST_USER_POSTCOPY_LISTEN] = vhost_user_set_postcopy_listen, 1889 [VHOST_USER_POSTCOPY_END] = vhost_user_postcopy_end, 1890 }; 1891 1892 1893 /* return bytes# of read on success or negative val on failure. */ 1894 static int 1895 read_vhost_message(int sockfd, struct VhostUserMsg *msg) 1896 { 1897 int ret; 1898 1899 ret = read_fd_message(sockfd, (char *)msg, VHOST_USER_HDR_SIZE, 1900 msg->fds, VHOST_MEMORY_MAX_NREGIONS, &msg->fd_num); 1901 if (ret <= 0) 1902 return ret; 1903 1904 if (msg->size) { 1905 if (msg->size > sizeof(msg->payload)) { 1906 RTE_LOG(ERR, VHOST_CONFIG, 1907 "invalid msg size: %d\n", msg->size); 1908 return -1; 1909 } 1910 ret = read(sockfd, &msg->payload, msg->size); 1911 if (ret <= 0) 1912 return ret; 1913 if (ret != (int)msg->size) { 1914 RTE_LOG(ERR, VHOST_CONFIG, 1915 "read control message failed\n"); 1916 return -1; 1917 } 1918 } 1919 1920 return ret; 1921 } 1922 1923 static int 1924 send_vhost_message(int sockfd, struct VhostUserMsg *msg) 1925 { 1926 if (!msg) 1927 return 0; 1928 1929 return send_fd_message(sockfd, (char *)msg, 1930 VHOST_USER_HDR_SIZE + msg->size, msg->fds, msg->fd_num); 1931 } 1932 1933 static int 1934 send_vhost_reply(int sockfd, struct VhostUserMsg *msg) 1935 { 1936 if (!msg) 1937 return 0; 1938 1939 msg->flags &= ~VHOST_USER_VERSION_MASK; 1940 msg->flags &= ~VHOST_USER_NEED_REPLY; 1941 msg->flags |= VHOST_USER_VERSION; 1942 msg->flags |= VHOST_USER_REPLY_MASK; 1943 1944 return send_vhost_message(sockfd, msg); 1945 } 1946 1947 static int 1948 send_vhost_slave_message(struct virtio_net *dev, struct VhostUserMsg *msg) 1949 { 1950 int ret; 1951 1952 if (msg->flags & VHOST_USER_NEED_REPLY) 1953 rte_spinlock_lock(&dev->slave_req_lock); 1954 1955 ret = send_vhost_message(dev->slave_req_fd, msg); 1956 if (ret < 0 && (msg->flags & VHOST_USER_NEED_REPLY)) 1957 rte_spinlock_unlock(&dev->slave_req_lock); 1958 1959 return ret; 1960 } 1961 1962 /* 1963 * Allocate a queue pair if it hasn't been allocated yet 1964 */ 1965 static int 1966 vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev, 1967 struct VhostUserMsg *msg) 1968 { 1969 uint16_t vring_idx; 1970 1971 switch (msg->request.master) { 1972 case VHOST_USER_SET_VRING_KICK: 1973 case VHOST_USER_SET_VRING_CALL: 1974 case VHOST_USER_SET_VRING_ERR: 1975 vring_idx = msg->payload.u64 & VHOST_USER_VRING_IDX_MASK; 1976 break; 1977 case VHOST_USER_SET_VRING_NUM: 1978 case VHOST_USER_SET_VRING_BASE: 1979 case VHOST_USER_SET_VRING_ENABLE: 1980 vring_idx = msg->payload.state.index; 1981 break; 1982 case VHOST_USER_SET_VRING_ADDR: 1983 vring_idx = msg->payload.addr.index; 1984 break; 1985 default: 1986 return 0; 1987 } 1988 1989 if (vring_idx >= VHOST_MAX_VRING) { 1990 RTE_LOG(ERR, VHOST_CONFIG, 1991 "invalid vring index: %u\n", vring_idx); 1992 return -1; 1993 } 1994 1995 if (dev->virtqueue[vring_idx]) 1996 return 0; 1997 1998 return alloc_vring_queue(dev, vring_idx); 1999 } 2000 2001 static void 2002 vhost_user_lock_all_queue_pairs(struct virtio_net *dev) 2003 { 2004 unsigned int i = 0; 2005 unsigned int vq_num = 0; 2006 2007 while (vq_num < dev->nr_vring) { 2008 struct vhost_virtqueue *vq = dev->virtqueue[i]; 2009 2010 if (vq) { 2011 rte_spinlock_lock(&vq->access_lock); 2012 vq_num++; 2013 } 2014 i++; 2015 } 2016 } 2017 2018 static void 2019 vhost_user_unlock_all_queue_pairs(struct virtio_net *dev) 2020 { 2021 unsigned int i = 0; 2022 unsigned int vq_num = 0; 2023 2024 while (vq_num < dev->nr_vring) { 2025 struct vhost_virtqueue *vq = dev->virtqueue[i]; 2026 2027 if (vq) { 2028 rte_spinlock_unlock(&vq->access_lock); 2029 vq_num++; 2030 } 2031 i++; 2032 } 2033 } 2034 2035 int 2036 vhost_user_msg_handler(int vid, int fd) 2037 { 2038 struct virtio_net *dev; 2039 struct VhostUserMsg msg; 2040 struct rte_vdpa_device *vdpa_dev; 2041 int did = -1; 2042 int ret; 2043 int unlock_required = 0; 2044 uint32_t skip_master = 0; 2045 int request; 2046 2047 dev = get_device(vid); 2048 if (dev == NULL) 2049 return -1; 2050 2051 if (!dev->notify_ops) { 2052 dev->notify_ops = vhost_driver_callback_get(dev->ifname); 2053 if (!dev->notify_ops) { 2054 RTE_LOG(ERR, VHOST_CONFIG, 2055 "failed to get callback ops for driver %s\n", 2056 dev->ifname); 2057 return -1; 2058 } 2059 } 2060 2061 ret = read_vhost_message(fd, &msg); 2062 if (ret <= 0 || msg.request.master >= VHOST_USER_MAX) { 2063 if (ret < 0) 2064 RTE_LOG(ERR, VHOST_CONFIG, 2065 "vhost read message failed\n"); 2066 else if (ret == 0) 2067 RTE_LOG(INFO, VHOST_CONFIG, 2068 "vhost peer closed\n"); 2069 else 2070 RTE_LOG(ERR, VHOST_CONFIG, 2071 "vhost read incorrect message\n"); 2072 2073 return -1; 2074 } 2075 2076 ret = 0; 2077 if (msg.request.master != VHOST_USER_IOTLB_MSG) 2078 RTE_LOG(INFO, VHOST_CONFIG, "read message %s\n", 2079 vhost_message_str[msg.request.master]); 2080 else 2081 RTE_LOG(DEBUG, VHOST_CONFIG, "read message %s\n", 2082 vhost_message_str[msg.request.master]); 2083 2084 ret = vhost_user_check_and_alloc_queue_pair(dev, &msg); 2085 if (ret < 0) { 2086 RTE_LOG(ERR, VHOST_CONFIG, 2087 "failed to alloc queue\n"); 2088 return -1; 2089 } 2090 2091 /* 2092 * Note: we don't lock all queues on VHOST_USER_GET_VRING_BASE 2093 * and VHOST_USER_RESET_OWNER, since it is sent when virtio stops 2094 * and device is destroyed. destroy_device waits for queues to be 2095 * inactive, so it is safe. Otherwise taking the access_lock 2096 * would cause a dead lock. 2097 */ 2098 switch (msg.request.master) { 2099 case VHOST_USER_SET_FEATURES: 2100 case VHOST_USER_SET_PROTOCOL_FEATURES: 2101 case VHOST_USER_SET_OWNER: 2102 case VHOST_USER_SET_MEM_TABLE: 2103 case VHOST_USER_SET_LOG_BASE: 2104 case VHOST_USER_SET_LOG_FD: 2105 case VHOST_USER_SET_VRING_NUM: 2106 case VHOST_USER_SET_VRING_ADDR: 2107 case VHOST_USER_SET_VRING_BASE: 2108 case VHOST_USER_SET_VRING_KICK: 2109 case VHOST_USER_SET_VRING_CALL: 2110 case VHOST_USER_SET_VRING_ERR: 2111 case VHOST_USER_SET_VRING_ENABLE: 2112 case VHOST_USER_SEND_RARP: 2113 case VHOST_USER_NET_SET_MTU: 2114 case VHOST_USER_SET_SLAVE_REQ_FD: 2115 vhost_user_lock_all_queue_pairs(dev); 2116 unlock_required = 1; 2117 break; 2118 default: 2119 break; 2120 2121 } 2122 2123 if (dev->extern_ops.pre_msg_handle) { 2124 ret = (*dev->extern_ops.pre_msg_handle)(dev->vid, 2125 (void *)&msg, &skip_master); 2126 if (ret == VH_RESULT_ERR) 2127 goto skip_to_reply; 2128 else if (ret == VH_RESULT_REPLY) 2129 send_vhost_reply(fd, &msg); 2130 2131 if (skip_master) 2132 goto skip_to_post_handle; 2133 } 2134 2135 request = msg.request.master; 2136 if (request > VHOST_USER_NONE && request < VHOST_USER_MAX) { 2137 if (!vhost_message_handlers[request]) 2138 goto skip_to_post_handle; 2139 ret = vhost_message_handlers[request](&dev, &msg, fd); 2140 2141 switch (ret) { 2142 case VH_RESULT_ERR: 2143 RTE_LOG(ERR, VHOST_CONFIG, 2144 "Processing %s failed.\n", 2145 vhost_message_str[request]); 2146 break; 2147 case VH_RESULT_OK: 2148 RTE_LOG(DEBUG, VHOST_CONFIG, 2149 "Processing %s succeeded.\n", 2150 vhost_message_str[request]); 2151 break; 2152 case VH_RESULT_REPLY: 2153 RTE_LOG(DEBUG, VHOST_CONFIG, 2154 "Processing %s succeeded and needs reply.\n", 2155 vhost_message_str[request]); 2156 send_vhost_reply(fd, &msg); 2157 break; 2158 } 2159 } else { 2160 RTE_LOG(ERR, VHOST_CONFIG, 2161 "Requested invalid message type %d.\n", request); 2162 ret = VH_RESULT_ERR; 2163 } 2164 2165 skip_to_post_handle: 2166 if (ret != VH_RESULT_ERR && dev->extern_ops.post_msg_handle) { 2167 ret = (*dev->extern_ops.post_msg_handle)( 2168 dev->vid, (void *)&msg); 2169 if (ret == VH_RESULT_ERR) 2170 goto skip_to_reply; 2171 else if (ret == VH_RESULT_REPLY) 2172 send_vhost_reply(fd, &msg); 2173 } 2174 2175 skip_to_reply: 2176 if (unlock_required) 2177 vhost_user_unlock_all_queue_pairs(dev); 2178 2179 /* 2180 * If the request required a reply that was already sent, 2181 * this optional reply-ack won't be sent as the 2182 * VHOST_USER_NEED_REPLY was cleared in send_vhost_reply(). 2183 */ 2184 if (msg.flags & VHOST_USER_NEED_REPLY) { 2185 msg.payload.u64 = ret == VH_RESULT_ERR; 2186 msg.size = sizeof(msg.payload.u64); 2187 msg.fd_num = 0; 2188 send_vhost_reply(fd, &msg); 2189 } else if (ret == VH_RESULT_ERR) { 2190 RTE_LOG(ERR, VHOST_CONFIG, 2191 "vhost message handling failed.\n"); 2192 return -1; 2193 } 2194 2195 if (!(dev->flags & VIRTIO_DEV_RUNNING) && virtio_is_ready(dev)) { 2196 dev->flags |= VIRTIO_DEV_READY; 2197 2198 if (!(dev->flags & VIRTIO_DEV_RUNNING)) { 2199 if (dev->dequeue_zero_copy) { 2200 RTE_LOG(INFO, VHOST_CONFIG, 2201 "dequeue zero copy is enabled\n"); 2202 } 2203 2204 if (dev->notify_ops->new_device(dev->vid) == 0) 2205 dev->flags |= VIRTIO_DEV_RUNNING; 2206 } 2207 } 2208 2209 did = dev->vdpa_dev_id; 2210 vdpa_dev = rte_vdpa_get_device(did); 2211 if (vdpa_dev && virtio_is_ready(dev) && 2212 !(dev->flags & VIRTIO_DEV_VDPA_CONFIGURED) && 2213 msg.request.master == VHOST_USER_SET_VRING_ENABLE) { 2214 if (vdpa_dev->ops->dev_conf) 2215 vdpa_dev->ops->dev_conf(dev->vid); 2216 dev->flags |= VIRTIO_DEV_VDPA_CONFIGURED; 2217 if (vhost_user_host_notifier_ctrl(dev->vid, true) != 0) { 2218 RTE_LOG(INFO, VHOST_CONFIG, 2219 "(%d) software relay is used for vDPA, performance may be low.\n", 2220 dev->vid); 2221 } 2222 } 2223 2224 return 0; 2225 } 2226 2227 static int process_slave_message_reply(struct virtio_net *dev, 2228 const struct VhostUserMsg *msg) 2229 { 2230 struct VhostUserMsg msg_reply; 2231 int ret; 2232 2233 if ((msg->flags & VHOST_USER_NEED_REPLY) == 0) 2234 return 0; 2235 2236 if (read_vhost_message(dev->slave_req_fd, &msg_reply) < 0) { 2237 ret = -1; 2238 goto out; 2239 } 2240 2241 if (msg_reply.request.slave != msg->request.slave) { 2242 RTE_LOG(ERR, VHOST_CONFIG, 2243 "Received unexpected msg type (%u), expected %u\n", 2244 msg_reply.request.slave, msg->request.slave); 2245 ret = -1; 2246 goto out; 2247 } 2248 2249 ret = msg_reply.payload.u64 ? -1 : 0; 2250 2251 out: 2252 rte_spinlock_unlock(&dev->slave_req_lock); 2253 return ret; 2254 } 2255 2256 int 2257 vhost_user_iotlb_miss(struct virtio_net *dev, uint64_t iova, uint8_t perm) 2258 { 2259 int ret; 2260 struct VhostUserMsg msg = { 2261 .request.slave = VHOST_USER_SLAVE_IOTLB_MSG, 2262 .flags = VHOST_USER_VERSION, 2263 .size = sizeof(msg.payload.iotlb), 2264 .payload.iotlb = { 2265 .iova = iova, 2266 .perm = perm, 2267 .type = VHOST_IOTLB_MISS, 2268 }, 2269 }; 2270 2271 ret = send_vhost_message(dev->slave_req_fd, &msg); 2272 if (ret < 0) { 2273 RTE_LOG(ERR, VHOST_CONFIG, 2274 "Failed to send IOTLB miss message (%d)\n", 2275 ret); 2276 return ret; 2277 } 2278 2279 return 0; 2280 } 2281 2282 static int vhost_user_slave_set_vring_host_notifier(struct virtio_net *dev, 2283 int index, int fd, 2284 uint64_t offset, 2285 uint64_t size) 2286 { 2287 int ret; 2288 struct VhostUserMsg msg = { 2289 .request.slave = VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG, 2290 .flags = VHOST_USER_VERSION | VHOST_USER_NEED_REPLY, 2291 .size = sizeof(msg.payload.area), 2292 .payload.area = { 2293 .u64 = index & VHOST_USER_VRING_IDX_MASK, 2294 .size = size, 2295 .offset = offset, 2296 }, 2297 }; 2298 2299 if (fd < 0) 2300 msg.payload.area.u64 |= VHOST_USER_VRING_NOFD_MASK; 2301 else { 2302 msg.fds[0] = fd; 2303 msg.fd_num = 1; 2304 } 2305 2306 ret = send_vhost_slave_message(dev, &msg); 2307 if (ret < 0) { 2308 RTE_LOG(ERR, VHOST_CONFIG, 2309 "Failed to set host notifier (%d)\n", ret); 2310 return ret; 2311 } 2312 2313 return process_slave_message_reply(dev, &msg); 2314 } 2315 2316 int vhost_user_host_notifier_ctrl(int vid, bool enable) 2317 { 2318 struct virtio_net *dev; 2319 struct rte_vdpa_device *vdpa_dev; 2320 int vfio_device_fd, did, ret = 0; 2321 uint64_t offset, size; 2322 unsigned int i; 2323 2324 dev = get_device(vid); 2325 if (!dev) 2326 return -ENODEV; 2327 2328 did = dev->vdpa_dev_id; 2329 if (did < 0) 2330 return -EINVAL; 2331 2332 if (!(dev->features & (1ULL << VIRTIO_F_VERSION_1)) || 2333 !(dev->features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) || 2334 !(dev->protocol_features & 2335 (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ)) || 2336 !(dev->protocol_features & 2337 (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD)) || 2338 !(dev->protocol_features & 2339 (1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER))) 2340 return -ENOTSUP; 2341 2342 vdpa_dev = rte_vdpa_get_device(did); 2343 if (!vdpa_dev) 2344 return -ENODEV; 2345 2346 RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_vfio_device_fd, -ENOTSUP); 2347 RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_notify_area, -ENOTSUP); 2348 2349 vfio_device_fd = vdpa_dev->ops->get_vfio_device_fd(vid); 2350 if (vfio_device_fd < 0) 2351 return -ENOTSUP; 2352 2353 if (enable) { 2354 for (i = 0; i < dev->nr_vring; i++) { 2355 if (vdpa_dev->ops->get_notify_area(vid, i, &offset, 2356 &size) < 0) { 2357 ret = -ENOTSUP; 2358 goto disable; 2359 } 2360 2361 if (vhost_user_slave_set_vring_host_notifier(dev, i, 2362 vfio_device_fd, offset, size) < 0) { 2363 ret = -EFAULT; 2364 goto disable; 2365 } 2366 } 2367 } else { 2368 disable: 2369 for (i = 0; i < dev->nr_vring; i++) { 2370 vhost_user_slave_set_vring_host_notifier(dev, i, -1, 2371 0, 0); 2372 } 2373 } 2374 2375 return ret; 2376 } 2377