Commit Graph
14 Commits
Author SHA1 Message Date
Robert Schmidt 66bf27bce9 threadCreate(): check for and handle missing SYS_NICE
SYS_NICE is a capability that allows a process to set thread affinity
and priority, among other things (see capabilities(7) for more info).

In this commit, add a function that allows to determine if the process
has this capability, and try to change the thread affinity and priority,
if requested. If the capability does not exist, the function will simply
not attempt to change the corresponding thread attributes.

To determine if the process has SYS_NICE, libcap can be used. However,
it might not be installed by default. To avoid requiring another
dependency, if we detect that libcap is not present, use a workaround by
try to set a real-time scheduling policy; if it's present, or can be
changed, we assume that the process has SYS_NICE (and clean up, if
relevant).

Simplify reading of capabilities
2024-06-03 14:00:41 +02:00
Robert Schmidt 6b37d183ce Remove set_latency_target(), add lock_memory_to_ram()
set_latency_target() attempts to set keep "low latency" by
- writing a specific latency to /dev/cpu_dma_latency
- setting manually the minimum CPU processor frequency to be the maximum

There is no functionality to undo this after stopping the softmodem(s),
and most users are probably not even aware that OAI does this. It is
generally preferable to set this beforehand using a governor or by
disabling sleep states (as outlined in the tutorial, and in a follow-up
commit in the performance tuning docs).

The previous mlockall() call, to lock memory to RAM, is retained in a
new function. There were additional mlockall() calls, which have been
replaced with lock_memory_to_ram(), where necessary.
2024-06-03 13:59:41 +02:00
Robert Schmidt a25b209e7f Remove Check if fedora and inside kernel
It's completely unclear what this is supposed to do.
2024-06-03 12:37:33 +02:00
Laurent THOMAS 3f2dd17191 code review comments + re-test 2022-01-13 16:04:16 +01:00
Laurent THOMAS bc05bd882d cleaning after big merge 2022-01-10 11:44:45 +01:00
Raphael Defosseux aa6b36a60f [RHEL8][CONTAINER] Runtime check when creating pThreads
It looks like :
  - when running on a Fedora-host
  - with generic kernel
  - in a container
  - even in privileged mode

That is not enough and priority/schedule settings is not allowed.

So at runtime, we check and in case, we don't set up priorities.

Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2021-05-25 14:41:30 +02:00
Laurent THOMAS 86f1c69f26 Fix code review remarks, merge develop, revert some merge errors 2021-04-13 22:28:02 +02:00
Laurent OpenCells 4511e70fac fix from ci results 2021-04-05 12:56:52 +02:00
Laurent THOMAS 0317d6725b sanitize, calibration tool kickoff 2021-04-02 10:12:13 +02:00
Laurent THOMAS 738728142f merge develop 2021-03-29 15:33:45 +02:00
Laurent 4d787625ab still to compile 2019-04-30 14:25:42 +02:00
laurent 8a92138086 rework threads in 5G 2019-04-30 10:17:08 +02:00
Cedric Roux 1b1f941e3c upgrade license to version 1.1 2017-10-23 12:22:13 +02:00
Cedric Roux cff9149920 fix issue 227 - UE IP settings disrupts realtime
see https://gitlab.eurecom.fr/oai/openairinterface5g/issues/227

When the UE connects to the eNodeB and receives its IP address from the
network, it calls system() to set it in the linux kernel world. This call
is not done in a realtime thread, but in the NAS, which uses its own thread,
independent of the realtime processing.

In some situations this totally disrupts realtime processing.

It is difficult to know precisely why that happens, but it seems that calling
fork(), as system() does, in a multi-threaded program is not a good idea. (So
say several people on the internet.) It is not clear why the softmodem is
impacted, but it seems that fork() is really what triggers the disruption.
Several tests lead to that conclusion.

To fix the problem, we create a child background process very early in main()
(before anything else basically). Then instead of calling system(), the main
process sends the string to the background process. The background process
gets the string, passes it to system() and reports the success/failure back
to the main process.

This solution involves a lot of system calls, but calling system() in the
first place is not cheap either. As long as no realtime thread uses this
mechanism, things should be fine. Time will tell.
2017-03-23 12:34:24 +01:00