Re: [PATCH i-g-t 3/6] lib/xe/xe_sriov_admin: Lower priority before clearing timeslicing
"Laguna, Lukasz" <[email protected]>
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
On 8/18/2026 14:39, Marcin Bernatowicz wrote: > Zero execution quantum and zero preemption timeout both mean infinity. > A function left at a scheduling priority above LOW with infinite > timeslicing may never be switched away from by GuC, which is a risky > state that can be left via PAUSE/FLR. > > The restore helpers cleared execution quantum and preemption timeout > first and only then dropped priority to LOW, transiting through exactly > that state whenever a test had raised priority. This is reachable from > xe_pmu, which restores defaults while VFs are still enabled, and from > xe_sriov_admin_exit_cleanup_restore_sched_defaults() on abort or signal. > > Lower priority first, then clear execution quantum and preemption timeout. > > Assisted-by: Copilot:Claude-Opus-5 > Signed-off-by: Marcin Bernatowicz <[email protected]> > Cc: Adam Miszczak <[email protected]> > Cc: Jakub Kolakowski <[email protected]> > Cc: Lukasz Laguna <[email protected]> Reviewed-by: Lukasz Laguna <[email protected]> > Cc: Michal Wajdeczko <[email protected]> > --- > lib/xe/xe_sriov_admin.c | 32 ++++++++++++++++++++------------ > 1 file changed, 20 insertions(+), 12 deletions(-) > > diff --git a/lib/xe/xe_sriov_admin.c b/lib/xe/xe_sriov_admin.c > index b03e77b08..0433ddcfc 100644 > --- a/lib/xe/xe_sriov_admin.c > +++ b/lib/xe/xe_sriov_admin.c > @@ -547,6 +547,11 @@ void xe_sriov_admin_vf_stop(int pf_fd, unsigned int vf_num) > * > * Resets execution quantum, preemption timeout, and priority to driver defaults. > * > + * Zero execution quantum and zero preemption timeout both mean infinity, so > + * priority is lowered first. A function left at a priority above LOW with > + * infinite timeslicing may never be switched away from by GuC, and can only be > + * recovered by PAUSE/FLR. > + * > * Returns: 0 on success or negative errno on error. > */ > int __xe_sriov_admin_restore_sched_defaults(int pf_fd, unsigned int vf_num) > @@ -554,6 +559,12 @@ int __xe_sriov_admin_restore_sched_defaults(int pf_fd, unsigned int vf_num) > int ret_eq, ret_pt, ret_prio; > int ret = 0; > > + ret_prio = __xe_sriov_admin_set_sched_priority(pf_fd, vf_num, > + XE_SRIOV_SCHED_PRIORITY_LOW); > + igt_warn_on(ret_prio); > + if (!ret) > + ret = ret_prio; > + > ret_eq = __xe_sriov_admin_set_exec_quantum_ms(pf_fd, vf_num, 0); > igt_warn_on(ret_eq); > if (!ret) > @@ -564,12 +575,6 @@ int __xe_sriov_admin_restore_sched_defaults(int pf_fd, unsigned int vf_num) > if (!ret) > ret = ret_pt; > > - ret_prio = __xe_sriov_admin_set_sched_priority(pf_fd, vf_num, > - XE_SRIOV_SCHED_PRIORITY_LOW); > - igt_warn_on(ret_prio); > - if (!ret) > - ret = ret_prio; > - > return ret; > } > > @@ -589,6 +594,9 @@ void xe_sriov_admin_restore_sched_defaults(int pf_fd, unsigned int vf_num) > * > * Resets PF and all VFs to driver default scheduling parameters. > * > + * Priority is lowered before clearing timeslicing, see > + * __xe_sriov_admin_restore_sched_defaults(). > + * > * Returns: 0 on success or negative errno on error. > */ > int __xe_sriov_admin_bulk_restore_sched_defaults(int pf_fd) > @@ -596,6 +604,12 @@ int __xe_sriov_admin_bulk_restore_sched_defaults(int pf_fd) > int ret_eq, ret_pt, ret_prio; > int ret = 0; > > + ret_prio = __xe_sriov_admin_bulk_set_sched_priority(pf_fd, > + XE_SRIOV_SCHED_PRIORITY_LOW); > + igt_warn_on(ret_prio); > + if (!ret) > + ret = ret_prio; > + > ret_eq = __xe_sriov_admin_bulk_set_exec_quantum_ms(pf_fd, 0); > igt_warn_on(ret_eq); > if (!ret) > @@ -606,12 +620,6 @@ int __xe_sriov_admin_bulk_restore_sched_defaults(int pf_fd) > if (!ret) > ret = ret_pt; > > - ret_prio = __xe_sriov_admin_bulk_set_sched_priority(pf_fd, > - XE_SRIOV_SCHED_PRIORITY_LOW); > - igt_warn_on(ret_prio); > - if (!ret) > - ret = ret_prio; > - > return ret; > } >