Boot framework rework (#45)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / profiling / pmstat.py
1 from ..symbols import LunaixSymbols
2 from ..structs.page import PageStruct
3 from ..structs.pmem import PMem
4 from ..pp import MyPrettyPrinter
5 import math
6
7 class PhysicalMemProfile:
8     def __init__(self) -> None:
9         super().__init__()
10         self._pmem    = PMem(LunaixSymbols.debug_sym("pmm", "memory").value().address)
11
12         self.max_mem_pg = self._pmem.list_len()
13         self.max_mem_sz = self.max_mem_pg * 4096
14         self.mem_distr = []
15
16     def rescan_pmem(self, distr_granule = 256):
17         self.__mem_distr_granule = distr_granule
18         self.mem_distr.clear()
19
20         pplist = self._pmem.pplist()
21         page_per_granule = int(self.max_mem_pg) // self.__mem_distr_granule
22         remainder = self.max_mem_pg % self.__mem_distr_granule
23         bucket = 0
24         non_contig = 0
25         last_contig = False
26
27         for i in range(self.max_mem_pg):
28             element = PageStruct(pplist[i].address)
29             bucket += int(element.busy())
30             if last_contig:
31                 last_contig = element.busy()
32                 non_contig += int(not last_contig)
33             else:
34                 last_contig = element.busy()
35
36             if (i + 1) % page_per_granule == 0:
37                 self.mem_distr.append(bucket)
38                 bucket = 0
39         
40         if remainder > 0:
41             if bucket > 0:
42                 bucket += page_per_granule - remainder
43             self.mem_distr.append(bucket)
44
45         self.consumed_pg = sum(self.mem_distr)
46         self.utilisation = self.consumed_pg / self.max_mem_pg
47         self.fragmentation = 2 * non_contig / self.max_mem_pg
48         self.discontig = non_contig
49         self.page_per_granule = page_per_granule
50