Calculation of memory zones decimal GFP mask

The calculation from the decimal value of the CFP mask is more reliable
than checking whether the strings "DMA32" and "DMA" are included.
This commit is contained in:
Carsten Grohmann 2023-01-23 16:32:46 +01:00
parent 17536301d6
commit 4011c1f755

View File

@ -550,6 +550,8 @@ class BaseKernelConfig:
self._gfp_calc_all_values()
self.gfp_reverse_lookup = self._gfp_create_reverse_lookup()
self._check_mandatory_gfp_flags()
def _gfp_calc_all_values(self):
"""
Calculate decimal values for all GFP flags and store in in GFP_FLAGS[<flag>]["_value"]
@ -644,6 +646,25 @@ class BaseKernelConfig:
res.extend(modifier)
return res
def _check_mandatory_gfp_flags(self):
"""
Check existance of mandatory flags used in
OOMAnalyser._calc_trigger_process_values() to calculate the memory zone
"""
if "__GFP_DMA" not in self.GFP_FLAGS:
error(
"Missing definition of GFP flag __GFP_DMA for kernel {}.{}.{}".format(
*self.release
)
)
if "__GFP_DMA32" not in self.GFP_FLAGS:
error(
"Missing definition of GFP flag __GFP_DMA for kernel {}.{}.{}".format(
*self.release
)
)
return
class KernelConfig_3_10(BaseKernelConfig):
@ -2881,6 +2902,9 @@ class OOMAnalyser:
flags.append("0x{0:x}".format(unknown))
flags = " | ".join(flags)
self.oom_result.details["_trigger_proc_gfp_mask_decimal"] = int(
self.oom_result.details["trigger_proc_gfp_mask"], 16
)
self.oom_result.details["trigger_proc_gfp_mask"] = "{} ({})".format(
self.oom_result.details["trigger_proc_gfp_mask"], flags
)
@ -3143,10 +3167,14 @@ class OOMAnalyser:
self.oom_result.details["trigger_proc_requested_memory_pages"]
* self.oom_result.details["page_size_kb"]
)
if "DMA32" in self.oom_result.details["trigger_proc_gfp_mask"]:
zone = "DMA32"
elif "DMA" in self.oom_result.details["trigger_proc_gfp_mask"]:
gfp_mask_decimal = self.oom_result.details["_trigger_proc_gfp_mask_decimal"]
gfp_flag_dma = self.oom_result.kconfig.GFP_FLAGS["__GFP_DMA"]["_value"]
gfp_flag_dma32 = self.oom_result.kconfig.GFP_FLAGS["__GFP_DMA32"]["_value"]
if (gfp_mask_decimal & gfp_flag_dma) == gfp_flag_dma:
zone = "DMA"
elif (gfp_mask_decimal & gfp_flag_dma32) == gfp_flag_dma32:
zone = "DMA32"
else:
zone = "Normal"
self.oom_result.details["trigger_proc_mem_zone"] = zone