17/01/2022 09:07, Dmitry Kozlyuk: > EAL malloc layer assumed all free elements content > is filled with zeros ("clean"), as opposed to uninitialized ("dirty"). > This assumption was ensured in two ways: > 1. EAL memalloc layer always returned clean memory. > 2. Freed memory was cleared before returning into the heap. > > Clearing the memory can be as slow as around 14 GiB/s. > To save doing so, memalloc layer is allowed to return dirty memory. > Such segments being marked with RTE_MEMSEG_FLAG_DIRTY. > The allocator tracks elements that contain dirty memory > using the new flag in the element header. > When clean memory is requested via rte_zmalloc*() > and the suitable element is dirty, it is cleared on allocation. > When memory is deallocated, the freed element is joined > with adjacent free elements, and the dirty flag is updated: > > dirty + freed + dirty = dirty => no need to clean > freed + dirty = dirty the freed memory
It is not said why dirty parts are not cleaned. > > clean + freed + clean = clean => freed memory > clean + freed = clean must be cleared > freed + clean = clean > freed = clean > > As a result, memory is either cleared on free, as before, > or it will be cleared on allocation if need be, but never twice. It is not said whether it is a change for everybody, or only when enabling an option.