On Thu, 02 Sep 2021 09:11:40 +0000 Simon Ser contact@emersion.fr wrote:
This can be used to create a separate DRM file description, thus creating a new GEM handle namespace. See [1].
Example usage in wlroots is available at [2].
Hi Simon,
I have a feeling that this is a good idea, but could you explain in this commit message some real use cases where one needs a new GEM handle namespace? Not just "when you share a DRM fd between processes" but *why* you shared a DRM device fd between processes.
If I have trouble remembering or figuring that out from those links, then I'm sure others have too.
Thanks, pq
Signed-off-by: Simon Ser contact@emersion.fr Cc: Daniel Vetter daniel.vetter@ffwll.ch Cc: Daniel Stone daniels@collabora.com Cc: Pekka Paalanen pekka.paalanen@collabora.co.uk Cc: Michel Dänzer michel@daenzer.net Cc: Emil Velikov emil.l.velikov@gmail.com Cc: Keith Packard keithp@keithp.com Cc: Boris Brezillon boris.brezillon@collabora.com Cc: Dave Airlie airlied@redhat.com
drivers/gpu/drm/drm_lease.c | 39 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c index dee4f24a1808..d72c2fac0ff1 100644 --- a/drivers/gpu/drm/drm_lease.c +++ b/drivers/gpu/drm/drm_lease.c @@ -489,12 +489,6 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, if (!drm_core_check_feature(dev, DRIVER_MODESET)) return -EOPNOTSUPP;
- /* need some objects */
- if (cl->object_count == 0) {
DRM_DEBUG_LEASE("no objects in lease\n");
return -EINVAL;
- }
- if (cl->flags && (cl->flags & ~(O_CLOEXEC | O_NONBLOCK))) { DRM_DEBUG_LEASE("invalid flags\n"); return -EINVAL;
@@ -510,23 +504,26 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev,
object_count = cl->object_count;
- object_ids = memdup_user(u64_to_user_ptr(cl->object_ids),
array_size(object_count, sizeof(__u32)));
- if (IS_ERR(object_ids)) {
ret = PTR_ERR(object_ids);
goto out_lessor;
- }
- /* Handle leased objects, if any */ idr_init(&leases);
- if (object_count != 0) {
object_ids = memdup_user(u64_to_user_ptr(cl->object_ids),
array_size(object_count, sizeof(__u32)));
if (IS_ERR(object_ids)) {
ret = PTR_ERR(object_ids);
idr_destroy(&leases);
goto out_lessor;
}
- /* fill and validate the object idr */
- ret = fill_object_idr(dev, lessor_priv, &leases,
object_count, object_ids);
- kfree(object_ids);
- if (ret) {
DRM_DEBUG_LEASE("lease object lookup failed: %i\n", ret);
idr_destroy(&leases);
goto out_lessor;
/* fill and validate the object idr */
ret = fill_object_idr(dev, lessor_priv, &leases,
object_count, object_ids);
kfree(object_ids);
if (ret) {
DRM_DEBUG_LEASE("lease object lookup failed: %i\n", ret);
idr_destroy(&leases);
goto out_lessor;
}
}
/* Allocate a file descriptor for the lease */