Lines Matching full:container
75 struct vfio_container *container; member
350 * Container objects - containers are created when /dev/vfio/vfio is
352 * it's freed via kref. Must support container/group/device being
355 static void vfio_container_get(struct vfio_container *container) in vfio_container_get() argument
357 kref_get(&container->kref); in vfio_container_get()
362 struct vfio_container *container; in vfio_container_release() local
363 container = container_of(kref, struct vfio_container, kref); in vfio_container_release()
365 kfree(container); in vfio_container_release()
368 static void vfio_container_put(struct vfio_container *container) in vfio_container_put() argument
370 kref_put(&container->kref, vfio_container_release); in vfio_container_put()
999 * in use. The container persists with this group and those remaining in vfio_unregister_group_dev()
1006 * we need to make sure the group is detached from the container. in vfio_unregister_group_dev()
1011 wait_event(group->container_q, !group->container); in vfio_unregister_group_dev()
1021 static long vfio_ioctl_check_extension(struct vfio_container *container, in vfio_ioctl_check_extension() argument
1027 down_read(&container->group_lock); in vfio_ioctl_check_extension()
1029 driver = container->iommu_driver; in vfio_ioctl_check_extension()
1046 if (!list_empty(&container->group_list) && in vfio_ioctl_check_extension()
1047 (container->noiommu != in vfio_ioctl_check_extension()
1064 ret = driver->ops->ioctl(container->iommu_data, in vfio_ioctl_check_extension()
1068 up_read(&container->group_lock); in vfio_ioctl_check_extension()
1073 /* hold write lock on container->group_lock */
1074 static int __vfio_container_attach_groups(struct vfio_container *container, in __vfio_container_attach_groups() argument
1081 list_for_each_entry(group, &container->group_list, container_next) { in __vfio_container_attach_groups()
1090 list_for_each_entry_continue_reverse(group, &container->group_list, in __vfio_container_attach_groups()
1098 static long vfio_ioctl_set_iommu(struct vfio_container *container, in vfio_ioctl_set_iommu() argument
1104 down_write(&container->group_lock); in vfio_ioctl_set_iommu()
1107 * The container is designed to be an unprivileged interface while in vfio_ioctl_set_iommu()
1109 * adding a group to a container does the user get the privilege of in vfio_ioctl_set_iommu()
1111 * is no unset_iommu, but by removing all the groups from a container, in vfio_ioctl_set_iommu()
1112 * the container is deprivileged and returns to an unset state. in vfio_ioctl_set_iommu()
1114 if (list_empty(&container->group_list) || container->iommu_driver) { in vfio_ioctl_set_iommu()
1115 up_write(&container->group_lock); in vfio_ioctl_set_iommu()
1128 if (container->noiommu != (driver->ops == &vfio_noiommu_ops)) in vfio_ioctl_set_iommu()
1154 ret = __vfio_container_attach_groups(container, driver, data); in vfio_ioctl_set_iommu()
1161 container->iommu_driver = driver; in vfio_ioctl_set_iommu()
1162 container->iommu_data = data; in vfio_ioctl_set_iommu()
1167 up_write(&container->group_lock); in vfio_ioctl_set_iommu()
1175 struct vfio_container *container = filep->private_data; in vfio_fops_unl_ioctl() local
1180 if (!container) in vfio_fops_unl_ioctl()
1188 ret = vfio_ioctl_check_extension(container, arg); in vfio_fops_unl_ioctl()
1191 ret = vfio_ioctl_set_iommu(container, arg); in vfio_fops_unl_ioctl()
1194 driver = container->iommu_driver; in vfio_fops_unl_ioctl()
1195 data = container->iommu_data; in vfio_fops_unl_ioctl()
1206 struct vfio_container *container; in vfio_fops_open() local
1208 container = kzalloc(sizeof(*container), GFP_KERNEL); in vfio_fops_open()
1209 if (!container) in vfio_fops_open()
1212 INIT_LIST_HEAD(&container->group_list); in vfio_fops_open()
1213 init_rwsem(&container->group_lock); in vfio_fops_open()
1214 kref_init(&container->kref); in vfio_fops_open()
1216 filep->private_data = container; in vfio_fops_open()
1223 struct vfio_container *container = filep->private_data; in vfio_fops_release() local
1224 struct vfio_iommu_driver *driver = container->iommu_driver; in vfio_fops_release()
1227 driver->ops->notify(container->iommu_data, in vfio_fops_release()
1232 vfio_container_put(container); in vfio_fops_release()
1244 struct vfio_container *container = filep->private_data; in vfio_fops_read() local
1248 driver = container->iommu_driver; in vfio_fops_read()
1250 ret = driver->ops->read(container->iommu_data, in vfio_fops_read()
1259 struct vfio_container *container = filep->private_data; in vfio_fops_write() local
1263 driver = container->iommu_driver; in vfio_fops_write()
1265 ret = driver->ops->write(container->iommu_data, in vfio_fops_write()
1273 struct vfio_container *container = filep->private_data; in vfio_fops_mmap() local
1277 driver = container->iommu_driver; in vfio_fops_mmap()
1279 ret = driver->ops->mmap(container->iommu_data, vma); in vfio_fops_mmap()
1300 struct vfio_container *container = group->container; in __vfio_group_unset_container() local
1303 down_write(&container->group_lock); in __vfio_group_unset_container()
1305 driver = container->iommu_driver; in __vfio_group_unset_container()
1307 driver->ops->detach_group(container->iommu_data, in __vfio_group_unset_container()
1310 group->container = NULL; in __vfio_group_unset_container()
1314 /* Detaching the last group deprivileges a container, remove iommu */ in __vfio_group_unset_container()
1315 if (driver && list_empty(&container->group_list)) { in __vfio_group_unset_container()
1316 driver->ops->release(container->iommu_data); in __vfio_group_unset_container()
1318 container->iommu_driver = NULL; in __vfio_group_unset_container()
1319 container->iommu_data = NULL; in __vfio_group_unset_container()
1322 up_write(&container->group_lock); in __vfio_group_unset_container()
1324 vfio_container_put(container); in __vfio_group_unset_container()
1329 * if there was no container to unset. Since the ioctl is called on
1348 * When removing container users, anything that removes the last user
1349 * implicitly removes the group from the container. That is, if the
1362 struct vfio_container *container; in vfio_group_set_container() local
1382 container = f.file->private_data; in vfio_group_set_container()
1383 WARN_ON(!container); /* fget ensures we don't race vfio_release */ in vfio_group_set_container()
1385 down_write(&container->group_lock); in vfio_group_set_container()
1388 if (!list_empty(&container->group_list) && in vfio_group_set_container()
1389 container->noiommu != group->noiommu) { in vfio_group_set_container()
1394 driver = container->iommu_driver; in vfio_group_set_container()
1396 ret = driver->ops->attach_group(container->iommu_data, in vfio_group_set_container()
1402 group->container = container; in vfio_group_set_container()
1403 container->noiommu = group->noiommu; in vfio_group_set_container()
1404 list_add(&group->container_next, &container->group_list); in vfio_group_set_container()
1406 /* Get a reference on the container and mark a user within the group */ in vfio_group_set_container()
1407 vfio_container_get(container); in vfio_group_set_container()
1411 up_write(&container->group_lock); in vfio_group_set_container()
1431 if (!group->container->iommu_driver || !vfio_group_viable(group)) { in vfio_group_add_container_user()
1449 !group->container->iommu_driver || !vfio_group_viable(group)) in vfio_group_get_device_fd()
1544 if (group->container) in vfio_group_fops_unl_ioctl()
1608 if (group->container) { in vfio_group_fops_open()
1726 * - opening a new container;
1728 * - setting an IOMMU driver for a container.
1729 * When IOMMU is set for a container, all groups in it are
1738 * increments the container user counter to prevent
1746 * This call decrements the container user counter.
1773 * increments the container user counter to prevent the VFIO group
1779 * decrement the container user counter.
1828 return vfio_ioctl_check_extension(group->container, arg); in vfio_external_check_extension()
1964 struct vfio_container *container; in vfio_pin_pages() local
1988 container = group->container; in vfio_pin_pages()
1989 driver = container->iommu_driver; in vfio_pin_pages()
1991 ret = driver->ops->pin_pages(container->iommu_data, in vfio_pin_pages()
2016 struct vfio_container *container; in vfio_unpin_pages() local
2035 container = group->container; in vfio_unpin_pages()
2036 driver = container->iommu_driver; in vfio_unpin_pages()
2038 ret = driver->ops->unpin_pages(container->iommu_data, user_pfn, in vfio_unpin_pages()
2076 struct vfio_container *container; in vfio_group_pin_pages() local
2089 container = group->container; in vfio_group_pin_pages()
2090 driver = container->iommu_driver; in vfio_group_pin_pages()
2092 ret = driver->ops->pin_pages(container->iommu_data, in vfio_group_pin_pages()
2123 struct vfio_container *container; in vfio_group_unpin_pages() local
2133 container = group->container; in vfio_group_unpin_pages()
2134 driver = container->iommu_driver; in vfio_group_unpin_pages()
2136 ret = driver->ops->unpin_pages(container->iommu_data, in vfio_group_unpin_pages()
2174 struct vfio_container *container; in vfio_dma_rw() local
2181 container = group->container; in vfio_dma_rw()
2182 driver = container->iommu_driver; in vfio_dma_rw()
2185 ret = driver->ops->dma_rw(container->iommu_data, in vfio_dma_rw()
2198 struct vfio_container *container; in vfio_register_iommu_notifier() local
2206 container = group->container; in vfio_register_iommu_notifier()
2207 driver = container->iommu_driver; in vfio_register_iommu_notifier()
2209 ret = driver->ops->register_notifier(container->iommu_data, in vfio_register_iommu_notifier()
2222 struct vfio_container *container; in vfio_unregister_iommu_notifier() local
2230 container = group->container; in vfio_unregister_iommu_notifier()
2231 driver = container->iommu_driver; in vfio_unregister_iommu_notifier()
2233 ret = driver->ops->unregister_notifier(container->iommu_data, in vfio_unregister_iommu_notifier()
2363 struct vfio_container *container; in vfio_group_iommu_domain() local
2369 container = group->container; in vfio_group_iommu_domain()
2370 driver = container->iommu_driver; in vfio_group_iommu_domain()
2372 return driver->ops->group_iommu_domain(container->iommu_data, in vfio_group_iommu_domain()