Lines Matching refs:group

98 	struct vfio_group		*group;  member
120 struct iommu_group *group; in vfio_iommu_group_get() local
123 group = iommu_group_get(dev); in vfio_iommu_group_get()
132 if (group || !noiommu || iommu_present(dev->bus)) in vfio_iommu_group_get()
133 return group; in vfio_iommu_group_get()
135 group = iommu_group_alloc(); in vfio_iommu_group_get()
136 if (IS_ERR(group)) in vfio_iommu_group_get()
139 iommu_group_set_name(group, "vfio-noiommu"); in vfio_iommu_group_get()
140 iommu_group_set_iommudata(group, &noiommu, NULL); in vfio_iommu_group_get()
141 ret = iommu_group_add_device(group, dev); in vfio_iommu_group_get()
143 iommu_group_put(group); in vfio_iommu_group_get()
159 return group; in vfio_iommu_group_get()
163 void vfio_iommu_group_put(struct iommu_group *group, struct device *dev) in vfio_iommu_group_put() argument
166 if (iommu_group_get_iommudata(group) == &noiommu) in vfio_iommu_group_put()
170 iommu_group_put(group); in vfio_iommu_group_put()
273 static int vfio_alloc_group_minor(struct vfio_group *group) in vfio_alloc_group_minor() argument
275 return idr_alloc(&vfio.group_idr, group, 0, MINORMASK + 1, GFP_KERNEL); in vfio_alloc_group_minor()
285 static void vfio_group_get(struct vfio_group *group);
311 static void vfio_group_unlock_and_free(struct vfio_group *group) in vfio_group_unlock_and_free() argument
318 iommu_group_unregister_notifier(group->iommu_group, &group->nb); in vfio_group_unlock_and_free()
319 kfree(group); in vfio_group_unlock_and_free()
327 struct vfio_group *group, *tmp; in vfio_create_group() local
331 group = kzalloc(sizeof(*group), GFP_KERNEL); in vfio_create_group()
332 if (!group) in vfio_create_group()
335 kref_init(&group->kref); in vfio_create_group()
336 INIT_LIST_HEAD(&group->device_list); in vfio_create_group()
337 mutex_init(&group->device_lock); in vfio_create_group()
338 INIT_LIST_HEAD(&group->unbound_list); in vfio_create_group()
339 mutex_init(&group->unbound_lock); in vfio_create_group()
340 atomic_set(&group->container_users, 0); in vfio_create_group()
341 atomic_set(&group->opened, 0); in vfio_create_group()
342 init_waitqueue_head(&group->container_q); in vfio_create_group()
343 group->iommu_group = iommu_group; in vfio_create_group()
345 group->noiommu = (iommu_group_get_iommudata(iommu_group) == &noiommu); in vfio_create_group()
347 BLOCKING_INIT_NOTIFIER_HEAD(&group->notifier); in vfio_create_group()
349 group->nb.notifier_call = vfio_iommu_group_notifier; in vfio_create_group()
358 ret = iommu_group_register_notifier(iommu_group, &group->nb); in vfio_create_group()
360 kfree(group); in vfio_create_group()
370 vfio_group_unlock_and_free(group); in vfio_create_group()
375 minor = vfio_alloc_group_minor(group); in vfio_create_group()
377 vfio_group_unlock_and_free(group); in vfio_create_group()
383 group, "%s%d", group->noiommu ? "noiommu-" : "", in vfio_create_group()
387 vfio_group_unlock_and_free(group); in vfio_create_group()
391 group->minor = minor; in vfio_create_group()
392 group->dev = dev; in vfio_create_group()
394 list_add(&group->vfio_next, &vfio.group_list); in vfio_create_group()
398 return group; in vfio_create_group()
404 struct vfio_group *group = container_of(kref, struct vfio_group, kref); in vfio_group_release() local
406 struct iommu_group *iommu_group = group->iommu_group; in vfio_group_release()
408 WARN_ON(!list_empty(&group->device_list)); in vfio_group_release()
409 WARN_ON(group->notifier.head); in vfio_group_release()
412 &group->unbound_list, unbound_next) { in vfio_group_release()
417 device_destroy(vfio.class, MKDEV(MAJOR(vfio.group_devt), group->minor)); in vfio_group_release()
418 list_del(&group->vfio_next); in vfio_group_release()
419 vfio_free_group_minor(group->minor); in vfio_group_release()
420 vfio_group_unlock_and_free(group); in vfio_group_release()
424 static void vfio_group_put(struct vfio_group *group) in vfio_group_put() argument
426 kref_put_mutex(&group->kref, vfio_group_release, &vfio.group_lock); in vfio_group_put()
431 struct vfio_group *group; member
440 vfio_group_put(do_work->group); in vfio_group_put_bg()
444 static void vfio_group_schedule_put(struct vfio_group *group) in vfio_group_schedule_put() argument
453 do_work->group = group; in vfio_group_schedule_put()
458 static void vfio_group_get(struct vfio_group *group) in vfio_group_get() argument
460 kref_get(&group->kref); in vfio_group_get()
467 static struct vfio_group *vfio_group_try_get(struct vfio_group *group) in vfio_group_try_get() argument
469 struct vfio_group *target = group; in vfio_group_try_get()
472 list_for_each_entry(group, &vfio.group_list, vfio_next) { in vfio_group_try_get()
473 if (group == target) { in vfio_group_try_get()
474 vfio_group_get(group); in vfio_group_try_get()
476 return group; in vfio_group_try_get()
487 struct vfio_group *group; in vfio_group_get_from_iommu() local
490 list_for_each_entry(group, &vfio.group_list, vfio_next) { in vfio_group_get_from_iommu()
491 if (group->iommu_group == iommu_group) { in vfio_group_get_from_iommu()
492 vfio_group_get(group); in vfio_group_get_from_iommu()
494 return group; in vfio_group_get_from_iommu()
504 struct vfio_group *group; in vfio_group_get_from_minor() local
507 group = idr_find(&vfio.group_idr, minor); in vfio_group_get_from_minor()
508 if (!group) { in vfio_group_get_from_minor()
512 vfio_group_get(group); in vfio_group_get_from_minor()
515 return group; in vfio_group_get_from_minor()
521 struct vfio_group *group; in vfio_group_get_from_dev() local
527 group = vfio_group_get_from_iommu(iommu_group); in vfio_group_get_from_dev()
530 return group; in vfio_group_get_from_dev()
537 struct vfio_device *vfio_group_create_device(struct vfio_group *group, in vfio_group_create_device() argument
550 device->group = group; in vfio_group_create_device()
556 vfio_group_get(group); in vfio_group_create_device()
558 mutex_lock(&group->device_lock); in vfio_group_create_device()
559 list_add(&device->group_next, &group->device_list); in vfio_group_create_device()
560 mutex_unlock(&group->device_lock); in vfio_group_create_device()
569 struct vfio_group *group = device->group; in vfio_device_release() local
572 mutex_unlock(&group->device_lock); in vfio_device_release()
585 struct vfio_group *group = device->group; in vfio_device_put() local
586 kref_put_mutex(&device->kref, vfio_device_release, &group->device_lock); in vfio_device_put()
587 vfio_group_put(group); in vfio_device_put()
593 vfio_group_get(device->group); in vfio_device_get()
597 static struct vfio_device *vfio_group_get_device(struct vfio_group *group, in vfio_group_get_device() argument
602 mutex_lock(&group->device_lock); in vfio_group_get_device()
603 list_for_each_entry(device, &group->device_list, group_next) { in vfio_group_get_device()
606 mutex_unlock(&group->device_lock); in vfio_group_get_device()
610 mutex_unlock(&group->device_lock); in vfio_group_get_device()
661 struct vfio_group *group = data; in vfio_dev_viable() local
667 mutex_lock(&group->unbound_lock); in vfio_dev_viable()
668 list_for_each_entry(unbound, &group->unbound_list, unbound_next) { in vfio_dev_viable()
674 mutex_unlock(&group->unbound_lock); in vfio_dev_viable()
679 device = vfio_group_get_device(group, dev); in vfio_dev_viable()
691 static int vfio_group_nb_add_dev(struct vfio_group *group, struct device *dev) in vfio_group_nb_add_dev() argument
696 device = vfio_group_get_device(group, dev); in vfio_group_nb_add_dev()
703 if (!atomic_read(&group->container_users)) in vfio_group_nb_add_dev()
708 iommu_group_id(group->iommu_group)); in vfio_group_nb_add_dev()
713 static int vfio_group_nb_verify(struct vfio_group *group, struct device *dev) in vfio_group_nb_verify() argument
716 if (!atomic_read(&group->container_users)) in vfio_group_nb_verify()
719 return vfio_dev_viable(dev, group); in vfio_group_nb_verify()
725 struct vfio_group *group = container_of(nb, struct vfio_group, nb); in vfio_iommu_group_notifier() local
733 group = vfio_group_try_get(group); in vfio_iommu_group_notifier()
734 if (!group) in vfio_iommu_group_notifier()
739 vfio_group_nb_add_dev(group, dev); in vfio_iommu_group_notifier()
753 iommu_group_id(group->iommu_group)); in vfio_iommu_group_notifier()
758 iommu_group_id(group->iommu_group), dev->driver->name); in vfio_iommu_group_notifier()
759 BUG_ON(vfio_group_nb_verify(group, dev)); in vfio_iommu_group_notifier()
764 iommu_group_id(group->iommu_group), dev->driver->name); in vfio_iommu_group_notifier()
769 iommu_group_id(group->iommu_group)); in vfio_iommu_group_notifier()
778 mutex_lock(&group->unbound_lock); in vfio_iommu_group_notifier()
780 &group->unbound_list, unbound_next) { in vfio_iommu_group_notifier()
787 mutex_unlock(&group->unbound_lock); in vfio_iommu_group_notifier()
798 vfio_group_schedule_put(group); in vfio_iommu_group_notifier()
809 struct vfio_group *group; in vfio_add_group_dev() local
816 group = vfio_group_get_from_iommu(iommu_group); in vfio_add_group_dev()
817 if (!group) { in vfio_add_group_dev()
818 group = vfio_create_group(iommu_group); in vfio_add_group_dev()
819 if (IS_ERR(group)) { in vfio_add_group_dev()
821 return PTR_ERR(group); in vfio_add_group_dev()
831 device = vfio_group_get_device(group, dev); in vfio_add_group_dev()
836 vfio_group_put(group); in vfio_add_group_dev()
840 device = vfio_group_create_device(group, dev, ops, device_data); in vfio_add_group_dev()
842 vfio_group_put(group); in vfio_add_group_dev()
851 vfio_group_put(group); in vfio_add_group_dev()
866 struct vfio_group *group; in vfio_device_get_from_dev() local
869 group = vfio_group_get_from_dev(dev); in vfio_device_get_from_dev()
870 if (!group) in vfio_device_get_from_dev()
873 device = vfio_group_get_device(group, dev); in vfio_device_get_from_dev()
874 vfio_group_put(group); in vfio_device_get_from_dev()
880 static struct vfio_device *vfio_device_get_from_name(struct vfio_group *group, in vfio_device_get_from_name() argument
885 mutex_lock(&group->device_lock); in vfio_device_get_from_name()
886 list_for_each_entry(it, &group->device_list, group_next) { in vfio_device_get_from_name()
893 mutex_unlock(&group->device_lock); in vfio_device_get_from_name()
908 static bool vfio_dev_present(struct vfio_group *group, struct device *dev) in vfio_dev_present() argument
912 device = vfio_group_get_device(group, dev); in vfio_dev_present()
926 struct vfio_group *group = device->group; in vfio_del_group_dev() local
937 vfio_group_get(group); in vfio_del_group_dev()
951 mutex_lock(&group->unbound_lock); in vfio_del_group_dev()
952 list_add(&unbound->unbound_next, &group->unbound_list); in vfio_del_group_dev()
953 mutex_unlock(&group->unbound_lock); in vfio_del_group_dev()
968 device = vfio_group_get_device(group, dev); in vfio_del_group_dev()
979 !vfio_dev_present(group, dev), HZ * 10); in vfio_del_group_dev()
982 !vfio_dev_present(group, dev), HZ * 10); in vfio_del_group_dev()
1008 if (list_empty(&group->device_list)) in vfio_del_group_dev()
1009 wait_event(group->container_q, !group->container); in vfio_del_group_dev()
1011 vfio_group_put(group); in vfio_del_group_dev()
1077 struct vfio_group *group; in __vfio_container_attach_groups() local
1080 list_for_each_entry(group, &container->group_list, container_next) { in __vfio_container_attach_groups()
1081 ret = driver->ops->attach_group(data, group->iommu_group); in __vfio_container_attach_groups()
1089 list_for_each_entry_continue_reverse(group, &container->group_list, in __vfio_container_attach_groups()
1091 driver->ops->detach_group(data, group->iommu_group); in __vfio_container_attach_groups()
1303 static void __vfio_group_unset_container(struct vfio_group *group) in __vfio_group_unset_container() argument
1305 struct vfio_container *container = group->container; in __vfio_group_unset_container()
1313 group->iommu_group); in __vfio_group_unset_container()
1315 group->container = NULL; in __vfio_group_unset_container()
1316 wake_up(&group->container_q); in __vfio_group_unset_container()
1317 list_del(&group->container_next); in __vfio_group_unset_container()
1338 static int vfio_group_unset_container(struct vfio_group *group) in vfio_group_unset_container() argument
1340 int users = atomic_cmpxchg(&group->container_users, 1, 0); in vfio_group_unset_container()
1347 __vfio_group_unset_container(group); in vfio_group_unset_container()
1358 static void vfio_group_try_dissolve_container(struct vfio_group *group) in vfio_group_try_dissolve_container() argument
1360 if (0 == atomic_dec_if_positive(&group->container_users)) in vfio_group_try_dissolve_container()
1361 __vfio_group_unset_container(group); in vfio_group_try_dissolve_container()
1364 static int vfio_group_set_container(struct vfio_group *group, int container_fd) in vfio_group_set_container() argument
1371 if (atomic_read(&group->container_users)) in vfio_group_set_container()
1374 if (group->noiommu && !capable(CAP_SYS_RAWIO)) in vfio_group_set_container()
1394 container->noiommu != group->noiommu) { in vfio_group_set_container()
1402 group->iommu_group); in vfio_group_set_container()
1407 group->container = container; in vfio_group_set_container()
1408 container->noiommu = group->noiommu; in vfio_group_set_container()
1409 list_add(&group->container_next, &container->group_list); in vfio_group_set_container()
1413 atomic_inc(&group->container_users); in vfio_group_set_container()
1421 static bool vfio_group_viable(struct vfio_group *group) in vfio_group_viable() argument
1423 return (iommu_group_for_each_dev(group->iommu_group, in vfio_group_viable()
1424 group, vfio_dev_viable) == 0); in vfio_group_viable()
1427 static int vfio_group_add_container_user(struct vfio_group *group) in vfio_group_add_container_user() argument
1429 if (!atomic_inc_not_zero(&group->container_users)) in vfio_group_add_container_user()
1432 if (group->noiommu) { in vfio_group_add_container_user()
1433 atomic_dec(&group->container_users); in vfio_group_add_container_user()
1436 if (!group->container->iommu_driver || !vfio_group_viable(group)) { in vfio_group_add_container_user()
1437 atomic_dec(&group->container_users); in vfio_group_add_container_user()
1446 static int vfio_group_get_device_fd(struct vfio_group *group, char *buf) in vfio_group_get_device_fd() argument
1452 if (0 == atomic_read(&group->container_users) || in vfio_group_get_device_fd()
1453 !group->container->iommu_driver || !vfio_group_viable(group)) in vfio_group_get_device_fd()
1456 if (group->noiommu && !capable(CAP_SYS_RAWIO)) in vfio_group_get_device_fd()
1459 device = vfio_device_get_from_name(group, buf); in vfio_group_get_device_fd()
1497 atomic_inc(&group->container_users); in vfio_group_get_device_fd()
1501 if (group->noiommu) in vfio_group_get_device_fd()
1511 struct vfio_group *group = filep->private_data; in vfio_group_fops_unl_ioctl() local
1530 if (vfio_group_viable(group)) in vfio_group_fops_unl_ioctl()
1533 if (group->container) in vfio_group_fops_unl_ioctl()
1552 ret = vfio_group_set_container(group, fd); in vfio_group_fops_unl_ioctl()
1556 ret = vfio_group_unset_container(group); in vfio_group_fops_unl_ioctl()
1566 ret = vfio_group_get_device_fd(group, buf); in vfio_group_fops_unl_ioctl()
1586 struct vfio_group *group; in vfio_group_fops_open() local
1589 group = vfio_group_get_from_minor(iminor(inode)); in vfio_group_fops_open()
1590 if (!group) in vfio_group_fops_open()
1593 if (group->noiommu && !capable(CAP_SYS_RAWIO)) { in vfio_group_fops_open()
1594 vfio_group_put(group); in vfio_group_fops_open()
1599 opened = atomic_cmpxchg(&group->opened, 0, 1); in vfio_group_fops_open()
1601 vfio_group_put(group); in vfio_group_fops_open()
1606 if (group->container) { in vfio_group_fops_open()
1607 atomic_dec(&group->opened); in vfio_group_fops_open()
1608 vfio_group_put(group); in vfio_group_fops_open()
1613 if (WARN_ON(group->notifier.head)) in vfio_group_fops_open()
1614 BLOCKING_INIT_NOTIFIER_HEAD(&group->notifier); in vfio_group_fops_open()
1616 filep->private_data = group; in vfio_group_fops_open()
1623 struct vfio_group *group = filep->private_data; in vfio_group_fops_release() local
1627 vfio_group_try_dissolve_container(group); in vfio_group_fops_release()
1629 atomic_dec(&group->opened); in vfio_group_fops_release()
1631 vfio_group_put(group); in vfio_group_fops_release()
1655 vfio_group_try_dissolve_container(device->group); in vfio_device_fops_release()
1756 struct vfio_group *group = filep->private_data; in vfio_group_get_external_user() local
1762 ret = vfio_group_add_container_user(group); in vfio_group_get_external_user()
1766 vfio_group_get(group); in vfio_group_get_external_user()
1768 return group; in vfio_group_get_external_user()
1772 void vfio_group_put_external_user(struct vfio_group *group) in vfio_group_put_external_user() argument
1774 vfio_group_try_dissolve_container(group); in vfio_group_put_external_user()
1775 vfio_group_put(group); in vfio_group_put_external_user()
1782 struct vfio_group *group = filep->private_data; in vfio_external_group_match_file() local
1784 return (filep->f_op == &vfio_group_fops) && (group == test_group); in vfio_external_group_match_file()
1788 int vfio_external_user_iommu_id(struct vfio_group *group) in vfio_external_user_iommu_id() argument
1790 return iommu_group_id(group->iommu_group); in vfio_external_user_iommu_id()
1794 long vfio_external_check_extension(struct vfio_group *group, unsigned long arg) in vfio_external_check_extension() argument
1796 return vfio_ioctl_check_extension(group->container, arg); in vfio_external_check_extension()
1933 struct vfio_group *group; in vfio_pin_pages() local
1943 group = vfio_group_get_from_dev(dev); in vfio_pin_pages()
1944 if (!group) in vfio_pin_pages()
1947 ret = vfio_group_add_container_user(group); in vfio_pin_pages()
1951 container = group->container; in vfio_pin_pages()
1959 vfio_group_try_dissolve_container(group); in vfio_pin_pages()
1962 vfio_group_put(group); in vfio_pin_pages()
1979 struct vfio_group *group; in vfio_unpin_pages() local
1989 group = vfio_group_get_from_dev(dev); in vfio_unpin_pages()
1990 if (!group) in vfio_unpin_pages()
1993 ret = vfio_group_add_container_user(group); in vfio_unpin_pages()
1997 container = group->container; in vfio_unpin_pages()
2005 vfio_group_try_dissolve_container(group); in vfio_unpin_pages()
2008 vfio_group_put(group); in vfio_unpin_pages()
2013 static int vfio_register_iommu_notifier(struct vfio_group *group, in vfio_register_iommu_notifier() argument
2021 ret = vfio_group_add_container_user(group); in vfio_register_iommu_notifier()
2025 container = group->container; in vfio_register_iommu_notifier()
2033 vfio_group_try_dissolve_container(group); in vfio_register_iommu_notifier()
2038 static int vfio_unregister_iommu_notifier(struct vfio_group *group, in vfio_unregister_iommu_notifier() argument
2045 ret = vfio_group_add_container_user(group); in vfio_unregister_iommu_notifier()
2049 container = group->container; in vfio_unregister_iommu_notifier()
2057 vfio_group_try_dissolve_container(group); in vfio_unregister_iommu_notifier()
2062 void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm) in vfio_group_set_kvm() argument
2064 group->kvm = kvm; in vfio_group_set_kvm()
2065 blocking_notifier_call_chain(&group->notifier, in vfio_group_set_kvm()
2070 static int vfio_register_group_notifier(struct vfio_group *group, in vfio_register_group_notifier() argument
2087 ret = vfio_group_add_container_user(group); in vfio_register_group_notifier()
2091 ret = blocking_notifier_chain_register(&group->notifier, nb); in vfio_register_group_notifier()
2097 if (!ret && set_kvm && group->kvm) in vfio_register_group_notifier()
2098 blocking_notifier_call_chain(&group->notifier, in vfio_register_group_notifier()
2099 VFIO_GROUP_NOTIFY_SET_KVM, group->kvm); in vfio_register_group_notifier()
2101 vfio_group_try_dissolve_container(group); in vfio_register_group_notifier()
2106 static int vfio_unregister_group_notifier(struct vfio_group *group, in vfio_unregister_group_notifier() argument
2111 ret = vfio_group_add_container_user(group); in vfio_unregister_group_notifier()
2115 ret = blocking_notifier_chain_unregister(&group->notifier, nb); in vfio_unregister_group_notifier()
2117 vfio_group_try_dissolve_container(group); in vfio_unregister_group_notifier()
2125 struct vfio_group *group; in vfio_register_notifier() local
2131 group = vfio_group_get_from_dev(dev); in vfio_register_notifier()
2132 if (!group) in vfio_register_notifier()
2137 ret = vfio_register_iommu_notifier(group, events, nb); in vfio_register_notifier()
2140 ret = vfio_register_group_notifier(group, events, nb); in vfio_register_notifier()
2146 vfio_group_put(group); in vfio_register_notifier()
2154 struct vfio_group *group; in vfio_unregister_notifier() local
2160 group = vfio_group_get_from_dev(dev); in vfio_unregister_notifier()
2161 if (!group) in vfio_unregister_notifier()
2166 ret = vfio_unregister_iommu_notifier(group, nb); in vfio_unregister_notifier()
2169 ret = vfio_unregister_group_notifier(group, nb); in vfio_unregister_notifier()
2175 vfio_group_put(group); in vfio_unregister_notifier()