24 października Phoronix poinformował, że zmianę w memblock zgłoszono w ramach pull requestu dotyczącego Linux 7.4. Proponowana łatka ma zastąpić liniowe przeszukiwanie regionów wyszukiwaniem binarnym w dwóch funkcjach. Jej autor, Tarun Sahu, podał, że w opisanym przypadku Kernel Handover (KHO), czyli odzyskiwania pamięci, obejmującym około 393 tys. stron czas operacji spadł z około 268 sekund do 50 ms.

Do czego służy memblock podczas startu Linuksa

Memblock zarządza pamięcią fizyczną na wczesnym etapie uruchamiania jądra, zanim zacznie działać pełny alokator stron. Dlatego proponowana zmiana dotyczy obsługi pamięci podczas inicjalizacji systemu, a nie wykonywania programów w przestrzeni użytkownika.

Jak zmienia się wyszukiwanie w funkcjach memblock

Łatka zmienia sposób wyszukiwania regionów kandydackich w memblock_add_range() i memblock_isolate_range() w pliku mm/memblock.c. Zamiast zaczynać liniowe skanowanie od początku listy, funkcje mają używać wyszukiwania binarnego, które zawęża zakres poszukiwań.

Sahu opisał powtarzane skanowanie przy dużym rozdrobnieniu pamięci jako operację o złożoności O(N²). Według niego proponowana metoda ma złożoność O(N log N) w najgorszym przypadku i O(N) przy kolejnych dopisaniach. Zaznaczył też, że skan liniowy może być wydajny dla małych list, a istotnym problemem są bardzo duże listy. Wskazał inicjalizację podczas rozruchu jako główny kontekst zmiany, z hotplugiem pamięci jako wyjątkiem.

Schemat pojęciowy przedstawia różnicę między powtarzanym skanowaniem a zawężaniem zakresu wyszukiwania binarnego.

Co mierzy wynik KHO

Linux 7.4: proponowana łatka memblock i wynik KHO

Podane przez Sahu czasy dotyczą odzyskiwania pamięci KHO w przypadku obejmującym około 393 tys. stron. Zmiana wyniku z około 268 sekund na około 50 milisekund dotyczy tej operacji w opisanym przypadku.

PrzypadekPrzed zmianąPo zmianie
Odzyskiwanie pamięci KHO, około 393 tys. stronokoło 268 sokoło 50 ms

Co pokazuje osobny raport z obciążenia

Dongli Zhang opisał osobny test na systemie z 32 procesorami i jednym węzłem, przy wyłączonych THP oraz stronach 4K. W jego logach przedział między znacznikami mem-auto-init i SLUB wynosił przed zmianą 38,355755 sekundy, a po niej 0,264273 sekundy. Są to przedziały wyliczone z podanych znaczników logu, nie pomiar samego memblock ani całkowitego czasu uruchamiania systemu.