mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-02 02:34:05 +08:00
drm/amdgpu: Add command to override the context priority.
Given a master fd we can then override the priority of the context in another fd. Using these overrides was recommended by Christian instead of trying to submit from a master fd, and I am adding a way to override a single context instead of the entire process so we can only upgrade a single Vulkan queue and not effectively the entire process. Reused the flags field as it was checked to be 0 anyways, so nothing used it. This is source-incompatible (due to the name change), but ABI compatible. Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
021830d24b
commit
b5bb37eddb
@ -76,6 +76,39 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int amdgpu_sched_context_priority_override(struct amdgpu_device *adev,
|
||||||
|
int fd,
|
||||||
|
unsigned ctx_id,
|
||||||
|
enum drm_sched_priority priority)
|
||||||
|
{
|
||||||
|
struct file *filp = fget(fd);
|
||||||
|
struct amdgpu_fpriv *fpriv;
|
||||||
|
struct amdgpu_ctx *ctx;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!filp)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
r = amdgpu_file_to_fpriv(filp, &fpriv);
|
||||||
|
if (r) {
|
||||||
|
fput(filp);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = amdgpu_ctx_get(fpriv, ctx_id);
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
fput(filp);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
amdgpu_ctx_priority_override(ctx, priority);
|
||||||
|
amdgpu_ctx_put(ctx);
|
||||||
|
fput(filp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
||||||
struct drm_file *filp)
|
struct drm_file *filp)
|
||||||
{
|
{
|
||||||
@ -85,7 +118,7 @@ int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
priority = amdgpu_to_sched_priority(args->in.priority);
|
priority = amdgpu_to_sched_priority(args->in.priority);
|
||||||
if (args->in.flags || priority == DRM_SCHED_PRIORITY_INVALID)
|
if (priority == DRM_SCHED_PRIORITY_INVALID)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
switch (args->in.op) {
|
switch (args->in.op) {
|
||||||
@ -94,6 +127,12 @@ int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
|||||||
args->in.fd,
|
args->in.fd,
|
||||||
priority);
|
priority);
|
||||||
break;
|
break;
|
||||||
|
case AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE:
|
||||||
|
r = amdgpu_sched_context_priority_override(adev,
|
||||||
|
args->in.fd,
|
||||||
|
args->in.ctx_id,
|
||||||
|
priority);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_ERROR("Invalid sched op specified: %d\n", args->in.op);
|
DRM_ERROR("Invalid sched op specified: %d\n", args->in.op);
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
|
@ -272,13 +272,14 @@ union drm_amdgpu_vm {
|
|||||||
|
|
||||||
/* sched ioctl */
|
/* sched ioctl */
|
||||||
#define AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE 1
|
#define AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE 1
|
||||||
|
#define AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE 2
|
||||||
|
|
||||||
struct drm_amdgpu_sched_in {
|
struct drm_amdgpu_sched_in {
|
||||||
/* AMDGPU_SCHED_OP_* */
|
/* AMDGPU_SCHED_OP_* */
|
||||||
__u32 op;
|
__u32 op;
|
||||||
__u32 fd;
|
__u32 fd;
|
||||||
__s32 priority;
|
__s32 priority;
|
||||||
__u32 flags;
|
__u32 ctx_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
union drm_amdgpu_sched {
|
union drm_amdgpu_sched {
|
||||||
|
Loading…
Reference in New Issue
Block a user