Skip to content

Commit 8da7a0e

Browse files
yiliu1765jgunthorpe
authored andcommitted
vfio: Refactor dma APIs for emulated devices
To use group helpers instead of opening group related code in the API. This prepares moving group specific code out of vfio_main.c. Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Kevin Tian <[email protected]> Reviewed-by: Jason Gunthorpe <[email protected]> Reviewed-by: Alex Williamson <[email protected]> Tested-by: Lixiao Yang <[email protected]> Tested-by: Yu He <[email protected]> Signed-off-by: Yi Liu <[email protected]> Signed-off-by: Nicolin Chen <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 1334e47 commit 8da7a0e

File tree

3 files changed

+43
-34
lines changed

3 files changed

+43
-34
lines changed

drivers/vfio/container.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -540,10 +540,12 @@ void vfio_group_unuse_container(struct vfio_group *group)
540540
fput(group->opened_file);
541541
}
542542

543-
int vfio_container_pin_pages(struct vfio_container *container,
544-
struct iommu_group *iommu_group, dma_addr_t iova,
545-
int npage, int prot, struct page **pages)
543+
int vfio_device_container_pin_pages(struct vfio_device *device,
544+
dma_addr_t iova, int npage,
545+
int prot, struct page **pages)
546546
{
547+
struct vfio_container *container = device->group->container;
548+
struct iommu_group *iommu_group = device->group->iommu_group;
547549
struct vfio_iommu_driver *driver = container->iommu_driver;
548550

549551
if (npage > VFIO_PIN_PAGES_MAX_ENTRIES)
@@ -555,19 +557,23 @@ int vfio_container_pin_pages(struct vfio_container *container,
555557
npage, prot, pages);
556558
}
557559

558-
void vfio_container_unpin_pages(struct vfio_container *container,
559-
dma_addr_t iova, int npage)
560+
void vfio_device_container_unpin_pages(struct vfio_device *device,
561+
dma_addr_t iova, int npage)
560562
{
563+
struct vfio_container *container = device->group->container;
564+
561565
if (WARN_ON(npage <= 0 || npage > VFIO_PIN_PAGES_MAX_ENTRIES))
562566
return;
563567

564568
container->iommu_driver->ops->unpin_pages(container->iommu_data, iova,
565569
npage);
566570
}
567571

568-
int vfio_container_dma_rw(struct vfio_container *container, dma_addr_t iova,
569-
void *data, size_t len, bool write)
572+
int vfio_device_container_dma_rw(struct vfio_device *device,
573+
dma_addr_t iova, void *data,
574+
size_t len, bool write)
570575
{
576+
struct vfio_container *container = device->group->container;
571577
struct vfio_iommu_driver *driver = container->iommu_driver;
572578

573579
if (unlikely(!driver || !driver->ops->dma_rw))

drivers/vfio/vfio.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,14 @@ int vfio_container_attach_group(struct vfio_container *container,
122122
void vfio_group_detach_container(struct vfio_group *group);
123123
void vfio_device_container_register(struct vfio_device *device);
124124
void vfio_device_container_unregister(struct vfio_device *device);
125-
int vfio_container_pin_pages(struct vfio_container *container,
126-
struct iommu_group *iommu_group, dma_addr_t iova,
127-
int npage, int prot, struct page **pages);
128-
void vfio_container_unpin_pages(struct vfio_container *container,
129-
dma_addr_t iova, int npage);
130-
int vfio_container_dma_rw(struct vfio_container *container, dma_addr_t iova,
131-
void *data, size_t len, bool write);
125+
int vfio_device_container_pin_pages(struct vfio_device *device,
126+
dma_addr_t iova, int npage,
127+
int prot, struct page **pages);
128+
void vfio_device_container_unpin_pages(struct vfio_device *device,
129+
dma_addr_t iova, int npage);
130+
int vfio_device_container_dma_rw(struct vfio_device *device,
131+
dma_addr_t iova, void *data,
132+
size_t len, bool write);
132133

133134
int __init vfio_container_init(void);
134135
void vfio_container_cleanup(void);
@@ -166,22 +167,21 @@ static inline void vfio_device_container_unregister(struct vfio_device *device)
166167
{
167168
}
168169

169-
static inline int vfio_container_pin_pages(struct vfio_container *container,
170-
struct iommu_group *iommu_group,
171-
dma_addr_t iova, int npage, int prot,
172-
struct page **pages)
170+
static inline int vfio_device_container_pin_pages(struct vfio_device *device,
171+
dma_addr_t iova, int npage,
172+
int prot, struct page **pages)
173173
{
174174
return -EOPNOTSUPP;
175175
}
176176

177-
static inline void vfio_container_unpin_pages(struct vfio_container *container,
178-
dma_addr_t iova, int npage)
177+
static inline void vfio_device_container_unpin_pages(struct vfio_device *device,
178+
dma_addr_t iova, int npage)
179179
{
180180
}
181181

182-
static inline int vfio_container_dma_rw(struct vfio_container *container,
183-
dma_addr_t iova, void *data, size_t len,
184-
bool write)
182+
static inline int vfio_device_container_dma_rw(struct vfio_device *device,
183+
dma_addr_t iova, void *data,
184+
size_t len, bool write)
185185
{
186186
return -EOPNOTSUPP;
187187
}

drivers/vfio/vfio_main.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,6 +1938,11 @@ int vfio_set_irqs_validate_and_prepare(struct vfio_irq_set *hdr, int num_irqs,
19381938
}
19391939
EXPORT_SYMBOL(vfio_set_irqs_validate_and_prepare);
19401940

1941+
static bool vfio_device_has_container(struct vfio_device *device)
1942+
{
1943+
return device->group->container;
1944+
}
1945+
19411946
/*
19421947
* Pin contiguous user pages and return their associated host pages for local
19431948
* domain only.
@@ -1950,18 +1955,17 @@ EXPORT_SYMBOL(vfio_set_irqs_validate_and_prepare);
19501955
* Return error or number of pages pinned.
19511956
*
19521957
* A driver may only call this function if the vfio_device was created
1953-
* by vfio_register_emulated_iommu_dev() due to vfio_container_pin_pages().
1958+
* by vfio_register_emulated_iommu_dev() due to vfio_device_container_pin_pages().
19541959
*/
19551960
int vfio_pin_pages(struct vfio_device *device, dma_addr_t iova,
19561961
int npage, int prot, struct page **pages)
19571962
{
19581963
/* group->container cannot change while a vfio device is open */
19591964
if (!pages || !npage || WARN_ON(!vfio_assert_device_open(device)))
19601965
return -EINVAL;
1961-
if (device->group->container)
1962-
return vfio_container_pin_pages(device->group->container,
1963-
device->group->iommu_group,
1964-
iova, npage, prot, pages);
1966+
if (vfio_device_has_container(device))
1967+
return vfio_device_container_pin_pages(device, iova,
1968+
npage, prot, pages);
19651969
if (device->iommufd_access) {
19661970
int ret;
19671971

@@ -1997,9 +2001,8 @@ void vfio_unpin_pages(struct vfio_device *device, dma_addr_t iova, int npage)
19972001
if (WARN_ON(!vfio_assert_device_open(device)))
19982002
return;
19992003

2000-
if (device->group->container) {
2001-
vfio_container_unpin_pages(device->group->container, iova,
2002-
npage);
2004+
if (vfio_device_has_container(device)) {
2005+
vfio_device_container_unpin_pages(device, iova, npage);
20032006
return;
20042007
}
20052008
if (device->iommufd_access) {
@@ -2036,9 +2039,9 @@ int vfio_dma_rw(struct vfio_device *device, dma_addr_t iova, void *data,
20362039
if (!data || len <= 0 || !vfio_assert_device_open(device))
20372040
return -EINVAL;
20382041

2039-
if (device->group->container)
2040-
return vfio_container_dma_rw(device->group->container, iova,
2041-
data, len, write);
2042+
if (vfio_device_has_container(device))
2043+
return vfio_device_container_dma_rw(device, iova,
2044+
data, len, write);
20422045

20432046
if (device->iommufd_access) {
20442047
unsigned int flags = 0;

0 commit comments

Comments
 (0)