mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
gpu: nvgpu: check default and valid preemption modes
APIs to set preemption modes right now have config based code to set default preemption modes or to check if given preemption mode is valid or not. This makes code unreadable and complex. Rework nvgpu_gr_obj_ctx_init_ctxsw_preemption_mode() so that it checks for initial preemption modes in the beginning. If no preemption mode is passed while allocating context, get default preemption modes with gops.gr.init.get_default_preemption_modes() and use them. Rework nvgpu_gr_ctx_check_valid_preemption_mode() so that it is more readable. Use gops.gr.init.get_supported_preemption_modes() to validate incoming preemption modes against supported preemption modes. Log preemption modes getting set in nvgpu_gr_obj_ctx_set_ctxsw_preemption_mode(). Disable failing unit test. It will need rework according to new code. Jira NVGPU-5648 Change-Id: Ie1a3e1aeae7826a123e104d9d016f181bea3b271 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2419034 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com> Reviewed-by: Lakshmanan M <lm@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:
committed by
Alex Waterman
parent
807fbd3654
commit
c8b2bd7a03
@@ -76,37 +76,57 @@ static int nvgpu_gr_obj_ctx_init_ctxsw_preemption_mode(struct gk20a *g,
|
||||
int err;
|
||||
u32 graphics_preempt_mode = 0U;
|
||||
u32 compute_preempt_mode = 0U;
|
||||
u32 default_graphics_preempt_mode = 0U;
|
||||
u32 default_compute_preempt_mode = 0U;
|
||||
|
||||
nvgpu_log(g, gpu_dbg_fn | gpu_dbg_gr, " ");
|
||||
|
||||
#ifdef CONFIG_NVGPU_GRAPHICS
|
||||
if (!nvgpu_is_enabled(g, NVGPU_SUPPORT_PREEMPTION_GFXP)) {
|
||||
if (g->ops.gpu_class.is_valid_compute(class_num)) {
|
||||
nvgpu_gr_ctx_init_compute_preemption_mode(gr_ctx,
|
||||
NVGPU_PREEMPTION_MODE_COMPUTE_CTA);
|
||||
}
|
||||
/* Skip for engines other than GR */
|
||||
if (!g->ops.gpu_class.is_valid_compute(class_num) &&
|
||||
!g->ops.gpu_class.is_valid_gfx(class_num)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
g->ops.gr.init.get_default_preemption_modes(
|
||||
&default_graphics_preempt_mode,
|
||||
&default_compute_preempt_mode);
|
||||
|
||||
#ifdef CONFIG_NVGPU_GRAPHICS
|
||||
if ((flags & NVGPU_OBJ_CTX_FLAGS_SUPPORT_GFXP) != 0U) {
|
||||
graphics_preempt_mode = NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP;
|
||||
}
|
||||
|
||||
if (g->ops.gpu_class.is_valid_gfx(class_num) &&
|
||||
nvgpu_gr_ctx_desc_force_preemption_gfxp(gr_ctx_desc)) {
|
||||
graphics_preempt_mode = NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP;
|
||||
}
|
||||
|
||||
if (graphics_preempt_mode == 0U) {
|
||||
graphics_preempt_mode = default_graphics_preempt_mode;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NVGPU_CILP
|
||||
if ((flags & NVGPU_OBJ_CTX_FLAGS_SUPPORT_CILP) != 0U) {
|
||||
compute_preempt_mode = NVGPU_PREEMPTION_MODE_COMPUTE_CILP;
|
||||
}
|
||||
|
||||
if (g->ops.gpu_class.is_valid_compute(class_num) &&
|
||||
nvgpu_gr_ctx_desc_force_preemption_cilp(gr_ctx_desc)) {
|
||||
compute_preempt_mode = NVGPU_PREEMPTION_MODE_COMPUTE_CILP;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((graphics_preempt_mode != 0U) || (compute_preempt_mode != 0U)) {
|
||||
err = nvgpu_gr_obj_ctx_set_ctxsw_preemption_mode(g, config,
|
||||
gr_ctx_desc, gr_ctx, vm, class_num, graphics_preempt_mode,
|
||||
compute_preempt_mode);
|
||||
if (err != 0) {
|
||||
nvgpu_err(g, "set_ctxsw_preemption_mode failed");
|
||||
return err;
|
||||
}
|
||||
if (compute_preempt_mode == 0U) {
|
||||
compute_preempt_mode = default_compute_preempt_mode;
|
||||
}
|
||||
|
||||
err = nvgpu_gr_obj_ctx_set_ctxsw_preemption_mode(g, config,
|
||||
gr_ctx_desc, gr_ctx, vm, class_num, graphics_preempt_mode,
|
||||
compute_preempt_mode);
|
||||
if (err != 0) {
|
||||
nvgpu_err(g, "set_ctxsw_preemption_mode failed");
|
||||
return err;
|
||||
}
|
||||
|
||||
nvgpu_log(g, gpu_dbg_fn | gpu_dbg_gr, "done");
|
||||
@@ -206,31 +226,16 @@ int nvgpu_gr_obj_ctx_set_ctxsw_preemption_mode(struct gk20a *g,
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
#ifdef CONFIG_NVGPU_GRAPHICS
|
||||
if (!nvgpu_is_enabled(g, NVGPU_SUPPORT_PREEMPTION_GFXP)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g->ops.gpu_class.is_valid_gfx(class_num) &&
|
||||
nvgpu_gr_ctx_desc_force_preemption_gfxp(gr_ctx_desc)) {
|
||||
graphics_preempt_mode = NVGPU_PREEMPTION_MODE_GRAPHICS_GFXP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NVGPU_CILP
|
||||
if (g->ops.gpu_class.is_valid_compute(class_num) &&
|
||||
nvgpu_gr_ctx_desc_force_preemption_cilp(gr_ctx_desc)) {
|
||||
compute_preempt_mode = NVGPU_PREEMPTION_MODE_COMPUTE_CILP;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* check for invalid combinations */
|
||||
if (nvgpu_gr_ctx_check_valid_preemption_mode(gr_ctx,
|
||||
if (nvgpu_gr_ctx_check_valid_preemption_mode(g, gr_ctx,
|
||||
graphics_preempt_mode, compute_preempt_mode) == false) {
|
||||
err = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
nvgpu_log(g, gpu_dbg_gr, "graphics_preempt_mode=%u compute_preempt_mode=%u",
|
||||
graphics_preempt_mode, compute_preempt_mode);
|
||||
|
||||
#ifdef CONFIG_NVGPU_GRAPHICS
|
||||
err = nvgpu_gr_obj_ctx_set_graphics_preemption_mode(g, config,
|
||||
gr_ctx_desc, gr_ctx, vm, graphics_preempt_mode);
|
||||
|
||||
Reference in New Issue
Block a user