[RFC v1] drm: add reference count of gem object name

Inki Dae inki.dae at samsung.com
Sat Dec 1 06:21:25 PST 2012


2012/12/1 Daniel Vetter <daniel at ffwll.ch>

> On Sat, Dec 1, 2012 at 1:11 PM, Daniel Vetter <daniel at ffwll.ch> wrote:
> > I've quickly implemented a testcase for what I believe is your
> > use-case (i.e. sharing between 3 different open drm files, where we
> > close the gem handle in the first fd before we open the flink name
> > again using the 3rd drm fd handle). It seems to work.
>
> Now with link to testcase ....
>
> http://cgit.freedesktop.org/xorg/app/intel-gpu-tools/commit/?id=6daae8bcb6b4a930c9677f87fa24675581b69072
>
> Cheers, Daniel
>


I have checked the above testcase and I found out there was my missing
point.
The missing point is that when drm_gem_handle_create() is called by
drm_gem_open_ioctl(), obj->handle_count also is increased.
As you mentioned, it seems like that our user side has some bug somewhere.
Actually we had tested this on Xorg so this is complicated a little bit.

Thanks for your checking. :)

Thanks,
Inki Dae


And below addes my comments on your codes.

 /* obj->handle_count = 1, obj->refcount = 1 */
 ret = ioctl(fd2, DRM_IOCTL_I915_GEM_CREATE, &create);
 assert(ret == 0);

 flink.handle = create.handle;
 /* obj->handle_count = 1, obj->refcount = 2, flink name is allocated */
 /* flink_ioctl just increases only obj->refcount. */
 ret = ioctl(fd2, DRM_IOCTL_GEM_FLINK, &flink);
 assert(ret == 0);

 gem_open.name = flink.name;
 /* obj->handle_count = 2, obj->refcount = 3 */
 /* drm_gem_handle_create() increases obj->handle_count and obj->refcount.
This was my missing point. */
 ret = ioctl(fd, DRM_IOCTL_GEM_OPEN, &gem_open);
 assert(ret == 0);
 assert(gem_open.handle != 0);

 /* obj->handle_count = 1, obj->refcount = 2 */
 /* obj->handle_count = 1 so flink name isn't released */
 close(fd2);
 fd2 = drm_open_any();

 gem_open.name = flink.name;
 /* obj->handle_count = 2, obj->refcount = 3 */
 ret = ioctl(fd2, DRM_IOCTL_GEM_OPEN, &gem_open);
 assert(ret == 0);
 assert(gem_open.handle != 0);
}

And codes I added to release gem like below,
 /* obj->handle_count = 1, obj->refcount = 2 */
 ioctl(fd2, XXX_GEM_CLOSE, handle)
 /* obj->handle_count = 0, obj->refcount = 1 when flink name is released
and then obj->refcount = 0 so gem object can be released */
 ioctl(fd, XXX_GEM_CLOSE, handle)





> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20121201/39ba3cde/attachment.html>


More information about the dri-devel mailing list