Complete madvise values
This PR implements all remaining madvise values specified in the Linux man page.
The following values are added:
- SOFT_OFFLINE
- WIPEONFORK
- KEEPONFORK
- COLD
- PAGEOUT
- COLLAPSE
Values 1-5 were mentioned in a comment for future expansion. COLLAPSE was also found to be missing.
All six values are memory safe. Brief explanations are below:
- SOFT_OFFLINE: effects do not change the semantics of the calling process.
- WIPEONFORK: only affects child processes by zeroing memory post-fork.
- KEEPONFORK: only affects child processes by preserving memory across fork.
- COLD: indicates pages are unlikely to be accessed soon; non-destructive.
- PAGEOUT: requests page reclamation; non-destructive.
- COLLAPSE: consolidates pages into THPs; non-destructive.
I encourage reviewers to verify my safety assumptions.
Is WIPEONFORK really safe? It is possible to execute code after fork() before exec() using Command::pre_exec()
pre_exec() is unsafe itself, but using WIPEONFORK can make things that would otherwise be sound unsound. I'm not sure if this is a problem in combination with memory maps, but I would be hesitant to call it safe.
I tested WIPEONFORK here --> https://github.com/allan2/wipeonfork-pre-exec-example
Memory is zeroed both in the child process and before exec when using pre_exec.
This should cover the typical use case. However, there is still potential for unsafety if pre_exec logic assumes pre-fork memory state. If you are still concerned, I can move the variant to UncheckedAdvice.
Personally, I think we should go the cautious route and make it unsafe to wipe memory, if user code can still run afterwards.