gpu: nvgpu: add dup to os fence ops

The os fences can currently be constructed from a file descriptor, from
a raw syncpt id/value pair, or a struct nvgpu_semaphore. Each os fence
object has exactly one owner for simplicity as the owner is a wrapper
for a refcounted object. This does not allow copying the fences, so
extend struct nvgpu_os_fence_ops with a member to increment the refcount
of the underlying fence. This can be used to "duplicate" the object. The
copy needs an eventual call to ops->drop_ref() to release the refcount.

This will be useful to decouple the features of struct nvgpu_fence_type
needed in the kernel and those needed for userspace.

Jira NVGPU-5248

Change-Id: Ie7b943f0851f62842e941a7283b389bac84ae9ae
Signed-off-by: Konsta Hölttä <kholtta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2359063
Reviewed-by: automaticguardword <automaticguardword@nvidia.com>
Reviewed-by: Alex Waterman <alexw@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Konsta Hölttä
2020-06-10 21:01:15 +03:00
committed by Alex Waterman
parent 9a93dc3c83
commit 8c224adb91
8 changed files with 30 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ void nvgpu_os_fence_android_drop_ref(struct nvgpu_os_fence *s);
int nvgpu_os_fence_sema_fdget(struct nvgpu_os_fence *fence_out,
struct nvgpu_channel *c, int fd);
void nvgpu_os_fence_android_dup(struct nvgpu_os_fence *s);
int nvgpu_os_fence_android_install_fd(struct nvgpu_os_fence *s, int fd);
int nvgpu_os_fence_syncpt_fdget(

View File

@@ -30,6 +30,7 @@ int nvgpu_os_fence_sema_fdget(struct nvgpu_os_fence *fence_out,
struct nvgpu_channel *c, int fd);
int nvgpu_os_fence_dma_install_fd(struct nvgpu_os_fence *s, int fd);
void nvgpu_os_fence_dma_dup(struct nvgpu_os_fence *s);
int nvgpu_os_fence_syncpt_fdget(struct nvgpu_os_fence *fence_out,
struct nvgpu_channel *c, int fd);

View File

@@ -59,6 +59,12 @@ struct nvgpu_os_fence_ops {
* implementation varies from OS to OS.
*/
int (*install_fence)(struct nvgpu_os_fence *s, int fd);
/*
* Increment a refcount of the underlying sync object. After this the
* struct nvgpu_os_fence object can be copied once. This call must be
* matched with a drop_ref as usual.
*/
void (*dup)(struct nvgpu_os_fence *s);
};
/*

View File

@@ -49,6 +49,13 @@ int nvgpu_os_fence_android_install_fd(struct nvgpu_os_fence *s, int fd)
return 0;
}
void nvgpu_os_fence_android_dup(struct nvgpu_os_fence *s)
{
struct sync_fence *fence = nvgpu_get_sync_fence(s);
sync_fence_get(fence);
}
int nvgpu_os_fence_fdget(struct nvgpu_os_fence *fence_out,
struct nvgpu_channel *c, int fd)
{

View File

@@ -33,6 +33,7 @@
static const struct nvgpu_os_fence_ops sema_ops = {
.drop_ref = nvgpu_os_fence_android_drop_ref,
.install_fence = nvgpu_os_fence_android_install_fd,
.dup = nvgpu_os_fence_android_dup,
};
int nvgpu_os_fence_get_semas(struct nvgpu_os_fence_sema *fence_sema_out,

View File

@@ -53,6 +53,13 @@ int nvgpu_os_fence_dma_install_fd(struct nvgpu_os_fence *s, int fd)
return 0;
}
void nvgpu_os_fence_dma_dup(struct nvgpu_os_fence *s)
{
struct dma_fence *fence = nvgpu_get_dma_fence(s);
dma_fence_get(fence);
}
int nvgpu_os_fence_fdget(struct nvgpu_os_fence *fence_out,
struct nvgpu_channel *c, int fd)
{

View File

@@ -29,6 +29,7 @@
static const struct nvgpu_os_fence_ops sema_ops = {
.drop_ref = nvgpu_os_fence_dma_drop_ref,
.install_fence = nvgpu_os_fence_dma_install_fd,
.dup = nvgpu_os_fence_dma_dup,
};
int nvgpu_os_fence_get_semas(struct nvgpu_os_fence_sema *fence_sema_out,

View File

@@ -44,9 +44,15 @@ static void nvgpu_os_fence_syncpt_drop_ref(struct nvgpu_os_fence *s)
nvgpu_os_fence_clear(s);
}
static void nvgpu_os_fence_syncpt_dup(struct nvgpu_os_fence *s)
{
nvhost_fence_dup(s->priv);
}
static const struct nvgpu_os_fence_ops syncpt_ops = {
.drop_ref = nvgpu_os_fence_syncpt_drop_ref,
.install_fence = nvgpu_os_fence_syncpt_install_fd,
.dup = nvgpu_os_fence_syncpt_dup,
};
int nvgpu_os_fence_syncpt_create(struct nvgpu_os_fence *fence_out,