On Thu, 20 Jun 2024, Crystal Wood wrote: > Now that the ModuleInfo() flags are gone, remove the remaining infrastructure > around measurement profiles. > > Signed-off-by: Crystal Wood <crwood@xxxxxxxxxx> > --- > rteval/__init__.py | 25 ++---- > rteval/modules/measurement/__init__.py | 117 ++++--------------------- > rteval/rteval_histogram_raw.xsl | 24 ++--- > rteval/rteval_text.xsl | 41 +++------ > 4 files changed, 54 insertions(+), 153 deletions(-) > > diff --git a/rteval/__init__.py b/rteval/__init__.py > index 4a6883e28e5b..226d14f80f48 100644 > --- a/rteval/__init__.py > +++ b/rteval/__init__.py > @@ -20,7 +20,7 @@ import time > from datetime import datetime > import sysconfig > from rteval.modules.loads import LoadModules > -from rteval.modules.measurement import MeasurementModules, MeasurementProfile > +from rteval.modules.measurement import MeasurementModules > from rteval.rtevalReport import rtevalReport > from rteval.Log import Log > from rteval import rtevalConfig > @@ -131,10 +131,8 @@ class RtEval(rtevalReport): > self._measuremods.Setup(params) > > > - def __RunMeasurementProfile(self, measure_profile): > + def __RunMeasurement(self): > global earlystop > - if not isinstance(measure_profile, MeasurementProfile): > - raise Exception("measure_profile is not an MeasurementProfile object") > > measure_start = None > try: > @@ -155,15 +153,14 @@ class RtEval(rtevalReport): > print(f" with {self._sysinfo.mem_get_numa_nodes()} numa nodes") > else: > print("") > - cpulist = self._measuremods._MeasurementModules__cfg.GetSection("measurement").cpulist > + cpulist = self._measuremods._cfg.GetSection("measurement").cpulist > if cpulist: > print(f"started measurement threads on cores {cpulist}") > else: > print(f"started measurement threads on {onlinecpus} cores") > print(f"Run duration: {str(self.__rtevcfg.duration)} seconds") > > - # start the cyclictest thread > - measure_profile.Start() > + self._measuremods.Start() > > # Unleash the loads and measurement threads > report_interval = int(self.__rtevcfg.report_interval) > @@ -172,7 +169,7 @@ class RtEval(rtevalReport): > nthreads = threading.active_count() > else: > nthreads = None > - measure_profile.Unleash() > + self._measuremods.Unleash() > measure_start = datetime.now() > > # wait for time to expire or thread to die > @@ -185,7 +182,7 @@ class RtEval(rtevalReport): > load_avg_checked = 5 > while (currtime <= stoptime) and not stopsig.is_set(): > stopsig.wait(min(stoptime - currtime, 60.0)) > - if not measure_profile.isAlive(): > + if not self._measuremods.isAlive(): > stoptime = currtime > earlystop = True > self.__logger.log(Log.WARN, > @@ -218,7 +215,7 @@ class RtEval(rtevalReport): > > finally: > # stop measurement threads > - measure_profile.Stop() > + self._measuremods.Stop() > > # stop the loads > if self._loadmods: > @@ -227,7 +224,7 @@ class RtEval(rtevalReport): > print(f"stopping run at {time.asctime()}") > > # wait for measurement modules to finish calculating stats > - measure_profile.WaitForCompletion() > + self._measuremods.WaitForCompletion() > > return measure_start > > @@ -236,11 +233,7 @@ class RtEval(rtevalReport): > """ Run the full measurement suite with reports """ > global earlystop > rtevalres = 0 > - measure_start = None > - for meas_prf in self._measuremods: > - mstart = self.__RunMeasurementProfile(meas_prf) > - if measure_start is None: > - measure_start = mstart > + measure_start = self.__RunMeasurement() > > self._report(measure_start, self.__rtevcfg.xslt_report) > if self.__rtevcfg.sysreport: > diff --git a/rteval/modules/measurement/__init__.py b/rteval/modules/measurement/__init__.py > index 7b1d84ef554d..ecadd0885991 100644 > --- a/rteval/modules/measurement/__init__.py > +++ b/rteval/modules/measurement/__init__.py > @@ -8,43 +8,14 @@ from rteval.modules import RtEvalModules, ModuleContainer > from rteval.systopology import parse_cpulist_from_config > import rteval.cpulist_utils as cpulist_utils > > -class MeasurementProfile(RtEvalModules): > - """Keeps and controls all the measurement modules with the same measurement profile""" > - > - def __init__(self, config, modules_root, logger): > - self._module_type = "measurement" > - self._module_config = "measurement" > - self._report_tag = "Profile" > - RtEvalModules.__init__(self, config, modules_root, logger) > - > - > - def ImportModule(self, module): > - "Imports an exported module from a ModuleContainer() class" > - return self._ImportModule(module) > - > - > - def Setup(self, modname): > - "Instantiates and prepares a measurement module" > - > - modobj = self._InstantiateModule(modname, self._cfg.GetSection(modname)) > - self._RegisterModuleObject(modname, modobj) > - > - > -class MeasurementModules: > - """Class which takes care of all measurement modules and groups them into > -measurement profiles, based on their characteristics""" > +class MeasurementModules(RtEvalModules): > + """Module container for measurement modules""" > > def __init__(self, config, logger): > - self.__cfg = config > - self.__logger = logger > - self.__measureprofiles = [] > - self.__modules_root = "modules.measurement" > - self.__iter_item = None > - > - # Temporary module container, which is used to evalute measurement modules. > - # This will container will be destroyed after Setup() has been called > - self.__container = ModuleContainer(self.__modules_root, self.__logger) > - self.__LoadModules(self.__cfg.GetSection("measurement")) > + self._module_type = "measurement" > + self._report_tag = "Measurements" > + RtEvalModules.__init__(self, config, "modules.measurement", logger) > + self.__LoadModules(self._cfg.GetSection("measurement")) > > > def __LoadModules(self, modcfg): > @@ -54,37 +25,28 @@ measurement profiles, based on their characteristics""" > # hope to eventually have different kinds but module is only on > # for now (jcw) > if m[1].lower() == 'module': > - self.__container.LoadModule(m[0]) > - > - > - def GetProfile(self): > - "Returns the appropriate MeasurementProfile object, based on the profile type" > - > - for p in self.__measureprofiles: > - return p > - return None > - > + self._LoadModule(m[0]) > > def SetupModuleOptions(self, parser): > "Sets up all the measurement modules' parameters for the option parser" > - grparser = self.__container.SetupModuleOptions(parser, self.__cfg) > + grparser = super().SetupModuleOptions(parser) > > # Set up options specific for measurement module group > grparser.add_argument("--measurement-run-on-isolcpus", > dest="measurement___run_on_isolcpus", > action="store_true", > - default=self.__cfg.GetSection("measurement").setdefault("run-on-isolcpus", "false").lower() > + default=self._cfg.GetSection("measurement").setdefault("run-on-isolcpus", "false").lower() > == "true", > help="Include isolated CPUs in default cpulist") > > > def Setup(self, modparams): > - "Loads all measurement modules and group them into different measurement profiles" > + "Loads all measurement modules" > > if not isinstance(modparams, dict): > raise TypeError("modparams attribute is not of a dictionary type") > > - modcfg = self.__cfg.GetSection("measurement") > + modcfg = self._cfg.GetSection("measurement") > cpulist = modcfg.cpulist > run_on_isolcpus = modcfg.run_on_isolcpus > if cpulist is None: > @@ -93,61 +55,20 @@ measurement profiles, based on their characteristics""" > > for (modname, modtype) in modcfg: > if isinstance(modtype, str) and modtype.lower() == 'module': # Only 'module' will be supported (ds) > - self.__container.LoadModule(modname) > - > - # Get the correct measurement profile container for this module > - mp = self.GetProfile() > - if mp is None: > - # If not found, create a new measurement profile > - mp = MeasurementProfile(self.__cfg, > - self.__modules_root, self.__logger) > - self.__measureprofiles.append(mp) > - > - # Export the module imported here and transfer it to the > - # measurement profile > - mp.ImportModule(self.__container.ExportModule(modname)) > + self._cfg.AppendConfig(modname, modparams) > + self._cfg.AppendConfig(modname, {'cpulist':cpulist}) > + self._cfg.AppendConfig(modname, {'run-on-isolcpus':run_on_isolcpus}) > > - # Setup this imported module inside the appropriate measurement profile > - self.__cfg.AppendConfig(modname, modparams) > - self.__cfg.AppendConfig(modname, {'cpulist':cpulist}) > - self.__cfg.AppendConfig(modname, {'run-on-isolcpus':run_on_isolcpus}) > - mp.Setup(modname) > - > - del self.__container > + modobj = self._InstantiateModule(modname, self._cfg.GetSection(modname)) > + self._RegisterModuleObject(modname, modobj) > > > def MakeReport(self): > - "Generates an XML report for all measurement profiles" > + rep_n = super().MakeReport() > > - # Get the reports from all meaurement modules in all measurement profiles > - rep_n = libxml2.newNode("Measurements") > - cpulist = self.__cfg.GetSection("measurement").cpulist > - run_on_isolcpus = self.__cfg.GetSection("measurement").run_on_isolcpus > + cpulist = self._cfg.GetSection("measurement").cpulist > + run_on_isolcpus = self._cfg.GetSection("measurement").run_on_isolcpus > cpulist = parse_cpulist_from_config(cpulist, run_on_isolcpus) > rep_n.newProp("measurecpus", cpulist_utils.collapse_cpulist(cpulist)) > > - for mp in self.__measureprofiles: > - mprep_n = mp.MakeReport() > - if mprep_n: > - rep_n.addChild(mprep_n) > - > return rep_n > - > - > - def __iter__(self): > - "Initiates an iteration loop for MeasurementProfile objects" > - > - self.__iter_item = len(self.__measureprofiles) > - return self > - > - > - def __next__(self): > - """Internal Python iterating method, returns the next > -MeasurementProfile object to be processed""" > - > - if self.__iter_item == 0: > - self.__iter_item = None > - raise StopIteration > - > - self.__iter_item -= 1 > - return self.__measureprofiles[self.__iter_item] > diff --git a/rteval/rteval_histogram_raw.xsl b/rteval/rteval_histogram_raw.xsl > index 00b2be34f305..35d8e8461f74 100644 > --- a/rteval/rteval_histogram_raw.xsl > +++ b/rteval/rteval_histogram_raw.xsl > @@ -11,25 +11,25 @@ > <xsl:text>core	index	value </xsl:text> > > <!-- Extract overall system histogram data --> > - <xsl:apply-templates select="Measurements/Profile/cyclictest/system/histogram/bucket"> > + <xsl:apply-templates select="Measurements/cyclictest/system/histogram/bucket"> > <xsl:with-param name="label" select="'system'"/> > - <xsl:sort select="Measurements/Profile/cyclictest/core/histogram/bucket/@index" data-type="number"/> > + <xsl:sort select="Measurements/cyclictest/core/histogram/bucket/@index" data-type="number"/> > </xsl:apply-templates> > > - <xsl:apply-templates select="Measurements/Profile/timerlat/system/histogram/bucket"> > + <xsl:apply-templates select="Measurements/timerlat/system/histogram/bucket"> > <xsl:with-param name="label" select="'system'"/> > - <xsl:sort select="Measurements/Profile/timerlat/core/histogram/bucket/@index" data-type="number"/> > + <xsl:sort select="Measurements/timerlat/core/histogram/bucket/@index" data-type="number"/> > </xsl:apply-templates> > > <!-- Extract per cpu core histogram data --> > - <xsl:apply-templates select="Measurements/Profile/cyclictest/core/histogram/bucket"> > - <xsl:sort select="Measurements/Profile/cyclictest/core/@id" data-type="number"/> > - <xsl:sort select="Measurements/Profile/cyclictest/core/histogram/bucket/@index" data-type="number"/> > + <xsl:apply-templates select="Measurements/cyclictest/core/histogram/bucket"> > + <xsl:sort select="Measurements/cyclictest/core/@id" data-type="number"/> > + <xsl:sort select="Measurements/cyclictest/core/histogram/bucket/@index" data-type="number"/> > </xsl:apply-templates> > > - <xsl:apply-templates select="Measurements/Profile/timerlat/core/histogram/bucket"> > - <xsl:sort select="Measurements/Profile/timerlat/core/@id" data-type="number"/> > - <xsl:sort select="Measurements/Profile/timerlat/core/histogram/bucket/@index" data-type="number"/> > + <xsl:apply-templates select="Measurements/timerlat/core/histogram/bucket"> > + <xsl:sort select="Measurements/timerlat/core/@id" data-type="number"/> > + <xsl:sort select="Measurements/timerlat/core/histogram/bucket/@index" data-type="number"/> > </xsl:apply-templates> > > </xsl:template> > @@ -38,7 +38,7 @@ > <!-- --> > > <!-- Record formatting --> > - <xsl:template match="/rteval/Measurements/Profile/cyclictest/*/histogram/bucket"> > + <xsl:template match="/rteval/Measurements/cyclictest/*/histogram/bucket"> > <xsl:param name="label"/> > <xsl:choose> > <!-- If we don't have a id tag in what should be a 'core' tag, use the given label --> > @@ -54,7 +54,7 @@ > <xsl:text> </xsl:text> > </xsl:template> > > - <xsl:template match="/rteval/Measurements/Profile/timerlat/*/histogram/bucket"> > + <xsl:template match="/rteval/Measurements/timerlat/*/histogram/bucket"> > <xsl:param name="label"/> > <xsl:choose> > <!-- If we don't have a id tag in what should be a 'core' tag, use the given label --> > diff --git a/rteval/rteval_text.xsl b/rteval/rteval_text.xsl > index 2f03bda0bb55..1297b12f77e6 100644 > --- a/rteval/rteval_text.xsl > +++ b/rteval/rteval_text.xsl > @@ -154,8 +154,8 @@ > <xsl:value-of select="SystemInfo/cmdlineInfo/cmdline"/> > <xsl:text> </xsl:text> > > - <!-- Generate a summary report for all measurement profiles --> > - <xsl:apply-templates select="Measurements/Profile"/> > + <!-- Generate a summary report for all measurement modules --> > + <xsl:apply-templates select="Measurements"/> > <xsl:text> =================================================================== </xsl:text> > </xsl:template> > <!-- --> > @@ -178,21 +178,8 @@ > </xsl:template> > > > - <xsl:template match="/rteval/Measurements/Profile"> > - <xsl:text> Measurement profile </xsl:text> > - <xsl:value-of select="position()"/><xsl:text>: </xsl:text> > - <xsl:choose> > - <xsl:when test="@loads = '1'"><xsl:text>With loads, </xsl:text></xsl:when> > - <xsl:otherwise><xsl:text>Without loads, </xsl:text></xsl:otherwise> > - </xsl:choose> > - <xsl:choose> > - <xsl:when test="@parallel = '1'"> > - <xsl:text>measurements in parallel</xsl:text> > - </xsl:when> > - <xsl:otherwise> > - <xsl:text>measurements serialised</xsl:text> > - </xsl:otherwise> > - </xsl:choose> > + <xsl:template match="/rteval/Measurements"> > + <xsl:text> Measurements: </xsl:text> > <xsl:text> </xsl:text> > > <!-- Format other sections of the report, if they are found --> > @@ -206,7 +193,7 @@ > </xsl:template> > > <!-- Format the cyclictest section of the report --> > - <xsl:template match="/rteval/Measurements/Profile/cyclictest"> > + <xsl:template match="/rteval/Measurements/cyclictest"> > <xsl:text> Latency test </xsl:text> > > <xsl:text> Started: </xsl:text> > @@ -238,7 +225,7 @@ > > > <!-- Format the CPU core section in the cyclictest part --> > - <xsl:template match="/rteval/Measurements/Profile/cyclictest/core"> > + <xsl:template match="/rteval/Measurements/cyclictest/core"> > <xsl:text> CPU core </xsl:text> > <xsl:value-of select="@id"/> > <xsl:text> Priority: </xsl:text> > @@ -251,7 +238,7 @@ > > > <!-- Generic formatting of statistics information --> > - <xsl:template match="/rteval/Measurements/Profile/cyclictest/*/statistics"> > + <xsl:template match="/rteval/Measurements/cyclictest/*/statistics"> > <xsl:text> Samples: </xsl:text> > <xsl:value-of select="samples"/> > <xsl:text> </xsl:text> > @@ -301,7 +288,7 @@ > </xsl:template> > > <!-- Format the timerlat section of the report --> > - <xsl:template match="/rteval/Measurements/Profile/timerlat"> > + <xsl:template match="/rteval/Measurements/timerlat"> > <xsl:text> Latency test </xsl:text> > > <xsl:text> Started: </xsl:text> > @@ -333,7 +320,7 @@ > > > <!-- Format the CPU core section in the timerlat part --> > - <xsl:template match="/rteval/Measurements/Profile/timerlat/core"> > + <xsl:template match="/rteval/Measurements/timerlat/core"> > <xsl:text> CPU core </xsl:text> > <xsl:value-of select="@id"/> > <xsl:text> Priority: </xsl:text> > @@ -346,7 +333,7 @@ > > > <!-- Generic formatting of statistics information --> > - <xsl:template match="/rteval/Measurements/Profile/timerlat/*/statistics"> > + <xsl:template match="/rteval/Measurements/timerlat/*/statistics"> > <xsl:text> Samples: </xsl:text> > <xsl:value-of select="samples"/> > <xsl:text> </xsl:text> > @@ -397,7 +384,7 @@ > > > <!-- Format the hwlatdetect test section of the report --> > - <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0' and not(@aborted)]"> > + <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0' and not(@aborted)]"> > <xsl:text> Hardware latency detector </xsl:text> > > <xsl:text> Run duration: </xsl:text> > @@ -422,12 +409,12 @@ > <xsl:apply-templates select="samples/sample"/> > </xsl:template> > > - <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0' and @aborted > 0]"> > + <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0' and @aborted > 0]"> > <xsl:text> Hardware latency detector </xsl:text> > <xsl:text> ** WARNING ** hwlatedect failed to run </xsl:text> > </xsl:template> > > - <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0']/samples/sample"> > + <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0']/samples/sample"> > <xsl:text> - @</xsl:text> > <xsl:value-of select="@timestamp"/> > <xsl:text> </xsl:text> > @@ -436,7 +423,7 @@ > </xsl:template> > > <!-- Format the cyclictest section of the report --> > - <xsl:template match="/rteval/Measurements/Profile/sysstat"> > + <xsl:template match="/rteval/Measurements/sysstat"> > <xsl:text> sysstat measurements </xsl:text> > > <xsl:text> Started: </xsl:text> > -- > 2.45.1 > > > Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>