Skip to content

Commit 489d765

Browse files
eugpermarmstsirkin
authored andcommitted
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>
1 parent 766e174 commit 489d765

3 files changed

Lines changed: 20 additions & 26 deletions

File tree

drivers/vdpa/vdpa_user/iova_domain.c

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -493,17 +493,15 @@ void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
493493
vduse_domain_free_iova(iovad, dma_addr, size);
494494
}
495495

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)
499498
{
500499
struct iova_domain *iovad = &domain->consistent_iovad;
501500
unsigned long limit = domain->iova_limit;
502501
dma_addr_t iova = vduse_domain_alloc_iova(iovad, size, limit);
503-
void *orig = alloc_pages_exact(size, flag);
504502

505-
if (!iova || !orig)
506-
goto err;
503+
if (!iova)
504+
return DMA_MAPPING_ERROR;
507505

508506
spin_lock(&domain->iotlb_lock);
509507
if (vduse_iotlb_add_range(domain, (u64)iova, (u64)iova + size - 1,
@@ -514,17 +512,12 @@ void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
514512
}
515513
spin_unlock(&domain->iotlb_lock);
516514

517-
*dma_addr = iova;
515+
return iova;
518516

519-
return orig;
520517
err:
521-
*dma_addr = DMA_MAPPING_ERROR;
522-
if (orig)
523-
free_pages_exact(orig, size);
524-
if (iova)
525-
vduse_domain_free_iova(iovad, iova, size);
518+
vduse_domain_free_iova(iovad, iova, size);
526519

527-
return NULL;
520+
return DMA_MAPPING_ERROR;
528521
}
529522

530523
void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
@@ -533,7 +526,6 @@ void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
533526
struct iova_domain *iovad = &domain->consistent_iovad;
534527
struct vhost_iotlb_map *map;
535528
struct vdpa_map_file *map_file;
536-
phys_addr_t pa;
537529

538530
spin_lock(&domain->iotlb_lock);
539531
map = vhost_iotlb_itree_first(domain->iotlb, (u64)dma_addr,
@@ -545,12 +537,10 @@ void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
545537
map_file = (struct vdpa_map_file *)map->opaque;
546538
fput(map_file->file);
547539
kfree(map_file);
548-
pa = map->addr;
549540
vhost_iotlb_map_free(domain->iotlb, map);
550541
spin_unlock(&domain->iotlb_lock);
551542

552543
vduse_domain_free_iova(iovad, dma_addr, size);
553-
free_pages_exact(phys_to_virt(pa), size);
554544
}
555545

556546
static vm_fault_t vduse_domain_mmap_fault(struct vm_fault *vmf)

drivers/vdpa/vdpa_user/iova_domain.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,8 @@ void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
6565
dma_addr_t dma_addr, size_t size,
6666
enum dma_data_direction dir, unsigned long attrs);
6767

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);
7170

7271
void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
7372
dma_addr_t dma_addr, unsigned long attrs);

drivers/vdpa/vdpa_user/vduse_dev.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -916,23 +916,27 @@ static void *vduse_dev_alloc_coherent(union virtio_map token, size_t size,
916916
{
917917
struct vduse_dev *vdev;
918918
struct vduse_iova_domain *domain;
919-
unsigned long iova;
920919
void *addr;
921920

922921
*dma_addr = DMA_MAPPING_ERROR;
923922
if (!token.group)
924923
return NULL;
925924

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);
930926
if (!addr)
931927
return NULL;
932928

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;
934934

935935
return addr;
936+
937+
err:
938+
free_pages_exact(addr, size);
939+
return NULL;
936940
}
937941

938942
static void vduse_dev_free_coherent(union virtio_map token, size_t size,
@@ -949,6 +953,7 @@ static void vduse_dev_free_coherent(union virtio_map token, size_t size,
949953
domain = vdev->domain;
950954

951955
vduse_domain_free_coherent(domain, size, dma_addr, attrs);
956+
free_pages_exact(vaddr, size);
952957
}
953958

954959
static bool vduse_dev_need_sync(union virtio_map token, dma_addr_t dma_addr)

0 commit comments

Comments
 (0)