From 0d795930ffa66660bcfa0ea911f56841c2006a04 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 29 Oct 2026 16:58:34 -0500 Subject: [PATCH] Keep the FLM live receiver at normal CPU priority --- openpilot/starpilot/flm/steerlearnerd.py | 2 +- .../flm/tests/test_receiver_scheduling.py | 32 +++++++++++++++++++ prebuilt.json | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 openpilot/starpilot/flm/tests/test_receiver_scheduling.py diff --git a/openpilot/starpilot/flm/steerlearnerd.py b/openpilot/starpilot/flm/steerlearnerd.py index 7497c90e0b..3632c6ba2b 100644 --- a/openpilot/starpilot/flm/steerlearnerd.py +++ b/openpilot/starpilot/flm/steerlearnerd.py @@ -1020,7 +1020,7 @@ def main(): try: if hasattr(os, 'sched_setscheduler'): os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) - os.nice(10) + os.setpriority(os.PRIO_PROCESS, 0, 0) except OSError: # An optional estimator must not inherit realtime scheduling on failure. return diff --git a/openpilot/starpilot/flm/tests/test_receiver_scheduling.py b/openpilot/starpilot/flm/tests/test_receiver_scheduling.py new file mode 100644 index 0000000000..aa56cb0b00 --- /dev/null +++ b/openpilot/starpilot/flm/tests/test_receiver_scheduling.py @@ -0,0 +1,32 @@ +"""The receiver must reach startup at normal priority; numerical guards stay separate.""" +from unittest import mock + +import pytest + +from openpilot.starpilot.flm import steerlearnerd + + +class ReachedParams(Exception): + pass + + +def test_actual_receiver_main_requests_normal_priority_before_reading_params(): + with mock.patch.object(steerlearnerd.os, 'sched_setscheduler') as scheduler, \ + mock.patch.object(steerlearnerd.os, 'setpriority') as priority, \ + mock.patch.object(steerlearnerd.os, 'nice') as nice, \ + mock.patch.object(steerlearnerd, 'Params', side_effect=ReachedParams): + with pytest.raises(ReachedParams): + steerlearnerd.main() + scheduler.assert_called_once_with(0, steerlearnerd.os.SCHED_OTHER, mock.ANY) + priority.assert_called_once_with(steerlearnerd.os.PRIO_PROCESS, 0, 0) + nice.assert_not_called() + + +@pytest.mark.parametrize('failed_call', ['sched_setscheduler', 'setpriority']) +def test_actual_receiver_main_refuses_unqualified_scheduler_startup(failed_call): + with mock.patch.object(steerlearnerd.os, 'sched_setscheduler'), \ + mock.patch.object(steerlearnerd.os, 'setpriority'), \ + mock.patch.object(steerlearnerd, 'Params') as params: + getattr(steerlearnerd.os, failed_call).side_effect = PermissionError('unavailable') + assert steerlearnerd.main() is None + params.assert_not_called() diff --git a/prebuilt.json b/prebuilt.json index 2e0e06521e..054bd5d14f 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "bac7d61b5ba9533b8179581ef7b58b9b12726afd6de30981b7bf78b37b1a9e9b", "schema_version": 1} +{"protected_inventory_sha256": "b15246eb3fd836cb63fa30ffcb9eadb1d9f7004f984a4b6ef20b5de5e7397c8a", "schema_version": 1}