1 /* 2 * VFIO utility 3 * 4 * Copyright 2016 - 2018 Red Hat, Inc. 5 * 6 * Authors: 7 * Fam Zheng <famz@redhat.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or later. 10 * See the COPYING file in the top-level directory. 11 */ 12 13 #include "qemu/osdep.h" 14 #include <sys/ioctl.h> 15 #include <linux/vfio.h> 16 #include "qapi/error.h" 17 #include "exec/ramlist.h" 18 #include "exec/cpu-common.h" 19 #include "trace.h" 20 #include "qemu/error-report.h" 21 #include "standard-headers/linux/pci_regs.h" 22 #include "qemu/event_notifier.h" 23 #include "qemu/vfio-helpers.h" 24 #include "trace.h" 25 26 #define QEMU_VFIO_DEBUG 0 27 28 #define QEMU_VFIO_IOVA_MIN 0x10000ULL 29 /* XXX: Once VFIO exposes the iova bit width in the IOMMU capability interface, 30 * we can use a runtime limit; alternatively it's also possible to do platform 31 * specific detection by reading sysfs entries. Until then, 39 is a safe bet. 32 **/ 33 #define QEMU_VFIO_IOVA_MAX (1ULL << 39) 34 35 typedef struct { 36 /* Page aligned addr. */ 37 void *host; 38 size_t size; 39 uint64_t iova; 40 } IOVAMapping; 41 42 struct QEMUVFIOState { 43 QemuMutex lock; 44 45 /* These fields are protected by BQL */ 46 int container; 47 int group; 48 int device; 49 RAMBlockNotifier ram_notifier; 50 struct vfio_region_info config_region_info, bar_region_info[6]; 51 52 /* These fields are protected by @lock */ 53 /* VFIO's IO virtual address space is managed by splitting into a few 54 * sections: 55 * 56 * --------------- <= 0 57 * |xxxxxxxxxxxxx| 58 * |-------------| <= QEMU_VFIO_IOVA_MIN 59 * | | 60 * | Fixed | 61 * | | 62 * |-------------| <= low_water_mark 63 * | | 64 * | Free | 65 * | | 66 * |-------------| <= high_water_mark 67 * | | 68 * | Temp | 69 * | | 70 * |-------------| <= QEMU_VFIO_IOVA_MAX 71 * |xxxxxxxxxxxxx| 72 * |xxxxxxxxxxxxx| 73 * --------------- 74 * 75 * - Addresses lower than QEMU_VFIO_IOVA_MIN are reserved as invalid; 76 * 77 * - Fixed mappings of HVAs are assigned "low" IOVAs in the range of 78 * [QEMU_VFIO_IOVA_MIN, low_water_mark). Once allocated they will not be 79 * reclaimed - low_water_mark never shrinks; 80 * 81 * - IOVAs in range [low_water_mark, high_water_mark) are free; 82 * 83 * - IOVAs in range [high_water_mark, QEMU_VFIO_IOVA_MAX) are volatile 84 * mappings. At each qemu_vfio_dma_reset_temporary() call, the whole area 85 * is recycled. The caller should make sure I/O's depending on these 86 * mappings are completed before calling. 87 **/ 88 uint64_t low_water_mark; 89 uint64_t high_water_mark; 90 IOVAMapping *mappings; 91 int nr_mappings; 92 }; 93 94 /** 95 * Find group file by PCI device address as specified @device, and return the 96 * path. The returned string is owned by caller and should be g_free'ed later. 97 */ 98 static char *sysfs_find_group_file(const char *device, Error **errp) 99 { 100 char *sysfs_link; 101 char *sysfs_group; 102 char *p; 103 char *path = NULL; 104 105 sysfs_link = g_strdup_printf("/sys/bus/pci/devices/%s/iommu_group", device); 106 sysfs_group = g_malloc0(PATH_MAX); 107 if (readlink(sysfs_link, sysfs_group, PATH_MAX - 1) == -1) { 108 error_setg_errno(errp, errno, "Failed to find iommu group sysfs path"); 109 goto out; 110 } 111 p = strrchr(sysfs_group, '/'); 112 if (!p) { 113 error_setg(errp, "Failed to find iommu group number"); 114 goto out; 115 } 116 117 path = g_strdup_printf("/dev/vfio/%s", p + 1); 118 out: 119 g_free(sysfs_link); 120 g_free(sysfs_group); 121 return path; 122 } 123 124 static inline void assert_bar_index_valid(QEMUVFIOState *s, int index) 125 { 126 assert(index >= 0 && index < ARRAY_SIZE(s->bar_region_info)); 127 } 128 129 static int qemu_vfio_pci_init_bar(QEMUVFIOState *s, int index, Error **errp) 130 { 131 assert_bar_index_valid(s, index); 132 s->bar_region_info[index] = (struct vfio_region_info) { 133 .index = VFIO_PCI_BAR0_REGION_INDEX + index, 134 .argsz = sizeof(struct vfio_region_info), 135 }; 136 if (ioctl(s->device, VFIO_DEVICE_GET_REGION_INFO, &s->bar_region_info[index])) { 137 error_setg_errno(errp, errno, "Failed to get BAR region info"); 138 return -errno; 139 } 140 141 return 0; 142 } 143 144 /** 145 * Map a PCI bar area. 146 */ 147 void *qemu_vfio_pci_map_bar(QEMUVFIOState *s, int index, 148 uint64_t offset, uint64_t size, 149 Error **errp) 150 { 151 void *p; 152 assert_bar_index_valid(s, index); 153 p = mmap(NULL, MIN(size, s->bar_region_info[index].size - offset), 154 PROT_READ | PROT_WRITE, MAP_SHARED, 155 s->device, s->bar_region_info[index].offset + offset); 156 if (p == MAP_FAILED) { 157 error_setg_errno(errp, errno, "Failed to map BAR region"); 158 p = NULL; 159 } 160 return p; 161 } 162 163 /** 164 * Unmap a PCI bar area. 165 */ 166 void qemu_vfio_pci_unmap_bar(QEMUVFIOState *s, int index, void *bar, 167 uint64_t offset, uint64_t size) 168 { 169 if (bar) { 170 munmap(bar, MIN(size, s->bar_region_info[index].size - offset)); 171 } 172 } 173 174 /** 175 * Initialize device IRQ with @irq_type and and register an event notifier. 176 */ 177 int qemu_vfio_pci_init_irq(QEMUVFIOState *s, EventNotifier *e, 178 int irq_type, Error **errp) 179 { 180 int r; 181 struct vfio_irq_set *irq_set; 182 size_t irq_set_size; 183 struct vfio_irq_info irq_info = { .argsz = sizeof(irq_info) }; 184 185 irq_info.index = irq_type; 186 if (ioctl(s->device, VFIO_DEVICE_GET_IRQ_INFO, &irq_info)) { 187 error_setg_errno(errp, errno, "Failed to get device interrupt info"); 188 return -errno; 189 } 190 if (!(irq_info.flags & VFIO_IRQ_INFO_EVENTFD)) { 191 error_setg(errp, "Device interrupt doesn't support eventfd"); 192 return -EINVAL; 193 } 194 195 irq_set_size = sizeof(*irq_set) + sizeof(int); 196 irq_set = g_malloc0(irq_set_size); 197 198 /* Get to a known IRQ state */ 199 *irq_set = (struct vfio_irq_set) { 200 .argsz = irq_set_size, 201 .flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER, 202 .index = irq_info.index, 203 .start = 0, 204 .count = 1, 205 }; 206 207 *(int *)&irq_set->data = event_notifier_get_fd(e); 208 r = ioctl(s->device, VFIO_DEVICE_SET_IRQS, irq_set); 209 g_free(irq_set); 210 if (r) { 211 error_setg_errno(errp, errno, "Failed to setup device interrupt"); 212 return -errno; 213 } 214 return 0; 215 } 216 217 static int qemu_vfio_pci_read_config(QEMUVFIOState *s, void *buf, 218 int size, int ofs) 219 { 220 int ret; 221 222 do { 223 ret = pread(s->device, buf, size, s->config_region_info.offset + ofs); 224 } while (ret == -1 && errno == EINTR); 225 return ret == size ? 0 : -errno; 226 } 227 228 static int qemu_vfio_pci_write_config(QEMUVFIOState *s, void *buf, int size, int ofs) 229 { 230 int ret; 231 232 do { 233 ret = pwrite(s->device, buf, size, s->config_region_info.offset + ofs); 234 } while (ret == -1 && errno == EINTR); 235 return ret == size ? 0 : -errno; 236 } 237 238 static int qemu_vfio_init_pci(QEMUVFIOState *s, const char *device, 239 Error **errp) 240 { 241 int ret; 242 int i; 243 uint16_t pci_cmd; 244 struct vfio_group_status group_status = { .argsz = sizeof(group_status) }; 245 struct vfio_iommu_type1_info iommu_info = { .argsz = sizeof(iommu_info) }; 246 struct vfio_device_info device_info = { .argsz = sizeof(device_info) }; 247 char *group_file = NULL; 248 249 /* Create a new container */ 250 s->container = open("/dev/vfio/vfio", O_RDWR); 251 252 if (s->container == -1) { 253 error_setg_errno(errp, errno, "Failed to open /dev/vfio/vfio"); 254 return -errno; 255 } 256 if (ioctl(s->container, VFIO_GET_API_VERSION) != VFIO_API_VERSION) { 257 error_setg(errp, "Invalid VFIO version"); 258 ret = -EINVAL; 259 goto fail_container; 260 } 261 262 if (!ioctl(s->container, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) { 263 error_setg_errno(errp, errno, "VFIO IOMMU check failed"); 264 ret = -EINVAL; 265 goto fail_container; 266 } 267 268 /* Open the group */ 269 group_file = sysfs_find_group_file(device, errp); 270 if (!group_file) { 271 ret = -EINVAL; 272 goto fail_container; 273 } 274 275 s->group = open(group_file, O_RDWR); 276 if (s->group == -1) { 277 error_setg_errno(errp, errno, "Failed to open VFIO group file: %s", 278 group_file); 279 g_free(group_file); 280 ret = -errno; 281 goto fail_container; 282 } 283 g_free(group_file); 284 285 /* Test the group is viable and available */ 286 if (ioctl(s->group, VFIO_GROUP_GET_STATUS, &group_status)) { 287 error_setg_errno(errp, errno, "Failed to get VFIO group status"); 288 ret = -errno; 289 goto fail; 290 } 291 292 if (!(group_status.flags & VFIO_GROUP_FLAGS_VIABLE)) { 293 error_setg(errp, "VFIO group is not viable"); 294 ret = -EINVAL; 295 goto fail; 296 } 297 298 /* Add the group to the container */ 299 if (ioctl(s->group, VFIO_GROUP_SET_CONTAINER, &s->container)) { 300 error_setg_errno(errp, errno, "Failed to add group to VFIO container"); 301 ret = -errno; 302 goto fail; 303 } 304 305 /* Enable the IOMMU model we want */ 306 if (ioctl(s->container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU)) { 307 error_setg_errno(errp, errno, "Failed to set VFIO IOMMU type"); 308 ret = -errno; 309 goto fail; 310 } 311 312 /* Get additional IOMMU info */ 313 if (ioctl(s->container, VFIO_IOMMU_GET_INFO, &iommu_info)) { 314 error_setg_errno(errp, errno, "Failed to get IOMMU info"); 315 ret = -errno; 316 goto fail; 317 } 318 319 s->device = ioctl(s->group, VFIO_GROUP_GET_DEVICE_FD, device); 320 321 if (s->device < 0) { 322 error_setg_errno(errp, errno, "Failed to get device fd"); 323 ret = -errno; 324 goto fail; 325 } 326 327 /* Test and setup the device */ 328 if (ioctl(s->device, VFIO_DEVICE_GET_INFO, &device_info)) { 329 error_setg_errno(errp, errno, "Failed to get device info"); 330 ret = -errno; 331 goto fail; 332 } 333 334 if (device_info.num_regions < VFIO_PCI_CONFIG_REGION_INDEX) { 335 error_setg(errp, "Invalid device regions"); 336 ret = -EINVAL; 337 goto fail; 338 } 339 340 s->config_region_info = (struct vfio_region_info) { 341 .index = VFIO_PCI_CONFIG_REGION_INDEX, 342 .argsz = sizeof(struct vfio_region_info), 343 }; 344 if (ioctl(s->device, VFIO_DEVICE_GET_REGION_INFO, &s->config_region_info)) { 345 error_setg_errno(errp, errno, "Failed to get config region info"); 346 ret = -errno; 347 goto fail; 348 } 349 350 for (i = 0; i < ARRAY_SIZE(s->bar_region_info); i++) { 351 ret = qemu_vfio_pci_init_bar(s, i, errp); 352 if (ret) { 353 goto fail; 354 } 355 } 356 357 /* Enable bus master */ 358 ret = qemu_vfio_pci_read_config(s, &pci_cmd, sizeof(pci_cmd), PCI_COMMAND); 359 if (ret) { 360 goto fail; 361 } 362 pci_cmd |= PCI_COMMAND_MASTER; 363 ret = qemu_vfio_pci_write_config(s, &pci_cmd, sizeof(pci_cmd), PCI_COMMAND); 364 if (ret) { 365 goto fail; 366 } 367 return 0; 368 fail: 369 close(s->group); 370 fail_container: 371 close(s->container); 372 return ret; 373 } 374 375 static void qemu_vfio_ram_block_added(RAMBlockNotifier *n, 376 void *host, size_t size) 377 { 378 QEMUVFIOState *s = container_of(n, QEMUVFIOState, ram_notifier); 379 trace_qemu_vfio_ram_block_added(s, host, size); 380 qemu_vfio_dma_map(s, host, size, false, NULL); 381 } 382 383 static void qemu_vfio_ram_block_removed(RAMBlockNotifier *n, 384 void *host, size_t size) 385 { 386 QEMUVFIOState *s = container_of(n, QEMUVFIOState, ram_notifier); 387 if (host) { 388 trace_qemu_vfio_ram_block_removed(s, host, size); 389 qemu_vfio_dma_unmap(s, host); 390 } 391 } 392 393 static int qemu_vfio_init_ramblock(RAMBlock *rb, void *opaque) 394 { 395 void *host_addr = qemu_ram_get_host_addr(rb); 396 ram_addr_t length = qemu_ram_get_used_length(rb); 397 int ret; 398 QEMUVFIOState *s = opaque; 399 400 if (!host_addr) { 401 return 0; 402 } 403 ret = qemu_vfio_dma_map(s, host_addr, length, false, NULL); 404 if (ret) { 405 fprintf(stderr, "qemu_vfio_init_ramblock: failed %p %" PRId64 "\n", 406 host_addr, (uint64_t)length); 407 } 408 return 0; 409 } 410 411 static void qemu_vfio_open_common(QEMUVFIOState *s) 412 { 413 qemu_mutex_init(&s->lock); 414 s->ram_notifier.ram_block_added = qemu_vfio_ram_block_added; 415 s->ram_notifier.ram_block_removed = qemu_vfio_ram_block_removed; 416 ram_block_notifier_add(&s->ram_notifier); 417 s->low_water_mark = QEMU_VFIO_IOVA_MIN; 418 s->high_water_mark = QEMU_VFIO_IOVA_MAX; 419 qemu_ram_foreach_block(qemu_vfio_init_ramblock, s); 420 } 421 422 /** 423 * Open a PCI device, e.g. "0000:00:01.0". 424 */ 425 QEMUVFIOState *qemu_vfio_open_pci(const char *device, Error **errp) 426 { 427 int r; 428 QEMUVFIOState *s = g_new0(QEMUVFIOState, 1); 429 430 r = qemu_vfio_init_pci(s, device, errp); 431 if (r) { 432 g_free(s); 433 return NULL; 434 } 435 qemu_vfio_open_common(s); 436 return s; 437 } 438 439 static void qemu_vfio_dump_mapping(IOVAMapping *m) 440 { 441 if (QEMU_VFIO_DEBUG) { 442 printf(" vfio mapping %p %" PRIx64 " to %" PRIx64 "\n", m->host, 443 (uint64_t)m->size, (uint64_t)m->iova); 444 } 445 } 446 447 static void qemu_vfio_dump_mappings(QEMUVFIOState *s) 448 { 449 int i; 450 451 if (QEMU_VFIO_DEBUG) { 452 printf("vfio mappings\n"); 453 for (i = 0; i < s->nr_mappings; ++i) { 454 qemu_vfio_dump_mapping(&s->mappings[i]); 455 } 456 } 457 } 458 459 /** 460 * Find the mapping entry that contains [host, host + size) and set @index to 461 * the position. If no entry contains it, @index is the position _after_ which 462 * to insert the new mapping. IOW, it is the index of the largest element that 463 * is smaller than @host, or -1 if no entry is. 464 */ 465 static IOVAMapping *qemu_vfio_find_mapping(QEMUVFIOState *s, void *host, 466 int *index) 467 { 468 IOVAMapping *p = s->mappings; 469 IOVAMapping *q = p ? p + s->nr_mappings - 1 : NULL; 470 IOVAMapping *mid; 471 trace_qemu_vfio_find_mapping(s, host); 472 if (!p) { 473 *index = -1; 474 return NULL; 475 } 476 while (true) { 477 mid = p + (q - p) / 2; 478 if (mid == p) { 479 break; 480 } 481 if (mid->host > host) { 482 q = mid; 483 } else if (mid->host < host) { 484 p = mid; 485 } else { 486 break; 487 } 488 } 489 if (mid->host > host) { 490 mid--; 491 } else if (mid < &s->mappings[s->nr_mappings - 1] 492 && (mid + 1)->host <= host) { 493 mid++; 494 } 495 *index = mid - &s->mappings[0]; 496 if (mid >= &s->mappings[0] && 497 mid->host <= host && mid->host + mid->size > host) { 498 assert(mid < &s->mappings[s->nr_mappings]); 499 return mid; 500 } 501 /* At this point *index + 1 is the right position to insert the new 502 * mapping.*/ 503 return NULL; 504 } 505 506 /** 507 * Allocate IOVA and and create a new mapping record and insert it in @s. 508 */ 509 static IOVAMapping *qemu_vfio_add_mapping(QEMUVFIOState *s, 510 void *host, size_t size, 511 int index, uint64_t iova) 512 { 513 int shift; 514 IOVAMapping m = {.host = host, .size = size, .iova = iova}; 515 IOVAMapping *insert; 516 517 assert(QEMU_IS_ALIGNED(size, getpagesize())); 518 assert(QEMU_IS_ALIGNED(s->low_water_mark, getpagesize())); 519 assert(QEMU_IS_ALIGNED(s->high_water_mark, getpagesize())); 520 trace_qemu_vfio_new_mapping(s, host, size, index, iova); 521 522 assert(index >= 0); 523 s->nr_mappings++; 524 s->mappings = g_renew(IOVAMapping, s->mappings, s->nr_mappings); 525 insert = &s->mappings[index]; 526 shift = s->nr_mappings - index - 1; 527 if (shift) { 528 memmove(insert + 1, insert, shift * sizeof(s->mappings[0])); 529 } 530 *insert = m; 531 return insert; 532 } 533 534 /* Do the DMA mapping with VFIO. */ 535 static int qemu_vfio_do_mapping(QEMUVFIOState *s, void *host, size_t size, 536 uint64_t iova) 537 { 538 struct vfio_iommu_type1_dma_map dma_map = { 539 .argsz = sizeof(dma_map), 540 .flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE, 541 .iova = iova, 542 .vaddr = (uintptr_t)host, 543 .size = size, 544 }; 545 trace_qemu_vfio_do_mapping(s, host, size, iova); 546 547 if (ioctl(s->container, VFIO_IOMMU_MAP_DMA, &dma_map)) { 548 error_report("VFIO_MAP_DMA: %d", -errno); 549 return -errno; 550 } 551 return 0; 552 } 553 554 /** 555 * Undo the DMA mapping from @s with VFIO, and remove from mapping list. 556 */ 557 static void qemu_vfio_undo_mapping(QEMUVFIOState *s, IOVAMapping *mapping, 558 Error **errp) 559 { 560 int index; 561 struct vfio_iommu_type1_dma_unmap unmap = { 562 .argsz = sizeof(unmap), 563 .flags = 0, 564 .iova = mapping->iova, 565 .size = mapping->size, 566 }; 567 568 index = mapping - s->mappings; 569 assert(mapping->size > 0); 570 assert(QEMU_IS_ALIGNED(mapping->size, getpagesize())); 571 assert(index >= 0 && index < s->nr_mappings); 572 if (ioctl(s->container, VFIO_IOMMU_UNMAP_DMA, &unmap)) { 573 error_setg(errp, "VFIO_UNMAP_DMA failed: %d", -errno); 574 } 575 memmove(mapping, &s->mappings[index + 1], 576 sizeof(s->mappings[0]) * (s->nr_mappings - index - 1)); 577 s->nr_mappings--; 578 s->mappings = g_renew(IOVAMapping, s->mappings, s->nr_mappings); 579 } 580 581 /* Check if the mapping list is (ascending) ordered. */ 582 static bool qemu_vfio_verify_mappings(QEMUVFIOState *s) 583 { 584 int i; 585 if (QEMU_VFIO_DEBUG) { 586 for (i = 0; i < s->nr_mappings - 1; ++i) { 587 if (!(s->mappings[i].host < s->mappings[i + 1].host)) { 588 fprintf(stderr, "item %d not sorted!\n", i); 589 qemu_vfio_dump_mappings(s); 590 return false; 591 } 592 if (!(s->mappings[i].host + s->mappings[i].size <= 593 s->mappings[i + 1].host)) { 594 fprintf(stderr, "item %d overlap with next!\n", i); 595 qemu_vfio_dump_mappings(s); 596 return false; 597 } 598 } 599 } 600 return true; 601 } 602 603 /* Map [host, host + size) area into a contiguous IOVA address space, and store 604 * the result in @iova if not NULL. The caller need to make sure the area is 605 * aligned to page size, and mustn't overlap with existing mapping areas (split 606 * mapping status within this area is not allowed). 607 */ 608 int qemu_vfio_dma_map(QEMUVFIOState *s, void *host, size_t size, 609 bool temporary, uint64_t *iova) 610 { 611 int ret = 0; 612 int index; 613 IOVAMapping *mapping; 614 uint64_t iova0; 615 616 assert(QEMU_PTR_IS_ALIGNED(host, getpagesize())); 617 assert(QEMU_IS_ALIGNED(size, getpagesize())); 618 trace_qemu_vfio_dma_map(s, host, size, temporary, iova); 619 qemu_mutex_lock(&s->lock); 620 mapping = qemu_vfio_find_mapping(s, host, &index); 621 if (mapping) { 622 iova0 = mapping->iova + ((uint8_t *)host - (uint8_t *)mapping->host); 623 } else { 624 if (s->high_water_mark - s->low_water_mark + 1 < size) { 625 ret = -ENOMEM; 626 goto out; 627 } 628 if (!temporary) { 629 iova0 = s->low_water_mark; 630 mapping = qemu_vfio_add_mapping(s, host, size, index + 1, iova0); 631 if (!mapping) { 632 ret = -ENOMEM; 633 goto out; 634 } 635 assert(qemu_vfio_verify_mappings(s)); 636 ret = qemu_vfio_do_mapping(s, host, size, iova0); 637 if (ret) { 638 qemu_vfio_undo_mapping(s, mapping, NULL); 639 goto out; 640 } 641 s->low_water_mark += size; 642 qemu_vfio_dump_mappings(s); 643 } else { 644 iova0 = s->high_water_mark - size; 645 ret = qemu_vfio_do_mapping(s, host, size, iova0); 646 if (ret) { 647 goto out; 648 } 649 s->high_water_mark -= size; 650 } 651 } 652 if (iova) { 653 *iova = iova0; 654 } 655 out: 656 qemu_mutex_unlock(&s->lock); 657 return ret; 658 } 659 660 /* Reset the high watermark and free all "temporary" mappings. */ 661 int qemu_vfio_dma_reset_temporary(QEMUVFIOState *s) 662 { 663 struct vfio_iommu_type1_dma_unmap unmap = { 664 .argsz = sizeof(unmap), 665 .flags = 0, 666 .iova = s->high_water_mark, 667 .size = QEMU_VFIO_IOVA_MAX - s->high_water_mark, 668 }; 669 trace_qemu_vfio_dma_reset_temporary(s); 670 qemu_mutex_lock(&s->lock); 671 if (ioctl(s->container, VFIO_IOMMU_UNMAP_DMA, &unmap)) { 672 error_report("VFIO_UNMAP_DMA: %d", -errno); 673 qemu_mutex_unlock(&s->lock); 674 return -errno; 675 } 676 s->high_water_mark = QEMU_VFIO_IOVA_MAX; 677 qemu_mutex_unlock(&s->lock); 678 return 0; 679 } 680 681 /* Unmapping the whole area that was previously mapped with 682 * qemu_vfio_dma_map(). */ 683 void qemu_vfio_dma_unmap(QEMUVFIOState *s, void *host) 684 { 685 int index = 0; 686 IOVAMapping *m; 687 688 if (!host) { 689 return; 690 } 691 692 trace_qemu_vfio_dma_unmap(s, host); 693 qemu_mutex_lock(&s->lock); 694 m = qemu_vfio_find_mapping(s, host, &index); 695 if (!m) { 696 goto out; 697 } 698 qemu_vfio_undo_mapping(s, m, NULL); 699 out: 700 qemu_mutex_unlock(&s->lock); 701 } 702 703 static void qemu_vfio_reset(QEMUVFIOState *s) 704 { 705 ioctl(s->device, VFIO_DEVICE_RESET); 706 } 707 708 /* Close and free the VFIO resources. */ 709 void qemu_vfio_close(QEMUVFIOState *s) 710 { 711 int i; 712 713 if (!s) { 714 return; 715 } 716 for (i = 0; i < s->nr_mappings; ++i) { 717 qemu_vfio_undo_mapping(s, &s->mappings[i], NULL); 718 } 719 ram_block_notifier_remove(&s->ram_notifier); 720 qemu_vfio_reset(s); 721 close(s->device); 722 close(s->group); 723 close(s->container); 724 } 725