Unifying the Lunaix's Physical Memory Model (#28)
[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 = self.max_mem_pg / self.__mem_distr_granule
22         page_per_granule = math.ceil(page_per_granule)
23         remainder = self.max_mem_pg % self.__mem_distr_granule
24         bucket = 0
25         non_contig = 0
26         last_contig = False
27
28         for i in range(self.max_mem_pg):
29             element = PageStruct(pplist[i].address)
30             bucket += int(element.busy())
31             if last_contig:
32                 last_contig = element.busy()
33                 non_contig += int(not last_contig)
34             else:
35                 last_contig = element.busy()
36
37             if (i + 1) % page_per_granule == 0:
38                 self.mem_distr.append(bucket)
39                 bucket = 0
40         
41         if remainder > 0:
42             if bucket > 0:
43                 bucket += page_per_granule - remainder
44             self.mem_distr.append(bucket)
45
46         self.consumed_pg = sum(self.mem_distr)
47         self.utilisation = self.consumed_pg / self.max_mem_pg
48         self.fragmentation = 2 * non_contig / self.max_mem_pg
49         self.discontig = non_contig
50         self.page_per_granule = page_per_granule
51