[PATCH 1/5] drm: introduce sync objects
Chris Wilson
chris at chris-wilson.co.uk
Thu May 4 08:16:33 UTC 2017
On Wed, Apr 26, 2017 at 01:28:29PM +1000, Dave Airlie wrote:
> +#include <drm/drmP.h>
I wonder if Daniel has already split everything used here into its own
headers?
> +#include <linux/file.h>
> +#include <linux/fs.h>
> +#include <linux/anon_inodes.h>
> +
> +#include "drm_internal.h"
> +#include <drm/drm_syncobj.h>
> +
> +static struct drm_syncobj *drm_syncobj_get(struct drm_file *file_private,
> + u32 handle)
I would like this exposed to the driver as well, so I can do handle to
syncobj conversion once. (drm_syncobj_find() if we go with kref_get style
naming.)
> +static struct drm_syncobj *drm_syncobj_fdget(int fd)
It will aslo be useful to export the fd -> syncobj function for drivers. In
the interface Jason has for execbuf, we can substitute the handle for an
fd + flag, which may be more convenient for the user.
> +static int drm_syncobj_handle_to_fd(struct drm_file *file_private,
> + u32 handle, int *p_fd)
> +{
> + struct drm_syncobj *syncobj = drm_syncobj_get(file_private, handle);
> + int ret;
> + int fd;
> +
> + if (!syncobj)
> + return -EINVAL;
> +
> + fd = get_unused_fd_flags(O_CLOEXEC);
> + if (fd < 0) {
> + drm_syncobj_unreference(syncobj);
> + return fd;
> + }
> +
> + mutex_lock(&syncobj->file_lock);
> + if (!syncobj->file) {
Mutex only being used to ensure syncobj->file is set once? Is the race
likely? If not, we can spare the mutex and just use a try instead:
if (!syncobj->file) {
struct file *file;
file = anon_inode_getfile("syncobj_file",
&drm_syncobj_file_fops,
syncobj, 0);
if (IS_ERR(file))
return PTR_ERR(file);
drm_syncobj_get(syncobj);
if (cmpxchg(&syncobj->file, NULL, file) {
/* lost the race */
fput(file);
}
}
> + fd_install(fd, syncobj->file);
> + mutex_unlock(&syncobj->file_lock);
> + drm_syncobj_unreference(syncobj);
> + *p_fd = fd;
> + return 0;
> +out_unlock:
> + put_unused_fd(fd);
> + mutex_unlock(&syncobj->file_lock);
> + drm_syncobj_unreference(syncobj);
> + return ret;
> +}
> +
> +/**
> + * drm_gem_object_reference - acquire a GEM BO reference
> + * @obj: GEM buffer object
> + *
> + * This acquires additional reference to @obj. It is illegal to call this
> + * without already holding a reference. No locks required.
> + */
> +static inline void
> +drm_syncobj_reference(struct drm_syncobj *obj)
> +{
> + kref_get(&obj->refcount);
We've been steadily converting to the kref_get style of nomenclature for
drm object reference handling (i.e. drm_syncobj_get, drm_syncobj_put)
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the amd-gfx
mailing list