Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

vduse: take out allocations from vduse_dev_alloc_coherent

The function vduse_dev_alloc_coherent will be called under rwlock in
next patches. Make it out of the lock to avoid increasing its fail
rate.

Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20260119143306.1818855-10-eperezma@redhat.com>

authored by

Eugenio Pérez and committed by
Michael S. Tsirkin
489d7652 766e1749

+20 -26
+7 -17
drivers/vdpa/vdpa_user/iova_domain.c
··· 493 493 vduse_domain_free_iova(iovad, dma_addr, size); 494 494 } 495 495 496 - void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain, 497 - size_t size, dma_addr_t *dma_addr, 498 - gfp_t flag) 496 + dma_addr_t vduse_domain_alloc_coherent(struct vduse_iova_domain *domain, 497 + size_t size, void *orig) 499 498 { 500 499 struct iova_domain *iovad = &domain->consistent_iovad; 501 500 unsigned long limit = domain->iova_limit; 502 501 dma_addr_t iova = vduse_domain_alloc_iova(iovad, size, limit); 503 - void *orig = alloc_pages_exact(size, flag); 504 502 505 - if (!iova || !orig) 506 - goto err; 503 + if (!iova) 504 + return DMA_MAPPING_ERROR; 507 505 508 506 spin_lock(&domain->iotlb_lock); 509 507 if (vduse_iotlb_add_range(domain, (u64)iova, (u64)iova + size - 1, ··· 512 514 } 513 515 spin_unlock(&domain->iotlb_lock); 514 516 515 - *dma_addr = iova; 517 + return iova; 516 518 517 - return orig; 518 519 err: 519 - *dma_addr = DMA_MAPPING_ERROR; 520 - if (orig) 521 - free_pages_exact(orig, size); 522 - if (iova) 523 - vduse_domain_free_iova(iovad, iova, size); 520 + vduse_domain_free_iova(iovad, iova, size); 524 521 525 - return NULL; 522 + return DMA_MAPPING_ERROR; 526 523 } 527 524 528 525 void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size, ··· 526 533 struct iova_domain *iovad = &domain->consistent_iovad; 527 534 struct vhost_iotlb_map *map; 528 535 struct vdpa_map_file *map_file; 529 - phys_addr_t pa; 530 536 531 537 spin_lock(&domain->iotlb_lock); 532 538 map = vhost_iotlb_itree_first(domain->iotlb, (u64)dma_addr, ··· 537 545 map_file = (struct vdpa_map_file *)map->opaque; 538 546 fput(map_file->file); 539 547 kfree(map_file); 540 - pa = map->addr; 541 548 vhost_iotlb_map_free(domain->iotlb, map); 542 549 spin_unlock(&domain->iotlb_lock); 543 550 544 551 vduse_domain_free_iova(iovad, dma_addr, size); 545 - free_pages_exact(phys_to_virt(pa), size); 546 552 } 547 553 548 554 static vm_fault_t vduse_domain_mmap_fault(struct vm_fault *vmf)
+2 -3
drivers/vdpa/vdpa_user/iova_domain.h
··· 65 65 dma_addr_t dma_addr, size_t size, 66 66 enum dma_data_direction dir, unsigned long attrs); 67 67 68 - void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain, 69 - size_t size, dma_addr_t *dma_addr, 70 - gfp_t flag); 68 + dma_addr_t vduse_domain_alloc_coherent(struct vduse_iova_domain *domain, 69 + size_t size, void *orig); 71 70 72 71 void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size, 73 72 dma_addr_t dma_addr, unsigned long attrs);
+11 -6
drivers/vdpa/vdpa_user/vduse_dev.c
··· 916 916 { 917 917 struct vduse_dev *vdev; 918 918 struct vduse_iova_domain *domain; 919 - unsigned long iova; 920 919 void *addr; 921 920 922 921 *dma_addr = DMA_MAPPING_ERROR; 923 922 if (!token.group) 924 923 return NULL; 925 924 926 - vdev = token.group->dev; 927 - domain = vdev->domain; 928 - addr = vduse_domain_alloc_coherent(domain, size, 929 - (dma_addr_t *)&iova, flag); 925 + addr = alloc_pages_exact(size, flag); 930 926 if (!addr) 931 927 return NULL; 932 928 933 - *dma_addr = (dma_addr_t)iova; 929 + vdev = token.group->dev; 930 + domain = vdev->domain; 931 + *dma_addr = vduse_domain_alloc_coherent(domain, size, addr); 932 + if (*dma_addr == DMA_MAPPING_ERROR) 933 + goto err; 934 934 935 935 return addr; 936 + 937 + err: 938 + free_pages_exact(addr, size); 939 + return NULL; 936 940 } 937 941 938 942 static void vduse_dev_free_coherent(union virtio_map token, size_t size, ··· 953 949 domain = vdev->domain; 954 950 955 951 vduse_domain_free_coherent(domain, size, dma_addr, attrs); 952 + free_pages_exact(vaddr, size); 956 953 } 957 954 958 955 static bool vduse_dev_need_sync(union virtio_map token, dma_addr_t dma_addr)