Hi all,

I have been investigating an issue pointed out by Masayuki Ishikawa (in
https://github.com/apache/nuttx-apps/pull/2159) where memory usage rises
after executing loadable processes in SMP mode. This happens after removing
sched_lock() from nsh_fileapps, as discussed in a previous thread.

I did some investigation and came to the conclusion that while the PR in
question causes the aforementioned regression, the fundamental problem is
much deeper and far more serious.

In SMP mode there is a mm_delaylist for each CPU, I presume to make
exclusive access to the list easier to implement. When calling mm_free()
the memory is put into the delaylist if the mm_lock cannot be acquired,
while the delaylist elements are freed when mm_malloc() is called.

However, there is a problem with the per-CPU delaylist approach when using
this opportunistic approach:
- If only CPU 0 allocates memory, and only CPU 1 frees memory, this can
cause a systematic error where CPU 1:s mm_delaylist is filled up with items
to be freed, but since CPU 1 never calls mm_malloc() the items are never
freed.

The case is theoretical but entirely possible (as proven by the simple test
case in PR 2159) resulting in a situation where memory runs out because all
of the free memory is in CPU X:s mm_delaylist, waiting to be freed.

My question is, is there no deterministic alternative to this opportunistic
approach ? E.g. handling the delaylist from the idle process ?

I am asking for advice on how to solve this issue, any and all is greatly
appreciated.

Br,
Ville Juven

Reply via email to