Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-12 Thread Jason Ekstrand
Would one of you mind pushing?  I don't have drm-misc commit bits.

On Mon, Aug 12, 2019 at 9:22 AM Jason Ekstrand  wrote:

> This patch only brings the syncobj documentation up-to-date for the
> original form of syncobj.  It does not contain any information about the
> design of timeline syncobjs.
>
> v2: Incorporate feedback from Lionel and Christian:
>  - Mention actual ioctl and flag names
>  - Better language around reference counting
>  - Misc. language cleanups
>
> Signed-off-by: Jason Ekstrand 
> Reviewed-by: Lionel Landwerlin 
> Acked-by: Christian König 
> ---
>  drivers/gpu/drm/drm_syncobj.c | 98 +++
>  1 file changed, 87 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index 1438dcb3ebb1..4b5c7b0ed714 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -29,21 +29,97 @@
>  /**
>   * DOC: Overview
>   *
> - * DRM synchronisation objects (syncobj, see struct _syncobj) are
> - * persistent objects that contain an optional fence. The fence can be
> updated
> - * with a new fence, or be NULL.
> + * DRM synchronisation objects (syncobj, see struct _syncobj) provide
> a
> + * container for a synchronization primitive which can be used by
> userspace
> + * to explicitly synchronize GPU commands, can be shared between userspace
> + * processes, and can be shared between different DRM drivers.
> + * Their primary use-case is to implement Vulkan fences and semaphores.
> + * The syncobj userspace API provides ioctls for several operations:
>   *
> - * syncobj's can be waited upon, where it will wait for the underlying
> - * fence.
> + *  - Creation and destruction of syncobjs
> + *  - Import and export of syncobjs to/from a syncobj file descriptor
> + *  - Import and export a syncobj's underlying fence to/from a sync file
> + *  - Reset a syncobj (set its fence to NULL)
> + *  - Signal a syncobj (set a trivially signaled fence)
> + *  - Wait for a syncobj's fence to appear and be signaled
>   *
> - * syncobj's can be export to fd's and back, these fd's are opaque and
> - * have no other use case, except passing the syncobj between processes.
> + * At it's core, a syncobj is simply a wrapper around a pointer to a
> struct
> + * _fence which may be NULL.
> + * When a syncobj is first created, its pointer is either NULL or a
> pointer
> + * to an already signaled fence depending on whether the
> + * _SYNCOBJ_CREATE_SIGNALED flag is passed to
> + * _IOCTL_SYNCOBJ_CREATE.
> + * When GPU work which signals a syncobj is enqueued in a DRM driver,
> + * the syncobj fence is replaced with a fence which will be signaled by
> the
> + * completion of that work.
> + * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
> + * driver retrieves syncobj's current fence at the time the work is
> enqueued
> + * waits on that fence before submitting the work to hardware.
> + * If the syncobj's fence is NULL, the enqueue operation is expected to
> fail.
> + * All manipulation of the syncobjs's fence happens in terms of the
> current
> + * fence at the time the ioctl is called by userspace regardless of
> whether
> + * that operation is an immediate host-side operation (signal or reset) or
> + * or an operation which is enqueued in some driver queue.
> + * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be used to
> + * manipulate a syncobj from the host by resetting its pointer to NULL or
> + * setting its pointer to a fence which is already signaled.
>   *
> - * Their primary use-case is to implement Vulkan fences and semaphores.
>   *
> - * syncobj have a kref reference count, but also have an optional file.
> - * The file is only created once the syncobj is exported.
> - * The file takes a reference on the kref.
> + * Host-side wait on syncobjs
> + * --
> + *
> + * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and does a
> + * host-side wait on all of the syncobj fences simultaneously.
> + * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will wait on
> + * all of the syncobj fences to be signaled before it returns.
> + * Otherwise, it returns once at least one syncobj fence has been signaled
> + * and the index of a signaled fence is written back to the client.
> + *
> + * Unlike the enqueued GPU work dependencies which fail if they see a NULL
> + * fence in a syncobj, if _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
> + * the host-side wait will first wait for the syncobj to receive a
> non-NULL
> + * fence and then wait on that fence.
> + * If _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is not set and any one of
> the
> + * syncobjs in the array has a NULL fence, -EINVAL will be returned.
> + * Assuming the syncobj starts off with a NULL fence, this allows a client
> + * to do a host wait in one thread (or process) which waits on GPU work
> + * submitted in another thread (or process) without having to manually
> + * synchronize between the 

[PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-12 Thread Jason Ekstrand
This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.

v2: Incorporate feedback from Lionel and Christian:
 - Mention actual ioctl and flag names
 - Better language around reference counting
 - Misc. language cleanups

Signed-off-by: Jason Ekstrand 
Reviewed-by: Lionel Landwerlin 
Acked-by: Christian König 
---
 drivers/gpu/drm/drm_syncobj.c | 98 +++
 1 file changed, 87 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..4b5c7b0ed714 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,21 +29,97 @@
 /**
  * DOC: Overview
  *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * container for a synchronization primitive which can be used by userspace
+ * to explicitly synchronize GPU commands, can be shared between userspace
+ * processes, and can be shared between different DRM drivers.
+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
  *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait for a syncobj's fence to appear and be signaled
  *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj is simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When a syncobj is first created, its pointer is either NULL or a pointer
+ * to an already signaled fence depending on whether the
+ * _SYNCOBJ_CREATE_SIGNALED flag is passed to
+ * _IOCTL_SYNCOBJ_CREATE.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
+ * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be used to
+ * manipulate a syncobj from the host by resetting its pointer to NULL or
+ * setting its pointer to a fence which is already signaled.
  *
- * Their primary use-case is to implement Vulkan fences and semaphores.
  *
- * syncobj have a kref reference count, but also have an optional file.
- * The file is only created once the syncobj is exported.
- * The file takes a reference on the kref.
+ * Host-side wait on syncobjs
+ * --
+ *
+ * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and does a
+ * host-side wait on all of the syncobj fences simultaneously.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will wait on
+ * all of the syncobj fences to be signaled before it returns.
+ * Otherwise, it returns once at least one syncobj fence has been signaled
+ * and the index of a signaled fence is written back to the client.
+ *
+ * Unlike the enqueued GPU work dependencies which fail if they see a NULL
+ * fence in a syncobj, if _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
+ * the host-side wait will first wait for the syncobj to receive a non-NULL
+ * fence and then wait on that fence.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is not set and any one of the
+ * syncobjs in the array has a NULL fence, -EINVAL will be returned.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.
+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * _IOCTL_SYNCOBJ_FD_TO_HANDLE and _IOCTL_SYNCOBJ_HANDLE_TO_FD
+ * provide two mechanisms for import/export of syncobjs.
+ *
+ * The first lets the client import or export an entire syncobj 

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-08 Thread Koenig, Christian
Hi Jason,

this mail also somehow ended up to be rejected by our spam filter and 
I'm not sure why :(

Anyway, feel free to add my Acked-by. From the technical point I would 
give an r-b as well, but I'm not a native speaker of English.

Cheers,
Christian.

Am 08.08.19 um 06:47 schrieb Jason Ekstrand:
> Christan, any thoughts on v2?
>
> --Jason
>
>
> On August 7, 2019 09:06:47 Lionel Landwerlin 
>  wrote:
>
>> On 06/08/2019 19:19, Jason Ekstrand wrote:
>>> This patch only brings the syncobj documentation up-to-date for the
>>> original form of syncobj.  It does not contain any information about 
>>> the
>>> design of timeline syncobjs.
>>>
>>> v2: Incorporate feedback from Lionel and Christian:
>>>   - Mention actual ioctl and flag names
>>>   - Better language around reference counting
>>>   - Misc. language cleanups
>>>
>>> Signed-off-by: Jason Ekstrand 
>>
>> Reviewed-by: Lionel Landwerlin 
>>
>>> ---
>>>   drivers/gpu/drm/drm_syncobj.c | 98 
>>> +++
>>>   1 file changed, 87 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_syncobj.c 
>>> b/drivers/gpu/drm/drm_syncobj.c
>>> index 1438dcb3ebb1..4b5c7b0ed714 100644
>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>> @@ -29,21 +29,97 @@
>>>   /**
>>>    * DOC: Overview
>>>    *
>>> - * DRM synchronisation objects (syncobj, see struct _syncobj) are
>>> - * persistent objects that contain an optional fence. The Ok,fence 
>>> can be updated
>>> - * with a new fence, or be NULL.
>>> + * DRM synchronisation objects (syncobj, see struct _syncobj) 
>>> provide a
>>> + * container for a synchronization primitive which can be used by 
>>> userspace
>>> + * to explicitly synchronize GPU commands, can be shared between 
>>> userspace
>>> + * processes, and can be shared between different DRM drivers.
>>> + * Their primary use-case is to implement Vulkan fences and 
>>> semaphores.
>>> + * The syncobj userspace API provides ioctls for several operations:
>>>    *
>>> - * syncobj's can be waited upon, where it will wait for the underlying
>>> - * fence.
>>> + *  - Creation and destruction of syncobjs
>>> + *  - Import and export of syncobjs to/from a syncobj file descriptor
>>> + *  - Import and export a syncobj's underlying fence to/from a sync 
>>> file
>>> + *  - Reset a syncobj (set its fence to NULL)
>>> + *  - Signal a syncobj (set a trivially signaled fence)
>>> + *  - Wait for a syncobj's fence to appear and be signaled
>>>    *
>>> - * syncobj's can be export to fd's and back, these fd's are opaque and
>>> - * have no other use case, except passing the syncobj between 
>>> processes.
>>> + * At it's core, a syncobj is simply a wrapper around a pointer to 
>>> a struct
>>> + * _fence which may be NULL.
>>> + * When a syncobj is first created, its pointer is either NULL or a 
>>> pointer
>>> + * to an already signaled fence depending on whether the
>>> + * _SYNCOBJ_CREATE_SIGNALED flag is passed to
>>> + * _IOCTL_SYNCOBJ_CREATE.
>>> + * When GPU work which signals a syncobj is enqueued in a DRM driver,
>>> + * the syncobj fence is replaced with a fence which will be 
>>> signaled by the
>>> + * completion of that work.
>>> + * When GPU work which waits on a syncobj is enqueued in a DRM 
>>> driver, the
>>> + * driver retrieves syncobj's current fence at the time the work is 
>>> enqueued
>>> + * waits on that fence before submitting the work to hardware.
>>> + * If the syncobj's fence is NULL, the enqueue operation is 
>>> expected to fail.
>>> + * All manipulation of the syncobjs's fence happens in terms of the 
>>> current
>>> + * fence at the time the ioctl is called by userspace regardless of 
>>> whether
>>> + * that operation is an immediate host-side operation (signal or 
>>> reset) or
>>> + * or an operation which is enqueued in some driver queue.
>>> + * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be 
>>> used to
>>> + * manipulate a syncobj from the host by resetting its pointer to 
>>> NULL or
>>> + * setting its pointer to a fence which is already signaled.
>>>    *
>>> - * Their primary use-case is to implement Vulkan fences and 
>>> semaphores.
>>>    *
>>> - * syncobj have a kref reference count, but also have an optional 
>>> file.
>>> - * The file is only created once the syncobj is exported.
>>> - * The file takes a reference on the kref.
>>> + * Host-side wait on syncobjs
>>> + * --
>>> + *
>>> + * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and 
>>> does a
>>> + * host-side wait on all of the syncobj fences simultaneously.
>>> + * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will 
>>> wait on
>>> + * all of the syncobj fences to be signaled before it returns.
>>> + * Otherwise, it returns once at least one syncobj fence has been 
>>> signaled
>>> + * and the index of a signaled fence is written back to the client.
>>> + *
>>> + * Unlike the enqueued GPU work dependencies which fail if they see 
>>> a NULL

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-07 Thread Jason Ekstrand

Christan, any thoughts on v2?

--Jason


On August 7, 2019 09:06:47 Lionel Landwerlin 
 wrote:



On 06/08/2019 19:19, Jason Ekstrand wrote:

This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.

v2: Incorporate feedback from Lionel and Christian:
  - Mention actual ioctl and flag names
  - Better language around reference counting
  - Misc. language cleanups

Signed-off-by: Jason Ekstrand 


Reviewed-by: Lionel Landwerlin 


---
  drivers/gpu/drm/drm_syncobj.c | 98 +++
  1 file changed, 87 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..4b5c7b0ed714 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,21 +29,97 @@
  /**
   * DOC: Overview
   *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * container for a synchronization primitive which can be used by userspace
+ * to explicitly synchronize GPU commands, can be shared between userspace
+ * processes, and can be shared between different DRM drivers.
+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
   *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait for a syncobj's fence to appear and be signaled
   *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj is simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When a syncobj is first created, its pointer is either NULL or a pointer
+ * to an already signaled fence depending on whether the
+ * _SYNCOBJ_CREATE_SIGNALED flag is passed to
+ * _IOCTL_SYNCOBJ_CREATE.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
+ * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be used to
+ * manipulate a syncobj from the host by resetting its pointer to NULL or
+ * setting its pointer to a fence which is already signaled.
   *
- * Their primary use-case is to implement Vulkan fences and semaphores.
   *
- * syncobj have a kref reference count, but also have an optional file.
- * The file is only created once the syncobj is exported.
- * The file takes a reference on the kref.
+ * Host-side wait on syncobjs
+ * --
+ *
+ * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and does a
+ * host-side wait on all of the syncobj fences simultaneously.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will wait on
+ * all of the syncobj fences to be signaled before it returns.
+ * Otherwise, it returns once at least one syncobj fence has been signaled
+ * and the index of a signaled fence is written back to the client.
+ *
+ * Unlike the enqueued GPU work dependencies which fail if they see a NULL
+ * fence in a syncobj, if _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
+ * the host-side wait will first wait for the syncobj to receive a non-NULL
+ * fence and then wait on that fence.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is not set and any one of the
+ * syncobjs in the array has a NULL fence, -EINVAL will be returned.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.
+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * _IOCTL_SYNCOBJ_FD_TO_HANDLE and 

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-07 Thread Lionel Landwerlin

On 06/08/2019 19:19, Jason Ekstrand wrote:

This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.

v2: Incorporate feedback from Lionel and Christian:
  - Mention actual ioctl and flag names
  - Better language around reference counting
  - Misc. language cleanups

Signed-off-by: Jason Ekstrand 


Reviewed-by: Lionel Landwerlin 


---
  drivers/gpu/drm/drm_syncobj.c | 98 +++
  1 file changed, 87 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..4b5c7b0ed714 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,21 +29,97 @@
  /**
   * DOC: Overview
   *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * container for a synchronization primitive which can be used by userspace
+ * to explicitly synchronize GPU commands, can be shared between userspace
+ * processes, and can be shared between different DRM drivers.
+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
   *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait for a syncobj's fence to appear and be signaled
   *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj is simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When a syncobj is first created, its pointer is either NULL or a pointer
+ * to an already signaled fence depending on whether the
+ * _SYNCOBJ_CREATE_SIGNALED flag is passed to
+ * _IOCTL_SYNCOBJ_CREATE.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
+ * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be used to
+ * manipulate a syncobj from the host by resetting its pointer to NULL or
+ * setting its pointer to a fence which is already signaled.
   *
- * Their primary use-case is to implement Vulkan fences and semaphores.
   *
- * syncobj have a kref reference count, but also have an optional file.
- * The file is only created once the syncobj is exported.
- * The file takes a reference on the kref.
+ * Host-side wait on syncobjs
+ * --
+ *
+ * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and does a
+ * host-side wait on all of the syncobj fences simultaneously.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will wait on
+ * all of the syncobj fences to be signaled before it returns.
+ * Otherwise, it returns once at least one syncobj fence has been signaled
+ * and the index of a signaled fence is written back to the client.
+ *
+ * Unlike the enqueued GPU work dependencies which fail if they see a NULL
+ * fence in a syncobj, if _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
+ * the host-side wait will first wait for the syncobj to receive a non-NULL
+ * fence and then wait on that fence.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is not set and any one of the
+ * syncobjs in the array has a NULL fence, -EINVAL will be returned.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.
+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * _IOCTL_SYNCOBJ_FD_TO_HANDLE and _IOCTL_SYNCOBJ_HANDLE_TO_FD
+ * provide two mechanisms for import/export of syncobjs.
+ *
+ * The first lets the client 

[PATCH] drm/syncobj: Add better overview documentation for syncobj (v2)

2019-08-06 Thread Jason Ekstrand
This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.

v2: Incorporate feedback from Lionel and Christian:
 - Mention actual ioctl and flag names
 - Better language around reference counting
 - Misc. language cleanups

Signed-off-by: Jason Ekstrand 
---
 drivers/gpu/drm/drm_syncobj.c | 98 +++
 1 file changed, 87 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..4b5c7b0ed714 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,21 +29,97 @@
 /**
  * DOC: Overview
  *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * container for a synchronization primitive which can be used by userspace
+ * to explicitly synchronize GPU commands, can be shared between userspace
+ * processes, and can be shared between different DRM drivers.
+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
  *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait for a syncobj's fence to appear and be signaled
  *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj is simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When a syncobj is first created, its pointer is either NULL or a pointer
+ * to an already signaled fence depending on whether the
+ * _SYNCOBJ_CREATE_SIGNALED flag is passed to
+ * _IOCTL_SYNCOBJ_CREATE.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
+ * _IOCTL_SYNCOBJ_RESET and _IOCTL_SYNCOBJ_SIGNAL can be used to
+ * manipulate a syncobj from the host by resetting its pointer to NULL or
+ * setting its pointer to a fence which is already signaled.
  *
- * Their primary use-case is to implement Vulkan fences and semaphores.
  *
- * syncobj have a kref reference count, but also have an optional file.
- * The file is only created once the syncobj is exported.
- * The file takes a reference on the kref.
+ * Host-side wait on syncobjs
+ * --
+ *
+ * _IOCTL_SYNCOBJ_WAIT takes an array of syncobj handles and does a
+ * host-side wait on all of the syncobj fences simultaneously.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_ALL is set, the wait ioctl will wait on
+ * all of the syncobj fences to be signaled before it returns.
+ * Otherwise, it returns once at least one syncobj fence has been signaled
+ * and the index of a signaled fence is written back to the client.
+ *
+ * Unlike the enqueued GPU work dependencies which fail if they see a NULL
+ * fence in a syncobj, if _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is set,
+ * the host-side wait will first wait for the syncobj to receive a non-NULL
+ * fence and then wait on that fence.
+ * If _SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT is not set and any one of the
+ * syncobjs in the array has a NULL fence, -EINVAL will be returned.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.
+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * _IOCTL_SYNCOBJ_FD_TO_HANDLE and _IOCTL_SYNCOBJ_HANDLE_TO_FD
+ * provide two mechanisms for import/export of syncobjs.
+ *
+ * The first lets the client import or export an entire syncobj to a file
+ * descriptor.
+ * These fd's are opaque and 

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj

2019-08-06 Thread Koenig, Christian
I somehow totally missed that patch, looks like it maybe ended up in the spam 
folder.

Am 05.08.19 um 19:01 schrieb Jason Ekstrand:

On Sat, Aug 3, 2019 at 3:19 AM Lionel Landwerlin 
mailto:lionel.g.landwer...@intel.com>> wrote:
Thanks a lot for writing this :)
I now have a canvas to add stuff on!

Just a couple of questions below.

-Lionel

On 02/08/2019 20:40, Jason Ekstrand wrote:
> This patch only brings the syncobj documentation up-to-date for the
> original form of syncobj.  It does not contain any information about the
> design of timeline syncobjs.
> ---
>   drivers/gpu/drm/drm_syncobj.c | 81 +++
>   1 file changed, 73 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index 1438dcb3ebb1..03cc888744fb 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -29,17 +29,82 @@
>   /**
>* DOC: Overview
>*
> - * DRM synchronisation objects (syncobj, see struct _syncobj) are
> - * persistent objects that contain an optional fence. The fence can be 
> updated
> - * with a new fence, or be NULL.
> + * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
> + * synchronization primitive which can be used by userspace to explicitly
> + * synchronize GPU commands, can be shared between userspace processes, and
> + * can be shared between different DRM drivers.


I've been wondering whether we should call it a container for a
synchronization primitive rather than a primitive itself.

Sync files are also a container, just we fewer features (no host
operations).

It's not really important :)

That's a fun philosophical question and I think the answer entirely depends on 
which side of the ioctl you're on. :-)

Yeah, but this is kernel documentation, not userspace documentation. So I agree 
that syncobjs are just a container inside the kernel.


> + * Their primary use-case is to implement Vulkan fences and semaphores.
> + * The syncobj userspace API provides ioctls for several operations:
>*
> - * syncobj's can be waited upon, where it will wait for the underlying
> - * fence.
> + *  - Creation and destruction of syncobjs
> + *  - Import and export of syncobjs to/from a syncobj file descriptor
> + *  - Import and export a syncobj's underlying fence to/from a sync file
> + *  - Reset a syncobj (set its fence to NULL)
> + *  - Signal a syncobj (set a trivially signaled fence)
> + *  - Wait a syncobj's fence to be signaled

Wait for a fence to appear.

>*
> - * syncobj's can be export to fd's and back, these fd's are opaque and
> - * have no other use case, except passing the syncobj between processes.
> + * At it's core, a syncobj simply a wrapper around a pointer to a struct
> + * _fence which may be NULL.
> + * When GPU work which signals a syncobj is enqueued in a DRM driver,
> + * the syncobj fence is replaced with a fence which will be signaled by the
> + * completion of that work.
> + * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
> + * driver retrieves syncobj's current fence at the time the work is enqueued
> + * waits on that fence before submitting the work to hardware.
> + * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
> + * All manipulation of the syncobjs's fence happens in terms of the current
> + * fence at the time the ioctl is called by userspace regardless of whether
> + * that operation is an immediate host-side operation (signal or reset) or
> + * or an operation which is enqueued in some driver queue.
>*
> - * Their primary use-case is to implement Vulkan fences and semaphores.


Maybe add a line about creation (and its signaled flag)?

Sure, I'll also make a comment about reset and signal.

> + *
> + * Host-side wait on syncobjs
> + * --
> + *
> + * The userspace syncobj API provides an ioctl for waiting on a set of
> + * syncobjs.
> + * The wait ioctl takes an array of syncobj handles and a flag indicating
> + * whether it should return immediately once one syncobj has been signaled
> + * or if it should wait for all the syncobjs to be signaled.
> + * Unlike the enqueued GPU work dependencies, the host-side wait ioctl
> + * will also optionally wait for the syncobj to first receive a fence and
> + * then wait on that fence.
> + * Assuming the syncobj starts off with a NULL fence, this allows a client
> + * to do a host wait in one thread (or process) which waits on GPU work
> + * submitted in another thread (or process) without having to manually
> + * synchronize between the two.
> + * This requirement is inherited from the Vulkan fence API.


Should we list the flags & ioctl names?

I don't know.  Maybe Dave or Daniel can tell me how these things are usually 
done?

You could & reference the enum/defines of the IOCTL numbers in the first 
sentence or something like this.


> + *
> + *
> + * Import/export of syncobjs
> + * -
> + *

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj

2019-08-05 Thread Jason Ekstrand
On Sat, Aug 3, 2019 at 3:19 AM Lionel Landwerlin <
lionel.g.landwer...@intel.com> wrote:

> Thanks a lot for writing this :)
> I now have a canvas to add stuff on!
>
> Just a couple of questions below.
>
> -Lionel
>
> On 02/08/2019 20:40, Jason Ekstrand wrote:
> > This patch only brings the syncobj documentation up-to-date for the
> > original form of syncobj.  It does not contain any information about the
> > design of timeline syncobjs.
> > ---
> >   drivers/gpu/drm/drm_syncobj.c | 81 +++
> >   1 file changed, 73 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/drm_syncobj.c
> b/drivers/gpu/drm/drm_syncobj.c
> > index 1438dcb3ebb1..03cc888744fb 100644
> > --- a/drivers/gpu/drm/drm_syncobj.c
> > +++ b/drivers/gpu/drm/drm_syncobj.c
> > @@ -29,17 +29,82 @@
> >   /**
> >* DOC: Overview
> >*
> > - * DRM synchronisation objects (syncobj, see struct _syncobj) are
> > - * persistent objects that contain an optional fence. The fence can be
> updated
> > - * with a new fence, or be NULL.
> > + * DRM synchronisation objects (syncobj, see struct _syncobj)
> provide a
> > + * synchronization primitive which can be used by userspace to
> explicitly
> > + * synchronize GPU commands, can be shared between userspace processes,
> and
> > + * can be shared between different DRM drivers.
>
>
> I've been wondering whether we should call it a container for a
> synchronization primitive rather than a primitive itself.
>
> Sync files are also a container, just we fewer features (no host
> operations).
>
> It's not really important :)
>

That's a fun philosophical question and I think the answer entirely depends
on which side of the ioctl you're on. :-)


> > + * Their primary use-case is to implement Vulkan fences and semaphores.
> > + * The syncobj userspace API provides ioctls for several operations:
> >*
> > - * syncobj's can be waited upon, where it will wait for the underlying
> > - * fence.
> > + *  - Creation and destruction of syncobjs
> > + *  - Import and export of syncobjs to/from a syncobj file descriptor
> > + *  - Import and export a syncobj's underlying fence to/from a sync file
> > + *  - Reset a syncobj (set its fence to NULL)
> > + *  - Signal a syncobj (set a trivially signaled fence)
> > + *  - Wait a syncobj's fence to be signaled
> >*
> > - * syncobj's can be export to fd's and back, these fd's are opaque and
> > - * have no other use case, except passing the syncobj between processes.
> > + * At it's core, a syncobj simply a wrapper around a pointer to a struct
> > + * _fence which may be NULL.
> > + * When GPU work which signals a syncobj is enqueued in a DRM driver,
> > + * the syncobj fence is replaced with a fence which will be signaled by
> the
> > + * completion of that work.
> > + * When GPU work which waits on a syncobj is enqueued in a DRM driver,
> the
> > + * driver retrieves syncobj's current fence at the time the work is
> enqueued
> > + * waits on that fence before submitting the work to hardware.
> > + * If the syncobj's fence is NULL, the enqueue operation is expected to
> fail.
> > + * All manipulation of the syncobjs's fence happens in terms of the
> current
> > + * fence at the time the ioctl is called by userspace regardless of
> whether
> > + * that operation is an immediate host-side operation (signal or reset)
> or
> > + * or an operation which is enqueued in some driver queue.
> >*
> > - * Their primary use-case is to implement Vulkan fences and semaphores.
>
>
> Maybe add a line about creation (and its signaled flag)?
>

Sure, I'll also make a comment about reset and signal.


> > + *
> > + * Host-side wait on syncobjs
> > + * --
> > + *
> > + * The userspace syncobj API provides an ioctl for waiting on a set of
> > + * syncobjs.
> > + * The wait ioctl takes an array of syncobj handles and a flag
> indicating
> > + * whether it should return immediately once one syncobj has been
> signaled
> > + * or if it should wait for all the syncobjs to be signaled.
> > + * Unlike the enqueued GPU work dependencies, the host-side wait ioctl
> > + * will also optionally wait for the syncobj to first receive a fence
> and
> > + * then wait on that fence.
> > + * Assuming the syncobj starts off with a NULL fence, this allows a
> client
> > + * to do a host wait in one thread (or process) which waits on GPU work
> > + * submitted in another thread (or process) without having to manually
> > + * synchronize between the two.
> > + * This requirement is inherited from the Vulkan fence API.
>
>
> Should we list the flags & ioctl names?
>

I don't know.  Maybe Dave or Daniel can tell me how these things are
usually done?


> > + *
> > + *
> > + * Import/export of syncobjs
> > + * -
> > + *
> > + * The userspace syncobj API provides two mechanisms for import/export
> of
> > + * syncobjs.
> > + *
> > + * The first lets the client import or export an entire syncobj to a
> file
> > + * 

Re: [PATCH] drm/syncobj: Add better overview documentation for syncobj

2019-08-03 Thread Lionel Landwerlin

Thanks a lot for writing this :)
I now have a canvas to add stuff on!

Just a couple of questions below.

-Lionel

On 02/08/2019 20:40, Jason Ekstrand wrote:

This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.
---
  drivers/gpu/drm/drm_syncobj.c | 81 +++
  1 file changed, 73 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..03cc888744fb 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,17 +29,82 @@
  /**
   * DOC: Overview
   *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * synchronization primitive which can be used by userspace to explicitly
+ * synchronize GPU commands, can be shared between userspace processes, and
+ * can be shared between different DRM drivers.



I've been wondering whether we should call it a container for a 
synchronization primitive rather than a primitive itself.


Sync files are also a container, just we fewer features (no host 
operations).


It's not really important :)



+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
   *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait a syncobj's fence to be signaled
   *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
   *
- * Their primary use-case is to implement Vulkan fences and semaphores.



Maybe add a line about creation (and its signaled flag)?



+ *
+ * Host-side wait on syncobjs
+ * --
+ *
+ * The userspace syncobj API provides an ioctl for waiting on a set of
+ * syncobjs.
+ * The wait ioctl takes an array of syncobj handles and a flag indicating
+ * whether it should return immediately once one syncobj has been signaled
+ * or if it should wait for all the syncobjs to be signaled.
+ * Unlike the enqueued GPU work dependencies, the host-side wait ioctl
+ * will also optionally wait for the syncobj to first receive a fence and
+ * then wait on that fence.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.



Should we list the flags & ioctl names?



+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * The userspace syncobj API provides two mechanisms for import/export of
+ * syncobjs.
+ *
+ * The first lets the client import or export an entire syncobj to a file
+ * descriptor.
+ * These fd's are opaque and have no other use case, except passing the
+ * syncobj between processes.
+ * All syncobj handles which are created as the result of such an import
+ * operation refer to the same underlying syncobj as was used for the
+ * export and the syncobj can be used persistently across all the processes
+ * with which it is shared.
+ * Unlike dma-buf, importing a syncobj creates a new handle for every
+ * import instead of de-duplicating.
+ * The primary use-case of this persistent import/export is for shared
+ * Vulkan fences and semaphores.
+ *
+ * The second import/export mechanism lets the client export the syncobj's
+ * current fence to/from a _file.
+ * When a syncobj is exported 

[PATCH] drm/syncobj: Add better overview documentation for syncobj

2019-08-02 Thread Jason Ekstrand
This patch only brings the syncobj documentation up-to-date for the
original form of syncobj.  It does not contain any information about the
design of timeline syncobjs.
---
 drivers/gpu/drm/drm_syncobj.c | 81 +++
 1 file changed, 73 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1438dcb3ebb1..03cc888744fb 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -29,17 +29,82 @@
 /**
  * DOC: Overview
  *
- * DRM synchronisation objects (syncobj, see struct _syncobj) are
- * persistent objects that contain an optional fence. The fence can be updated
- * with a new fence, or be NULL.
+ * DRM synchronisation objects (syncobj, see struct _syncobj) provide a
+ * synchronization primitive which can be used by userspace to explicitly
+ * synchronize GPU commands, can be shared between userspace processes, and
+ * can be shared between different DRM drivers.
+ * Their primary use-case is to implement Vulkan fences and semaphores.
+ * The syncobj userspace API provides ioctls for several operations:
  *
- * syncobj's can be waited upon, where it will wait for the underlying
- * fence.
+ *  - Creation and destruction of syncobjs
+ *  - Import and export of syncobjs to/from a syncobj file descriptor
+ *  - Import and export a syncobj's underlying fence to/from a sync file
+ *  - Reset a syncobj (set its fence to NULL)
+ *  - Signal a syncobj (set a trivially signaled fence)
+ *  - Wait a syncobj's fence to be signaled
  *
- * syncobj's can be export to fd's and back, these fd's are opaque and
- * have no other use case, except passing the syncobj between processes.
+ * At it's core, a syncobj simply a wrapper around a pointer to a struct
+ * _fence which may be NULL.
+ * When GPU work which signals a syncobj is enqueued in a DRM driver,
+ * the syncobj fence is replaced with a fence which will be signaled by the
+ * completion of that work.
+ * When GPU work which waits on a syncobj is enqueued in a DRM driver, the
+ * driver retrieves syncobj's current fence at the time the work is enqueued
+ * waits on that fence before submitting the work to hardware.
+ * If the syncobj's fence is NULL, the enqueue operation is expected to fail.
+ * All manipulation of the syncobjs's fence happens in terms of the current
+ * fence at the time the ioctl is called by userspace regardless of whether
+ * that operation is an immediate host-side operation (signal or reset) or
+ * or an operation which is enqueued in some driver queue.
  *
- * Their primary use-case is to implement Vulkan fences and semaphores.
+ *
+ * Host-side wait on syncobjs
+ * --
+ *
+ * The userspace syncobj API provides an ioctl for waiting on a set of
+ * syncobjs.
+ * The wait ioctl takes an array of syncobj handles and a flag indicating
+ * whether it should return immediately once one syncobj has been signaled
+ * or if it should wait for all the syncobjs to be signaled.
+ * Unlike the enqueued GPU work dependencies, the host-side wait ioctl
+ * will also optionally wait for the syncobj to first receive a fence and
+ * then wait on that fence.
+ * Assuming the syncobj starts off with a NULL fence, this allows a client
+ * to do a host wait in one thread (or process) which waits on GPU work
+ * submitted in another thread (or process) without having to manually
+ * synchronize between the two.
+ * This requirement is inherited from the Vulkan fence API.
+ *
+ *
+ * Import/export of syncobjs
+ * -
+ *
+ * The userspace syncobj API provides two mechanisms for import/export of
+ * syncobjs.
+ *
+ * The first lets the client import or export an entire syncobj to a file
+ * descriptor.
+ * These fd's are opaque and have no other use case, except passing the
+ * syncobj between processes.
+ * All syncobj handles which are created as the result of such an import
+ * operation refer to the same underlying syncobj as was used for the
+ * export and the syncobj can be used persistently across all the processes
+ * with which it is shared.
+ * Unlike dma-buf, importing a syncobj creates a new handle for every
+ * import instead of de-duplicating.
+ * The primary use-case of this persistent import/export is for shared
+ * Vulkan fences and semaphores.
+ *
+ * The second import/export mechanism lets the client export the syncobj's
+ * current fence to/from a _file.
+ * When a syncobj is exported to a sync file, that sync file wraps the
+ * sycnobj's fence at the time of export and any later signal or reset
+ * operations on the syncobj will not affect the exported sync file.
+ * When a sync file is imported into a syncobj, the syncobj's fence is set
+ * to the fence wrapped by that sync file.
+ * Because sync files are immutable, resetting or signaling the syncobj
+ * will not affect any sync files whose fences have been imported into the
+ * syncobj.
  *
  * syncobj have a kref reference count, but