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
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.
| Przypadek | Przed zmianą | Po zmianie |
| Odzyskiwanie pamięci KHO, około 393 tys. stron | około 268 s | okoł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.