struct device の iommu_group を参照する関数
/** * iommu_group_add_device - add a device to an iommu group * @group: the group into which to add the device (reference should be held) * @dev: the device * * This function is called by an iommu driver to add a device into a * group. Adding a device increments the group reference count. */ int iommu_group_add_device(struct iommu_group *group, struct device *dev) { int ret, i = 0; struct iommu_device *device;
device = kzalloc(sizeof(*device), GFP_KERNEL); if (!device) return -ENOMEM;
device->dev = dev; ret = sysfs_create_link(&dev->kobj, &group->kobj, "iommu_group"); if (ret) { kfree(device); return ret; }
device->name = kasprintf(GFP_KERNEL, "%s", kobject_name(&dev->kobj));
rename: if (!device->name) { sysfs_remove_link(&dev->kobj, "iommu_group"); kfree(device); return -ENOMEM; }
ret = sysfs_create_link_nowarn(group->devices_kobj, &dev->kobj, device->name); if (ret) { kfree(device->name); if (ret == -EEXIST && i >= 0) { /* * Account for the slim chance of collision * and append an instance to the name. */ device->name = kasprintf(GFP_KERNEL, "%s.%d", kobject_name(&dev->kobj), i++); goto rename; } sysfs_remove_link(&dev->kobj, "iommu_group"); kfree(device); return ret; }
kobject_get(group->devices_kobj);
dev->iommu_group = group; iommu_group_create_direct_mappings(group, dev);
mutex_lock(&group->mutex); list_add_tail(&device->list, &group->devices); if (group->domain) __iommu_attach_device(group->domain, dev); mutex_unlock(&group->mutex);
/* Notify any listeners about change to group. */ blocking_notifier_call_chain(&group->notifier, IOMMU_GROUP_NOTIFY_ADD_DEVICE, dev);
trace_add_device_to_group(group->id, dev);
pr_info("Adding device %s to group %d\n", dev_name(dev), group->id);
return 0; } EXPORT_SYMBOL_GPL(iommu_group_add_device);