Lines Matching refs:container
5 * VFIO container (/dev/vfio/vfio)
80 static bool vfio_iommu_driver_allowed(struct vfio_container *container,
85 return container->noiommu == (driver->ops == &vfio_noiommu_ops);
143 * it's freed via kref. Must support container/group/device being
148 struct vfio_container *container;
149 container = container_of(kref, struct vfio_container, kref);
151 kfree(container);
154 static void vfio_container_get(struct vfio_container *container)
156 kref_get(&container->kref);
159 static void vfio_container_put(struct vfio_container *container)
161 kref_put(&container->kref, vfio_container_release);
167 device->group->container->iommu_driver;
171 device->group->container->iommu_data, device);
177 device->group->container->iommu_driver;
181 device->group->container->iommu_data, device);
185 vfio_container_ioctl_check_extension(struct vfio_container *container,
191 down_read(&container->group_lock);
193 driver = container->iommu_driver;
209 if (!list_empty(&container->group_list) &&
210 !vfio_iommu_driver_allowed(container,
225 ret = driver->ops->ioctl(container->iommu_data,
229 up_read(&container->group_lock);
234 /* hold write lock on container->group_lock */
235 static int __vfio_container_attach_groups(struct vfio_container *container,
242 list_for_each_entry(group, &container->group_list, container_next) {
252 list_for_each_entry_continue_reverse(group, &container->group_list,
260 static long vfio_ioctl_set_iommu(struct vfio_container *container,
266 down_write(&container->group_lock);
269 * The container is designed to be an unprivileged interface while
271 * adding a group to a container does the user get the privilege of
273 * is no unset_iommu, but by removing all the groups from a container,
274 * the container is deprivileged and returns to an unset state.
276 if (list_empty(&container->group_list) || container->iommu_driver) {
277 up_write(&container->group_lock);
285 if (!vfio_iommu_driver_allowed(container, driver))
309 ret = __vfio_container_attach_groups(container, driver, data);
316 container->iommu_driver = driver;
317 container->iommu_data = data;
322 up_write(&container->group_lock);
330 struct vfio_container *container = filep->private_data;
335 if (!container)
343 ret = vfio_container_ioctl_check_extension(container, arg);
346 ret = vfio_ioctl_set_iommu(container, arg);
349 driver = container->iommu_driver;
350 data = container->iommu_data;
361 struct vfio_container *container;
363 container = kzalloc(sizeof(*container), GFP_KERNEL_ACCOUNT);
364 if (!container)
367 INIT_LIST_HEAD(&container->group_list);
368 init_rwsem(&container->group_lock);
369 kref_init(&container->kref);
371 filep->private_data = container;
378 struct vfio_container *container = filep->private_data;
382 vfio_container_put(container);
397 struct vfio_container *container;
403 container = file->private_data;
404 WARN_ON(!container); /* fget ensures we don't race vfio_release */
405 return container;
416 int vfio_container_attach_group(struct vfio_container *container,
427 down_write(&container->group_lock);
430 if (!list_empty(&container->group_list) &&
431 container->noiommu != (group->type == VFIO_NO_IOMMU)) {
442 driver = container->iommu_driver;
444 ret = driver->ops->attach_group(container->iommu_data,
455 group->container = container;
457 container->noiommu = (group->type == VFIO_NO_IOMMU);
458 list_add(&group->container_next, &container->group_list);
460 /* Get a reference on the container and mark a user within the group */
461 vfio_container_get(container);
464 up_write(&container->group_lock);
470 struct vfio_container *container = group->container;
476 down_write(&container->group_lock);
478 driver = container->iommu_driver;
480 driver->ops->detach_group(container->iommu_data,
486 group->container = NULL;
490 /* Detaching the last group deprivileges a container, remove iommu */
491 if (driver && list_empty(&container->group_list)) {
492 driver->ops->release(container->iommu_data);
494 container->iommu_driver = NULL;
495 container->iommu_data = NULL;
498 up_write(&container->group_lock);
500 vfio_container_put(container);
508 * The container fd has been assigned with VFIO_GROUP_SET_CONTAINER but
511 if (!group->container->iommu_driver)
535 struct vfio_container *container = device->group->container;
537 struct vfio_iommu_driver *driver = container->iommu_driver;
544 return driver->ops->pin_pages(container->iommu_data, iommu_group, iova,
551 struct vfio_container *container = device->group->container;
556 container->iommu_driver->ops->unpin_pages(container->iommu_data, iova,
564 struct vfio_container *container = device->group->container;
565 struct vfio_iommu_driver *driver = container->iommu_driver;
569 return driver->ops->dma_rw(container->iommu_data, iova, data, len,