[bug report] drm/i915/gvt: hold reference of VFIO group during opening of vgpu

Dan Carpenter dan.carpenter at oracle.com
Fri Aug 13 11:04:19 UTC 2021


Hello Yan Zhao,

The patch 776d95b768e6: "drm/i915/gvt: hold reference of VFIO group
during opening of vgpu" from Mar 12, 2020, leads to the following
Smatch static checker warning:

	drivers/gpu/drm/i915/gvt/kvmgt.c:919 intel_vgpu_open_device()
	warn: 'vfio_group' is an error pointer or valid

drivers/gpu/drm/i915/gvt/kvmgt.c
    909 	ret = vfio_register_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY, &events,
    910 				&vdev->group_notifier);
    911 	if (ret != 0) {
    912 		gvt_vgpu_err("vfio_register_notifier for group failed: %d\n",
    913 			ret);
    914 		goto undo_iommu;
    915 	}
    916 
    917 	vfio_group = vfio_group_get_external_user_from_dev(mdev_dev(mdev));
    918 	if (IS_ERR_OR_NULL(vfio_group)) {
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
When a function returns both NULLs and error pointers, then the NULL is
NOT an error.  This normally happens when a feature has been
deliberately disabled:

	foo = get_optional_feature();

If the feature is disabled, then the code has to continue without
printing an error message or crashing.  If the feature has an error then
that has to be reported to the user and we return an error code.

In this case, I don't think vfio_group_get_external_user_from_dev()
returns NULL so the fix is to just change the check to IS_ERR().

--> 919 		ret = !vfio_group ? -EFAULT : PTR_ERR(vfio_group);
    920 		gvt_vgpu_err("vfio_group_get_external_user_from_dev failed\n");
    921 		goto undo_register;
    922 	}
    923 	vdev->vfio_group = vfio_group;
    924 
    925 	/* Take a module reference as mdev core doesn't take
    926 	 * a reference for vendor driver.
    927 	 */
    928 	if (!try_module_get(THIS_MODULE)) {
    929 		ret = -ENODEV;
    930 		goto undo_group;
    931 	}
    932 
    933 	ret = kvmgt_guest_init(mdev);
    934 	if (ret)
    935 		goto undo_group;
    936 
    937 	intel_gvt_ops->vgpu_activate(vgpu);
    938 
    939 	atomic_set(&vdev->released, 0);
    940 	return ret;
    941 
    942 undo_group:
    943 	vfio_group_put_external_user(vdev->vfio_group);
    944 	vdev->vfio_group = NULL;
    945 
    946 undo_register:
    947 	vfio_unregister_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY,
    948 					&vdev->group_notifier);
    949 
    950 undo_iommu:
    951 	vfio_unregister_notifier(mdev_dev(mdev), VFIO_IOMMU_NOTIFY,
    952 					&vdev->iommu_notifier);
    953 out:
    954 	return ret;
    955 }

regards,
dan carpenter


More information about the intel-gvt-dev mailing list