Skip to content

Commit

Permalink
drm/msm: Add MSM_SUBMIT_FENCE_SN_IN
Browse files Browse the repository at this point in the history
Add a way for userspace to specify the sequence number fence used to
track completion of the submit.  As the seqno fence is simply an
incrementing counter which is local to the submitqueue, it is easy for
userspace to know the next value.

This is useful for native userspace drivers in a vm guest, as the guest
to host roundtrip can have high latency.  Assigning the fence seqno in
the guest userspace allows the guest to continue without waiting for
response from the host.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20220224222321.60653-1-robdclark@gmail.com
  • Loading branch information
Rob Clark committed Mar 5, 2022
1 parent 5f9ffe8 commit 17154ad
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 8 deletions.
3 changes: 2 additions & 1 deletion drivers/gpu/drm/msm/msm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@
* - 1.6.0 - Syncobj support
* - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count
* - 1.8.0 - Add MSM_BO_CACHED_COHERENT for supported GPUs (a6xx)
* - 1.9.0 - Add MSM_SUBMIT_FENCE_SN_IN
*/
#define MSM_VERSION_MAJOR 1
#define MSM_VERSION_MINOR 8
#define MSM_VERSION_MINOR 9
#define MSM_VERSION_PATCHLEVEL 0

static const struct drm_mode_config_funcs mode_config_funcs = {
Expand Down
42 changes: 36 additions & 6 deletions drivers/gpu/drm/msm/msm_gem_submit.c
Original file line number Diff line number Diff line change
Expand Up @@ -872,16 +872,46 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,

submit->nr_cmds = i;

/*
* If using userspace provided seqno fence, validate that the id
* is available before arming sched job. Since access to fence_idr
* is serialized on the queue lock, the slot should be still avail
* after the job is armed
*/
if ((args->flags & MSM_SUBMIT_FENCE_SN_IN) &&
idr_find(&queue->fence_idr, args->fence)) {
ret = -EINVAL;
goto out;
}

drm_sched_job_arm(&submit->base);

submit->user_fence = dma_fence_get(&submit->base.s_fence->finished);

/*
* Allocate an id which can be used by WAIT_FENCE ioctl to map back
* to the underlying fence.
*/
submit->fence_id = idr_alloc_cyclic(&queue->fence_idr,
submit->user_fence, 1, INT_MAX, GFP_KERNEL);
if (args->flags & MSM_SUBMIT_FENCE_SN_IN) {
/*
* Userspace has assigned the seqno fence that it wants
* us to use. It is an error to pick a fence sequence
* number that is not available.
*/
submit->fence_id = args->fence;
ret = idr_alloc_u32(&queue->fence_idr, submit->user_fence,
&submit->fence_id, submit->fence_id,
GFP_KERNEL);
/*
* We've already validated that the fence_id slot is valid,
* so if idr_alloc_u32 failed, it is a kernel bug
*/
WARN_ON(ret);
} else {
/*
* Allocate an id which can be used by WAIT_FENCE ioctl to map
* back to the underlying fence.
*/
submit->fence_id = idr_alloc_cyclic(&queue->fence_idr,
submit->user_fence, 1,
INT_MAX, GFP_KERNEL);
}
if (submit->fence_id < 0) {
ret = submit->fence_id = 0;
submit->fence_id = 0;
Expand Down
4 changes: 3 additions & 1 deletion include/uapi/drm/msm_drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,13 +232,15 @@ struct drm_msm_gem_submit_bo {
#define MSM_SUBMIT_SUDO 0x10000000 /* run submitted cmds from RB */
#define MSM_SUBMIT_SYNCOBJ_IN 0x08000000 /* enable input syncobj */
#define MSM_SUBMIT_SYNCOBJ_OUT 0x04000000 /* enable output syncobj */
#define MSM_SUBMIT_FENCE_SN_IN 0x02000000 /* userspace passes in seqno fence */
#define MSM_SUBMIT_FLAGS ( \
MSM_SUBMIT_NO_IMPLICIT | \
MSM_SUBMIT_FENCE_FD_IN | \
MSM_SUBMIT_FENCE_FD_OUT | \
MSM_SUBMIT_SUDO | \
MSM_SUBMIT_SYNCOBJ_IN | \
MSM_SUBMIT_SYNCOBJ_OUT | \
MSM_SUBMIT_FENCE_SN_IN | \
0)

#define MSM_SUBMIT_SYNCOBJ_RESET 0x00000001 /* Reset syncobj after wait. */
Expand All @@ -258,7 +260,7 @@ struct drm_msm_gem_submit_syncobj {
*/
struct drm_msm_gem_submit {
__u32 flags; /* MSM_PIPE_x | MSM_SUBMIT_x */
__u32 fence; /* out */
__u32 fence; /* out (or in with MSM_SUBMIT_FENCE_SN_IN flag) */
__u32 nr_bos; /* in, number of submit_bo's */
__u32 nr_cmds; /* in, number of submit_cmd's */
__u64 bos; /* in, ptr to array of submit_bo's */
Expand Down

0 comments on commit 17154ad

Please sign in to comment.