<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<br>
<br>
<div class="moz-cite-prefix">On 5/1/2022 12:59 AM, Christian König
wrote:<br>
</div>
<blockquote type="cite" cite="mid:85927512-377e-39b1-d812-ef9bddcc2f02@gmail.com">Am
30.04.22 um 17:14 schrieb Arunpravin Paneer Selvam:
<br>
<blockquote type="cite">- Add pipe and queue as out parameters to
support high priority
<br>
queue test enabled in libdrm basic test suite.
<br>
<br>
- Fetch amdgpu_ring pointer and pass sched info to userspace
<br>
<br>
- Improve amdgpu_sched_ioctl() function
<br>
<br>
The related merge request for enabling high priority test case
are
<br>
libdrm -
<a class="moz-txt-link-freetext" href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.freedesktop.org%2Fmesa%2Fdrm%2F-%2Fmerge_requests%2F235&data=05%7C01%7CArunpravin.PaneerSelvam%40amd.com%7Ce7a876029be4439b742808da2adfb82a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637869437601696844%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=jXIBtdA4seXl%2BYKsY2SDu%2B9tPoH6tfvUUXIRl4IosJc%3D&reserved=0">https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.freedesktop.org%2Fmesa%2Fdrm%2F-%2Fmerge_requests%2F235&data=05%7C01%7CArunpravin.PaneerSelvam%40amd.com%7Ce7a876029be4439b742808da2adfb82a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637869437601696844%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=jXIBtdA4seXl%2BYKsY2SDu%2B9tPoH6tfvUUXIRl4IosJc%3D&reserved=0</a><br>
mesa -
<a class="moz-txt-link-freetext" href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.freedesktop.org%2Fmesa%2Fmesa%2F-%2Fmerge_requests%2F16262&data=05%7C01%7CArunpravin.PaneerSelvam%40amd.com%7Ce7a876029be4439b742808da2adfb82a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637869437601696844%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=%2F%2FwMJ86SXxP7K9STA%2B1x5rox1F5CPEy3JIhFMCjqwiY%3D&reserved=0">https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.freedesktop.org%2Fmesa%2Fmesa%2F-%2Fmerge_requests%2F16262&data=05%7C01%7CArunpravin.PaneerSelvam%40amd.com%7Ce7a876029be4439b742808da2adfb82a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637869437601696844%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=%2F%2FwMJ86SXxP7K9STA%2B1x5rox1F5CPEy3JIhFMCjqwiY%3D&reserved=0</a><br>
<br>
Signed-off-by: Arunpravin Paneer Selvam
<a class="moz-txt-link-rfc2396E" href="mailto:Arunpravin.PaneerSelvam@amd.com"><Arunpravin.PaneerSelvam@amd.com></a>
<br>
</blockquote>
<br>
Well that is certainly a NAK since as far as I can see this breaks
the UAPI in a not backward compatible way.
<br>
<br>
Then we absolutely should not pass scheduler info to userspace.
That should be completely transparent to userspace.
<br>
<br>
So can you summarize once more why that should be necessary?<br>
</blockquote>
I added a new test case named high priority queue test in libdrm
basic test suite to validate the kernel feature patch named<br>
<span style="mso-spacerun:yes"></span>high priority gfx pipe. In the
test case, we
are creating a context and overriding the
priority as HIGH, submitting a simple NOP<br>
command to test the job scheduled on high priority pipe /
queue. This we have manually verified using the sysfs entry<br>
amdgpu_fence_info
where fence signaled on
gfx high priority pipe (gfx_0.1.0). To ensure this in a unit test
case, we
require<br>
pipe and queue info.<br>
<br>
Thanks,<br>
Arun<br>
<blockquote type="cite" cite="mid:85927512-377e-39b1-d812-ef9bddcc2f02@gmail.com">
<br>
Regards,
<br>
Christian.
<br>
<br>
<blockquote type="cite">---
<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 114
++++++++--------------
<br>
include/uapi/drm/amdgpu_drm.h | 14 ++-
<br>
2 files changed, 53 insertions(+), 75 deletions(-)
<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
<br>
index e9b45089a28a..fc2864b612d9 100644
<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
<br>
@@ -32,106 +32,72 @@
<br>
#include "amdgpu_sched.h"
<br>
#include "amdgpu_vm.h"
<br>
-static int amdgpu_sched_process_priority_override(struct
amdgpu_device *adev,
<br>
- int fd,
<br>
- int32_t priority)
<br>
+int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
<br>
+ struct drm_file *filp)
<br>
{
<br>
- struct fd f = fdget(fd);
<br>
+ union drm_amdgpu_sched *args = data;
<br>
+ struct amdgpu_ctx *ctx, *ctx_ptr;
<br>
+ struct drm_sched_entity *entity;
<br>
struct amdgpu_fpriv *fpriv;
<br>
- struct amdgpu_ctx *ctx;
<br>
- uint32_t id;
<br>
- int r;
<br>
-
<br>
- if (!f.file)
<br>
- return -EINVAL;
<br>
-
<br>
- r = amdgpu_file_to_fpriv(f.file, &fpriv);
<br>
- if (r) {
<br>
- fdput(f);
<br>
- return r;
<br>
- }
<br>
-
<br>
- idr_for_each_entry(&fpriv->ctx_mgr.ctx_handles, ctx,
id)
<br>
- amdgpu_ctx_priority_override(ctx, priority);
<br>
-
<br>
- fdput(f);
<br>
- return 0;
<br>
-}
<br>
-
<br>
-static int amdgpu_sched_context_priority_override(struct
amdgpu_device *adev,
<br>
- int fd,
<br>
- unsigned ctx_id,
<br>
- int32_t priority)
<br>
-{
<br>
+ struct amdgpu_ring *ring;
<br>
+ u32 fd = args->in.fd;
<br>
struct fd f = fdget(fd);
<br>
- struct amdgpu_fpriv *fpriv;
<br>
- struct amdgpu_ctx *ctx;
<br>
+ u32 id;
<br>
int r;
<br>
if (!f.file)
<br>
return -EINVAL;
<br>
r = amdgpu_file_to_fpriv(f.file, &fpriv);
<br>
- if (r) {
<br>
- fdput(f);
<br>
- return r;
<br>
- }
<br>
+ if (r)
<br>
+ goto out_fd;
<br>
- ctx = amdgpu_ctx_get(fpriv, ctx_id);
<br>
+ ctx = amdgpu_ctx_get(fpriv, args->in.ctx_id);
<br>
if (!ctx) {
<br>
- fdput(f);
<br>
- return -EINVAL;
<br>
- }
<br>
-
<br>
- amdgpu_ctx_priority_override(ctx, priority);
<br>
- amdgpu_ctx_put(ctx);
<br>
- fdput(f);
<br>
-
<br>
- return 0;
<br>
-}
<br>
-
<br>
-int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
<br>
- struct drm_file *filp)
<br>
-{
<br>
- union drm_amdgpu_sched *args = data;
<br>
- struct amdgpu_device *adev = drm_to_adev(dev);
<br>
- int r;
<br>
-
<br>
- /* First check the op, then the op's argument.
<br>
- */
<br>
- switch (args->in.op) {
<br>
- case AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE:
<br>
- case AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE:
<br>
- break;
<br>
- default:
<br>
- DRM_ERROR("Invalid sched op specified: %d\n",
args->in.op);
<br>
- return -EINVAL;
<br>
+ r = -EINVAL;
<br>
+ goto out_fd;
<br>
}
<br>
if (!amdgpu_ctx_priority_is_valid(args->in.priority))
{
<br>
WARN(1, "Invalid context priority %d\n",
args->in.priority);
<br>
- return -EINVAL;
<br>
+ r = -EINVAL;
<br>
+ goto out_ctx;
<br>
}
<br>
switch (args->in.op) {
<br>
case AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE:
<br>
- r = amdgpu_sched_process_priority_override(adev,
<br>
- args->in.fd,
<br>
- args->in.priority);
<br>
+ /* Retrieve all ctx handles and override priority */
<br>
+ idr_for_each_entry(&fpriv->ctx_mgr.ctx_handles,
ctx_ptr, id)
<br>
+ amdgpu_ctx_priority_override(ctx_ptr,
args->in.priority);
<br>
break;
<br>
case AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE:
<br>
- r = amdgpu_sched_context_priority_override(adev,
<br>
- args->in.fd,
<br>
- args->in.ctx_id,
<br>
- args->in.priority);
<br>
+ /* Override priority for a given context */
<br>
+ amdgpu_ctx_priority_override(ctx,
args->in.priority);
<br>
break;
<br>
default:
<br>
- /* Impossible.
<br>
- */
<br>
+ DRM_ERROR("Invalid sched op specified: %d\n",
args->in.op);
<br>
r = -EINVAL;
<br>
- break;
<br>
+ goto out_ctx;
<br>
}
<br>
+ r = amdgpu_ctx_get_entity(ctx, args->in.ip_type, 0,
args->in.ring,
<br>
+ &entity);
<br>
+ if (r)
<br>
+ goto out_ctx;
<br>
+
<br>
+ /* Fetch amdgpu_ring pointer */
<br>
+ ring = to_amdgpu_ring(entity->rq->sched);
<br>
+
<br>
+ /* Pass sched info to userspace */
<br>
+ memset(args, 0, sizeof(*args));
<br>
+ args->out.info.pipe = ring->pipe;
<br>
+ args->out.info.queue = ring->queue;
<br>
+
<br>
+out_ctx:
<br>
+ amdgpu_ctx_put(ctx);
<br>
+out_fd:
<br>
+ fdput(f);
<br>
+
<br>
return r;
<br>
}
<br>
diff --git a/include/uapi/drm/amdgpu_drm.h
b/include/uapi/drm/amdgpu_drm.h
<br>
index 1d65c1fbc4ec..e93f1b6c4561 100644
<br>
--- a/include/uapi/drm/amdgpu_drm.h
<br>
+++ b/include/uapi/drm/amdgpu_drm.h
<br>
@@ -70,7 +70,7 @@ extern "C" {
<br>
#define DRM_IOCTL_AMDGPU_WAIT_FENCES
DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_FENCES, union
drm_amdgpu_wait_fences)
<br>
#define DRM_IOCTL_AMDGPU_VM DRM_IOWR(DRM_COMMAND_BASE +
DRM_AMDGPU_VM, union drm_amdgpu_vm)
<br>
#define DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE
DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_FENCE_TO_HANDLE, union
drm_amdgpu_fence_to_handle)
<br>
-#define DRM_IOCTL_AMDGPU_SCHED DRM_IOW(DRM_COMMAND_BASE
+ DRM_AMDGPU_SCHED, union drm_amdgpu_sched)
<br>
+#define DRM_IOCTL_AMDGPU_SCHED DRM_IOWR(DRM_COMMAND_BASE
+ DRM_AMDGPU_SCHED, union drm_amdgpu_sched)
<br>
/**
<br>
* DOC: memory domains
<br>
@@ -308,6 +308,11 @@ union drm_amdgpu_vm {
<br>
#define AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE 1
<br>
#define AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE 2
<br>
+struct drm_amdgpu_sched_info {
<br>
+ __u32 pipe;
<br>
+ __u32 queue;
<br>
+};
<br>
+
<br>
struct drm_amdgpu_sched_in {
<br>
/* AMDGPU_SCHED_OP_* */
<br>
__u32 op;
<br>
@@ -315,10 +320,17 @@ struct drm_amdgpu_sched_in {
<br>
/** AMDGPU_CTX_PRIORITY_* */
<br>
__s32 priority;
<br>
__u32 ctx_id;
<br>
+ __u32 ip_type;
<br>
+ __u32 ring;
<br>
+};
<br>
+
<br>
+struct drm_amdgpu_sched_out {
<br>
+ struct drm_amdgpu_sched_info info;
<br>
};
<br>
union drm_amdgpu_sched {
<br>
struct drm_amdgpu_sched_in in;
<br>
+ struct drm_amdgpu_sched_out out;
<br>
};
<br>
/*
<br>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>