Lines Matching full:container

76 	struct vfio_container		*container;  member
287 * Container objects - containers are created when /dev/vfio/vfio is
289 * it's freed via kref. Must support container/group/device being
292 static void vfio_container_get(struct vfio_container *container) in vfio_container_get() argument
294 kref_get(&container->kref); in vfio_container_get()
299 struct vfio_container *container; in vfio_container_release() local
300 container = container_of(kref, struct vfio_container, kref); in vfio_container_release()
302 kfree(container); in vfio_container_release()
305 static void vfio_container_put(struct vfio_container *container) in vfio_container_put() argument
307 kref_put(&container->kref, vfio_container_release); in vfio_container_put()
997 * in use. The container persists with this group and those remaining in vfio_del_group_dev()
1004 * we need to make sure the group is detached from the container. in vfio_del_group_dev()
1009 wait_event(group->container_q, !group->container); in vfio_del_group_dev()
1020 static long vfio_ioctl_check_extension(struct vfio_container *container, in vfio_ioctl_check_extension() argument
1026 down_read(&container->group_lock); in vfio_ioctl_check_extension()
1028 driver = container->iommu_driver; in vfio_ioctl_check_extension()
1045 if (!list_empty(&container->group_list) && in vfio_ioctl_check_extension()
1046 (container->noiommu != in vfio_ioctl_check_extension()
1063 ret = driver->ops->ioctl(container->iommu_data, in vfio_ioctl_check_extension()
1067 up_read(&container->group_lock); in vfio_ioctl_check_extension()
1072 /* hold write lock on container->group_lock */
1073 static int __vfio_container_attach_groups(struct vfio_container *container, in __vfio_container_attach_groups() argument
1080 list_for_each_entry(group, &container->group_list, container_next) { in __vfio_container_attach_groups()
1089 list_for_each_entry_continue_reverse(group, &container->group_list, in __vfio_container_attach_groups()
1097 static long vfio_ioctl_set_iommu(struct vfio_container *container, in vfio_ioctl_set_iommu() argument
1103 down_write(&container->group_lock); in vfio_ioctl_set_iommu()
1106 * The container is designed to be an unprivileged interface while in vfio_ioctl_set_iommu()
1108 * adding a group to a container does the user get the privilege of in vfio_ioctl_set_iommu()
1110 * is no unset_iommu, but by removing all the groups from a container, in vfio_ioctl_set_iommu()
1111 * the container is deprivileged and returns to an unset state. in vfio_ioctl_set_iommu()
1113 if (list_empty(&container->group_list) || container->iommu_driver) { in vfio_ioctl_set_iommu()
1114 up_write(&container->group_lock); in vfio_ioctl_set_iommu()
1127 if (container->noiommu != (driver->ops == &vfio_noiommu_ops)) in vfio_ioctl_set_iommu()
1153 ret = __vfio_container_attach_groups(container, driver, data); in vfio_ioctl_set_iommu()
1160 container->iommu_driver = driver; in vfio_ioctl_set_iommu()
1161 container->iommu_data = data; in vfio_ioctl_set_iommu()
1166 up_write(&container->group_lock); in vfio_ioctl_set_iommu()
1174 struct vfio_container *container = filep->private_data; in vfio_fops_unl_ioctl() local
1179 if (!container) in vfio_fops_unl_ioctl()
1187 ret = vfio_ioctl_check_extension(container, arg); in vfio_fops_unl_ioctl()
1190 ret = vfio_ioctl_set_iommu(container, arg); in vfio_fops_unl_ioctl()
1193 driver = container->iommu_driver; in vfio_fops_unl_ioctl()
1194 data = container->iommu_data; in vfio_fops_unl_ioctl()
1205 struct vfio_container *container; in vfio_fops_open() local
1207 container = kzalloc(sizeof(*container), GFP_KERNEL); in vfio_fops_open()
1208 if (!container) in vfio_fops_open()
1211 INIT_LIST_HEAD(&container->group_list); in vfio_fops_open()
1212 init_rwsem(&container->group_lock); in vfio_fops_open()
1213 kref_init(&container->kref); in vfio_fops_open()
1215 filep->private_data = container; in vfio_fops_open()
1222 struct vfio_container *container = filep->private_data; in vfio_fops_release() local
1226 vfio_container_put(container); in vfio_fops_release()
1238 struct vfio_container *container = filep->private_data; in vfio_fops_read() local
1242 driver = container->iommu_driver; in vfio_fops_read()
1244 ret = driver->ops->read(container->iommu_data, in vfio_fops_read()
1253 struct vfio_container *container = filep->private_data; in vfio_fops_write() local
1257 driver = container->iommu_driver; in vfio_fops_write()
1259 ret = driver->ops->write(container->iommu_data, in vfio_fops_write()
1267 struct vfio_container *container = filep->private_data; in vfio_fops_mmap() local
1271 driver = container->iommu_driver; in vfio_fops_mmap()
1273 ret = driver->ops->mmap(container->iommu_data, vma); in vfio_fops_mmap()
1294 struct vfio_container *container = group->container; in __vfio_group_unset_container() local
1297 down_write(&container->group_lock); in __vfio_group_unset_container()
1299 driver = container->iommu_driver; in __vfio_group_unset_container()
1301 driver->ops->detach_group(container->iommu_data, in __vfio_group_unset_container()
1304 group->container = NULL; in __vfio_group_unset_container()
1308 /* Detaching the last group deprivileges a container, remove iommu */ in __vfio_group_unset_container()
1309 if (driver && list_empty(&container->group_list)) { in __vfio_group_unset_container()
1310 driver->ops->release(container->iommu_data); in __vfio_group_unset_container()
1312 container->iommu_driver = NULL; in __vfio_group_unset_container()
1313 container->iommu_data = NULL; in __vfio_group_unset_container()
1316 up_write(&container->group_lock); in __vfio_group_unset_container()
1318 vfio_container_put(container); in __vfio_group_unset_container()
1323 * if there was no container to unset. Since the ioctl is called on
1342 * When removing container users, anything that removes the last user
1343 * implicitly removes the group from the container. That is, if the
1356 struct vfio_container *container; in vfio_group_set_container() local
1376 container = f.file->private_data; in vfio_group_set_container()
1377 WARN_ON(!container); /* fget ensures we don't race vfio_release */ in vfio_group_set_container()
1379 down_write(&container->group_lock); in vfio_group_set_container()
1382 if (!list_empty(&container->group_list) && in vfio_group_set_container()
1383 container->noiommu != group->noiommu) { in vfio_group_set_container()
1388 driver = container->iommu_driver; in vfio_group_set_container()
1390 ret = driver->ops->attach_group(container->iommu_data, in vfio_group_set_container()
1396 group->container = container; in vfio_group_set_container()
1397 container->noiommu = group->noiommu; in vfio_group_set_container()
1398 list_add(&group->container_next, &container->group_list); in vfio_group_set_container()
1400 /* Get a reference on the container and mark a user within the group */ in vfio_group_set_container()
1401 vfio_container_get(container); in vfio_group_set_container()
1405 up_write(&container->group_lock); in vfio_group_set_container()
1425 if (!group->container->iommu_driver || !vfio_group_viable(group)) { in vfio_group_add_container_user()
1442 !group->container->iommu_driver || !vfio_group_viable(group)) in vfio_group_get_device_fd()
1522 if (group->container) in vfio_group_fops_unl_ioctl()
1586 if (group->container) { in vfio_group_fops_open()
1699 * - opening a new container;
1701 * - setting an IOMMU driver for a container.
1702 * When IOMMU is set for a container, all groups in it are
1711 * increments the container user counter to prevent
1719 * This call decrements the container user counter.
1746 * increments the container user counter to prevent the VFIO group
1752 * decrement the container user counter.
1801 return vfio_ioctl_check_extension(group->container, arg); in vfio_external_check_extension()
1937 struct vfio_container *container; in vfio_pin_pages() local
1961 container = group->container; in vfio_pin_pages()
1962 driver = container->iommu_driver; in vfio_pin_pages()
1964 ret = driver->ops->pin_pages(container->iommu_data, in vfio_pin_pages()
1989 struct vfio_container *container; in vfio_unpin_pages() local
2008 container = group->container; in vfio_unpin_pages()
2009 driver = container->iommu_driver; in vfio_unpin_pages()
2011 ret = driver->ops->unpin_pages(container->iommu_data, user_pfn, in vfio_unpin_pages()
2049 struct vfio_container *container; in vfio_group_pin_pages() local
2062 container = group->container; in vfio_group_pin_pages()
2063 driver = container->iommu_driver; in vfio_group_pin_pages()
2065 ret = driver->ops->pin_pages(container->iommu_data, in vfio_group_pin_pages()
2096 struct vfio_container *container; in vfio_group_unpin_pages() local
2106 container = group->container; in vfio_group_unpin_pages()
2107 driver = container->iommu_driver; in vfio_group_unpin_pages()
2109 ret = driver->ops->unpin_pages(container->iommu_data, in vfio_group_unpin_pages()
2147 struct vfio_container *container; in vfio_dma_rw() local
2154 container = group->container; in vfio_dma_rw()
2155 driver = container->iommu_driver; in vfio_dma_rw()
2158 ret = driver->ops->dma_rw(container->iommu_data, in vfio_dma_rw()
2171 struct vfio_container *container; in vfio_register_iommu_notifier() local
2179 container = group->container; in vfio_register_iommu_notifier()
2180 driver = container->iommu_driver; in vfio_register_iommu_notifier()
2182 ret = driver->ops->register_notifier(container->iommu_data, in vfio_register_iommu_notifier()
2195 struct vfio_container *container; in vfio_unregister_iommu_notifier() local
2203 container = group->container; in vfio_unregister_iommu_notifier()
2204 driver = container->iommu_driver; in vfio_unregister_iommu_notifier()
2206 ret = driver->ops->unregister_notifier(container->iommu_data, in vfio_unregister_iommu_notifier()