From fee4530d7d9075d879ddf3754173dbe2b7380ee5 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 13 Sep 2017 15:53:30 +0100 Subject: [PATCH 01/12] tests/lisa/test_trace: Factor out make_trace helper --- tests/lisa/test_trace.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/lisa/test_trace.py b/tests/lisa/test_trace.py index 66131a882..abe300c7c 100644 --- a/tests/lisa/test_trace.py +++ b/tests/lisa/test_trace.py @@ -41,6 +41,13 @@ class TestTrace(TestCase): self.trace_path = os.path.join(self.traces_dir, 'trace.txt') self.trace = Trace(self.platform, self.trace_path, self.events) + def make_trace(self, in_data): + with open(self.test_trace, "w") as fout: + fout.write(in_data) + + return Trace(self.platform, self.test_trace, self.events, + normalize_time=False) + def test_getTaskByName(self): """TestTrace: getTaskByName() returns the list of PIDs for all tasks with the specified name""" for name, pids in [('watchdog/0', [12]), @@ -69,10 +76,7 @@ class TestTrace(TestCase): father-1234 [002] 18765.018235: sched_switch: prev_comm=father prev_pid=1234 prev_prio=120 prev_state=0 next_comm=father next_pid=5678 next_prio=120 child-5678 [002] 18766.018236: sched_switch: prev_comm=child prev_pid=5678 prev_prio=120 prev_state=1 next_comm=sh next_pid=3367 next_prio=120 """ - - with open(self.test_trace, "w") as fout: - fout.write(in_data) - trace = Trace(self.platform, self.test_trace, self.events) + trace = self.make_trace(in_data) self.assertEqual(trace.getTaskByPid(1234), 'father') self.assertEqual(trace.getTaskByPid(5678), 'child') -- GitLab From 5434ab348b3c36dd70b8cc33ae1de13872f544eb Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Fri, 24 Mar 2017 14:14:47 +0000 Subject: [PATCH 02/12] trace: Allow parsing traces without big.LITTLE data Add a has_big_little property that is True iff we have big.LITTLE info in the platform dictionary. Then check against that property before attempting to do big.LITTLE-specific setup during parsing. --- libs/utils/trace.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libs/utils/trace.py b/libs/utils/trace.py index ac2e07006..01e190374 100644 --- a/libs/utils/trace.py +++ b/libs/utils/trace.py @@ -447,14 +447,21 @@ class Trace(object): ############################################################################### # Trace Events Sanitize Methods ############################################################################### + @property + def has_big_little(self): + return ('clusters' in self.platform + and 'big' in self.platform['clusters'] + and 'little' in self.platform['clusters'] + and 'nrg_model' in self.platform) def _sanitize_SchedCpuCapacity(self): """ Add more columns to cpu_capacity data frame if the energy model is - available. + available and the platform is big.LITTLE. """ if not self.hasEvents('cpu_capacity') \ - or 'nrg_model' not in self.platform: + or 'nrg_model' not in self.platform \ + or not self.has_big_little: return df = self._dfg_trace_event('cpu_capacity') @@ -497,6 +504,10 @@ class Trace(object): df.rename(columns={'avg_period': 'period_contrib'}, inplace=True) df.rename(columns={'runnable_avg_sum': 'load_sum'}, inplace=True) df.rename(columns={'running_avg_sum': 'util_sum'}, inplace=True) + + if not self.has_big_little: + return + df['cluster'] = np.select( [df.cpu.isin(self.platform['clusters']['little'])], ['LITTLE'], 'big') @@ -545,7 +556,8 @@ class Trace(object): Also convert between existing field name formats for sched_energy_diff """ if not self.hasEvents('sched_energy_diff') \ - or 'nrg_model' not in self.platform: + or 'nrg_model' not in self.platform \ + or not self.has_big_little: return nrg_model = self.platform['nrg_model'] em_lcluster = nrg_model['little']['cluster'] -- GitLab From f0dee4cdbe9ea80d53ae4d06a9df4f88baeb6f70 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 5 Jul 2017 13:42:33 +0100 Subject: [PATCH 03/12] trace: Derive cpus_count from trace if not provided --- libs/utils/trace.py | 7 +++++++ tests/lisa/test_trace.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/libs/utils/trace.py b/libs/utils/trace.py index 01e190374..1c74455d7 100644 --- a/libs/utils/trace.py +++ b/libs/utils/trace.py @@ -134,6 +134,13 @@ class Trace(object): self.data_frame = TraceData() self._registerDataFrameGetters(self) + # If we don't know the number of CPUs, check the trace for the + # highest-numbered CPU that traced an event. + if 'cpus_count' not in self.platform: + max_cpu = max(int(self.data_frame.trace_event(e)['__cpu'].max()) + for e in self.available_events) + self.platform['cpus_count'] = max_cpu + 1 + self.analysis = AnalysisRegister(self) def _registerDataFrameGetters(self, module): diff --git a/tests/lisa/test_trace.py b/tests/lisa/test_trace.py index abe300c7c..058588fb4 100644 --- a/tests/lisa/test_trace.py +++ b/tests/lisa/test_trace.py @@ -124,3 +124,18 @@ class TestTrace(TestCase): expected_time = (events[1] - events[0]) + (trace_end - events[2]) self.assertAlmostEqual(self.trace.overutilized_time, expected_time, places=6) + + def test_deriving_cpus_count(self): + """Test that Trace derives cpus_count if it isn't provided""" + if self.platform: + del self.platform['cpus_count'] + + in_data = """ + father-1234 [000] 18765.018235: sched_switch: prev_comm=father prev_pid=1234 prev_prio=120 prev_state=0 next_comm=father next_pid=5678 next_prio=120 + child-5678 [002] 18765.018235: sched_switch: prev_comm=child prev_pid=5678 prev_prio=120 prev_state=1 next_comm=father next_pid=5678 next_prio=120 + """ + + trace = self.make_trace(in_data) + + self.assertEqual(trace.platform['cpus_count'], 3) + -- GitLab From b3053ff13e8ff95bf459950242b2ababbdbe5b89 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 4 Jul 2017 15:19:58 +0100 Subject: [PATCH 04/12] analysis_module: Simplify setting up big.LITTLE data Now that we reliably have a value for 'cpus_count' we can use that to set sensible defaults for _big_cpus and _little_cpus. This means that we can now parse traces with no cluster data in the platform dictionary, so add tests for that too. --- libs/utils/analysis_module.py | 22 ++++------------------ tests/lisa/test_trace.py | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/libs/utils/analysis_module.py b/libs/utils/analysis_module.py index ccb12a0cf..558abb6c1 100644 --- a/libs/utils/analysis_module.py +++ b/libs/utils/analysis_module.py @@ -41,27 +41,13 @@ class AnalysisModule(object): # By default assume SMP system self._big_cap = 1024 self._little_cap = 1024 - nrg_model = self._platform.get('nrg_model', None) - if nrg_model: - try: - self._big_cap = nrg_model['big']['cpu']['cap_max'] - self._little_cap = nrg_model['little']['cpu']['cap_max'] - except TypeError: - self._log.debug('Failed parsing EM from platform data') - else: - self._log.debug('Platform data without Energy Model info') - - # By default assume SMP system - self._big_cpus = [] + self._big_cpus = range(self._platform['cpus_count']) self._little_cpus = [] - if 'big' in self._platform['clusters']: - self._log.debug('Parsing big.LITTLE system clusters') + + if self._trace.has_big_little: + self._little_cap = self._platform['nrg_model']['little']['cpu']['cap_max'] self._big_cpus = self._platform['clusters']['big'] self._little_cpus = self._platform['clusters']['little'] - else: - self._log.debug('Parsing SMP clusters') - for cid in self._platform['clusters']: - self._big_cpus.append(self._platform['clusters'][cid]) trace._registerDataFrameGetters(self) diff --git a/tests/lisa/test_trace.py b/tests/lisa/test_trace.py index 058588fb4..2c2d0d0c2 100644 --- a/tests/lisa/test_trace.py +++ b/tests/lisa/test_trace.py @@ -35,8 +35,7 @@ class TestTrace(TestCase): self.test_trace = os.path.join(self.traces_dir, 'test_trace.txt') - with open(os.path.join(self.traces_dir, 'platform.json')) as f: - self.platform = json.load(f) + self.platform = self._get_platform() self.trace_path = os.path.join(self.traces_dir, 'trace.txt') self.trace = Trace(self.platform, self.trace_path, self.events) @@ -48,6 +47,10 @@ class TestTrace(TestCase): return Trace(self.platform, self.test_trace, self.events, normalize_time=False) + def _get_platform(self): + with open(os.path.join(self.traces_dir, 'platform.json')) as f: + return json.load(f) + def test_getTaskByName(self): """TestTrace: getTaskByName() returns the list of PIDs for all tasks with the specified name""" for name, pids in [('watchdog/0', [12]), @@ -139,3 +142,15 @@ class TestTrace(TestCase): self.assertEqual(trace.platform['cpus_count'], 3) +class TestTraceNoClusterData(TestTrace): + """ + Test Trace without cluster data + + Inherits from TestTrace, so all the tests are run again but with + no cluster info the platform dict. + """ + def _get_platform(self): + platform = super(TestTraceNoClusterData, self)._get_platform() + del platform['clusters'] + return platform + -- GitLab From f2a93cfe4c1c35d5237810e7fed4f1330859a358 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 12 Apr 2017 18:32:17 +0100 Subject: [PATCH 05/12] idle_analysis: Don't depend on platform cluster data Instead use the _little_cpus and _big_cpus attributes which are set to sane defaults by AnalysisModule where the platform data isn't provided --- libs/utils/analysis/idle_analysis.py | 8 +++++--- tests/lisa/test_trace.py | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/libs/utils/analysis/idle_analysis.py b/libs/utils/analysis/idle_analysis.py index 3f3d660d3..0076364e9 100644 --- a/libs/utils/analysis/idle_analysis.py +++ b/libs/utils/analysis/idle_analysis.py @@ -191,9 +191,8 @@ class IdleAnalysis(AnalysisModule): # Split between big and LITTLE CPUs ordered from higher to lower ID _cpus.reverse() - big_cpus = [c for c in _cpus if c in self._platform['clusters']['big']] - little_cpus = [c for c in _cpus if c in - self._platform['clusters']['little']] + big_cpus = [c for c in _cpus if c in self._big_cpus] + little_cpus = [c for c in _cpus if c in self._little_cpus] _cpus = big_cpus + little_cpus residencies = [] @@ -222,6 +221,9 @@ class IdleAnalysis(AnalysisModule): if not self._trace.hasEvents('cpu_idle'): self._log.warning('Events [cpu_idle] not found, plot DISABLED!') return + if 'clusters' not in self._platform: + self._log.warning('No platform cluster info. Plot DISABLED!') + return # Sanitize clusters if clusters is None: diff --git a/tests/lisa/test_trace.py b/tests/lisa/test_trace.py index 2c2d0d0c2..b9204854e 100644 --- a/tests/lisa/test_trace.py +++ b/tests/lisa/test_trace.py @@ -27,7 +27,8 @@ class TestTrace(TestCase): traces_dir = os.path.join(os.path.dirname(__file__), 'traces') events = [ 'sched_switch', - 'sched_overutilized' + 'sched_overutilized', + 'cpu_idle', ] def __init__(self, *args, **kwargs): @@ -128,6 +129,25 @@ class TestTrace(TestCase): self.assertAlmostEqual(self.trace.overutilized_time, expected_time, places=6) + def test_plotCPUIdleStateResidency(self): + """ + Test that plotCPUIdleStateResidency doesn't crash + """ + in_data = """ + foo-1 [000] 0.01: cpu_idle: state=0 cpu_id=0 + foo-1 [000] 0.02: cpu_idle: state=-1 cpu_id=0 + bar-2 [000] 0.03: cpu_idle: state=0 cpu_id=1 + bar-2 [000] 0.04: cpu_idle: state=-1 cpu_id=1 + baz-3 [000] 0.05: cpu_idle: state=0 cpu_id=2 + baz-3 [000] 0.06: cpu_idle: state=-1 cpu_id=2 + bam-4 [000] 0.07: cpu_idle: state=0 cpu_id=3 + bam-4 [000] 0.08: cpu_idle: state=-1 cpu_id=3 + child-5678 [002] 18765.018235: sched_switch: prev_comm=child prev_pid=5678 prev_prio=120 prev_state=1 next_comm=father next_pid=5678 next_prio=120 + """ + trace = self.make_trace(in_data) + + trace.analysis.idle.plotCPUIdleStateResidency() + def test_deriving_cpus_count(self): """Test that Trace derives cpus_count if it isn't provided""" if self.platform: -- GitLab From 18b68317342bd51778d97493bb0bf47fed2fb229 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 5 Jul 2017 13:49:47 +0100 Subject: [PATCH 06/12] tasks_analysis: Remove syntax noise --- libs/utils/analysis/tasks_analysis.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/libs/utils/analysis/tasks_analysis.py b/libs/utils/analysis/tasks_analysis.py index 46794a03f..0b11c6a58 100644 --- a/libs/utils/analysis/tasks_analysis.py +++ b/libs/utils/analysis/tasks_analysis.py @@ -450,14 +450,10 @@ class TasksAnalysis(AnalysisModule): # Get per cluster wakeup events df = self._dfg_trace_event('sched_wakeup_new') - big_frequent = ( - (df.target_cpu.isin(self._big_cpus)) - ) + big_frequent = df.target_cpu.isin(self._big_cpus) ntbc = df[big_frequent] ntbc_count = len(ntbc) - little_frequent = ( - (df.target_cpu.isin(self._little_cpus)) - ) + little_frequent = df.target_cpu.isin(self._little_cpus) ntlc = df[little_frequent]; ntlc_count = len(ntlc) @@ -567,14 +563,11 @@ class TasksAnalysis(AnalysisModule): # Add column of expected cluster depending on: # a) task utilization value # b) capacity of the selected cluster - bu_bc = ( \ - (df['util_avg'] > self._little_cap) & \ - (df['cpu'].isin(self._big_cpus)) - ) - su_lc = ( \ - (df['util_avg'] <= self._little_cap) & \ - (df['cpu'].isin(self._little_cpus)) - ) + bu_bc = ((df['util_avg'] > self._little_cap) & + (df['cpu'].isin(self._big_cpus))) + su_lc = ((df['util_avg'] <= self._little_cap) & + (df['cpu'].isin(self._little_cpus))) + # The Cluster CAPacity Matches the UTILization (ccap_mutil) iff: # - tasks with util_avg > little_cap are running on a BIG cpu # - tasks with util_avg <= little_cap are running on a LITTLe cpu -- GitLab From ad85930283da294d8d2d94c314e47375ebd771e4 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 4 Jul 2017 15:31:07 +0100 Subject: [PATCH 07/12] tasks_analysis: Don't depend on platform cluster data --- libs/utils/analysis/tasks_analysis.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libs/utils/analysis/tasks_analysis.py b/libs/utils/analysis/tasks_analysis.py index 0b11c6a58..42beae6a2 100644 --- a/libs/utils/analysis/tasks_analysis.py +++ b/libs/utils/analysis/tasks_analysis.py @@ -692,16 +692,19 @@ class TasksAnalysis(AnalysisModule): :type is_last: bool """ util_df = self._dfg_trace_event('sched_load_avg_task') - data = util_df[util_df.pid == tid][['cluster', 'cpu']] - for ccolor, clabel in zip('gr', ['LITTLE', 'big']): - cdata = data[data.cluster == clabel] - if len(cdata) > 0: - cdata.plot(ax=axes, style=[ccolor+'+'], legend=False) + + if 'cluster' in util_df: + data = util_df[util_df.pid == tid][['cluster', 'cpu']] + for ccolor, clabel in zip('gr', ['LITTLE', 'big']): + cdata = data[data.cluster == clabel] + if len(cdata) > 0: + cdata.plot(ax=axes, style=[ccolor+'+'], legend=False) + # Y Axis - placeholders for legend, acutal CPUs. topmost empty lane cpus = [str(n) for n in range(self._platform['cpus_count'])] ylabels = [''] + cpus axes.set_yticklabels(ylabels) - axes.set_ylim(-1, self._platform['cpus_count']) + axes.set_ylim(-1, len(cpus)) axes.set_ylabel('CPUs') # X Axis axes.set_xlim(self._trace.x_min, self._trace.x_max) -- GitLab From 289ed0d71f8e6b0e13fcf83e0b1ad55dcc136777 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 5 Jul 2017 14:17:52 +0100 Subject: [PATCH 08/12] frequency_analysis: Don't depend on platform cluster data --- libs/utils/analysis/frequency_analysis.py | 35 +++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/libs/utils/analysis/frequency_analysis.py b/libs/utils/analysis/frequency_analysis.py index e9fce893f..265fc7ef8 100644 --- a/libs/utils/analysis/frequency_analysis.py +++ b/libs/utils/analysis/frequency_analysis.py @@ -133,13 +133,13 @@ class FrequencyAnalysis(AnalysisModule): # Extract LITTLE and big clusters frequencies # and scale them to [MHz] - if len(self._platform['clusters']['little']): - lfreq = df[df.cpu == self._platform['clusters']['little'][-1]] + if self._little_cpus: + lfreq = df[df.cpu == self._little_cpus[-1]] lfreq['frequency'] = lfreq['frequency']/1e3 else: lfreq = [] - if len(self._platform['clusters']['big']): - bfreq = df[df.cpu == self._platform['clusters']['big'][-1]] + if self._big_cpus: + bfreq = df[df.cpu == self._big_cpus[-1]] bfreq['frequency'] = bfreq['frequency']/1e3 else: bfreq = [] @@ -296,14 +296,17 @@ class FrequencyAnalysis(AnalysisModule): axes.axhline(_avg, color='r', linestyle='--', linewidth=2) # Set plot limit based on CPU min/max frequencies - for cluster,cpus in self._platform['clusters'].iteritems(): - if cpu_id not in cpus: - continue - axes.set_ylim( - (self._platform['freqs'][cluster][0] - 100000)/1e3, - (self._platform['freqs'][cluster][-1] + 100000)/1e3 - ) - break + if 'clusters' in self._platform: + for cluster,cpus in self._platform['clusters'].iteritems(): + if cpu_id not in cpus: + continue + freqs = self._platform['freqs'][cluster] + break + else: + freqs = df['frequency'].unique() + + axes.set_ylim((min(freqs) - 100000) / 1e3, + (max(freqs) + 100000) / 1e3) # Plot CPU frequency transitions _df['frequency'].plot(style=['r-'], ax=axes, @@ -367,9 +370,8 @@ class FrequencyAnalysis(AnalysisModule): # Split between big and LITTLE CPUs ordered from higher to lower ID _cpus.reverse() - big_cpus = [c for c in _cpus if c in self._platform['clusters']['big']] - little_cpus = [c for c in _cpus if c in - self._platform['clusters']['little']] + big_cpus = [c for c in _cpus if c in self._big_cpus] + little_cpus = [c for c in _cpus if c in self._little_cpus] _cpus = big_cpus + little_cpus # Precompute active and total time for each CPU @@ -413,6 +415,9 @@ class FrequencyAnalysis(AnalysisModule): if not self._trace.hasEvents('cpu_idle'): self._log.warning('Events [cpu_idle] not found, plot DISABLED!') return + if 'clusters' not in self._platform: + self._log.warning('No platform cluster info. Plot DISABLED!') + return # Assumption: all CPUs in a cluster run at the same frequency, i.e. the # frequency is scaled per-cluster not per-CPU. Hence, we can limit the -- GitLab From 26db830337f79717681ce50d52ad599e76d7067c Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 5 Jul 2017 14:10:27 +0100 Subject: [PATCH 09/12] cpus_analysis: Don't depend on platform cluster data --- libs/utils/analysis/cpus_analysis.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/libs/utils/analysis/cpus_analysis.py b/libs/utils/analysis/cpus_analysis.py index bb4a1f038..d28f5b20c 100644 --- a/libs/utils/analysis/cpus_analysis.py +++ b/libs/utils/analysis/cpus_analysis.py @@ -21,8 +21,6 @@ import matplotlib.pyplot as plt import pylab as pl import pandas as pd -from trappy.utils import listify - from analysis_module import AnalysisModule @@ -82,17 +80,15 @@ class CpusAnalysis(AnalysisModule): # Filter on specified cpus if cpus is None: - cpus = sorted(self._platform['clusters']['little'] + - self._platform['clusters']['big']) - cpus = listify(cpus) + cpus = sorted(self._big_cpus + self._little_cpus) # Plot: big CPUs - bcpus = set(cpus) & set(self._platform['clusters']['big']) + bcpus = set(cpus).intersection(self._big_cpus) if bcpus: self._plotCPU(bcpus, "big") # Plot: LITTLE CPUs - lcpus = set(cpus) & set(self._platform['clusters']['little']) + lcpus = set(cpus).intersection(self._little_cpus) if lcpus: self._plotCPU(lcpus, "LITTLE") -- GitLab From 074127be9df6f5420dc824fd816e087bcea9961b Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 4 Jul 2017 15:15:53 +0100 Subject: [PATCH 10/12] trace: Allow platform=None This makes the final use of platform optional, so that trace can be parsed and analysed without requiring platform data Suggested-by: Joel Fernandes --- libs/utils/trace.py | 11 ++++++++--- tests/lisa/test_trace.py | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libs/utils/trace.py b/libs/utils/trace.py index 1c74455d7..93a379e88 100644 --- a/libs/utils/trace.py +++ b/libs/utils/trace.py @@ -43,7 +43,7 @@ class Trace(object): :param platform: a dictionary containing information about the target platform - :type platform: dict + :type platform: dict or None :param data_dir: folder containing all trace data :type data_dir: str @@ -77,7 +77,7 @@ class Trace(object): plots_prefix=''): # The platform used to run the experiments - self.platform = platform + self.platform = platform or {} # TRAPpy Trace object self.ftrace = None @@ -518,6 +518,10 @@ class Trace(object): df['cluster'] = np.select( [df.cpu.isin(self.platform['clusters']['little'])], ['LITTLE'], 'big') + + if 'nrg_model' not in self.platform: + return + # Add a column which represents the max capacity of the smallest # clustre which can accomodate the task utilization little_cap = self.platform['nrg_model']['little']['cpu']['cap_max'] @@ -642,7 +646,8 @@ class Trace(object): Verify that all platform reported clusters are frequency coherent (i.e. frequency scaling is performed at a cluster level). """ - if not self.hasEvents('cpu_frequency_devlib'): + if not self.hasEvents('cpu_frequency_devlib') \ + or 'clusters' not in self.platform: return devlib_freq = self._dfg_trace_event('cpu_frequency_devlib') diff --git a/tests/lisa/test_trace.py b/tests/lisa/test_trace.py index b9204854e..25ccba24d 100644 --- a/tests/lisa/test_trace.py +++ b/tests/lisa/test_trace.py @@ -174,3 +174,12 @@ class TestTraceNoClusterData(TestTrace): del platform['clusters'] return platform +class TestTraceNoPlatform(TestTrace): + """ + Test Trace with platform=none + + Inherits from TestTrace, so all the tests are run again but with + platform=None + """ + def _get_platform(self): + return None -- GitLab From 01227a623943305b7f6fc0270615750151db9da3 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Tue, 19 Sep 2017 15:06:37 +0100 Subject: [PATCH 11/12] travis: Don't install ipython or jupyter We don't need it --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e771c37a1..804a9cdfe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,7 @@ sudo: required language: python install: - # Use IPython 5.x because 6.0+ only supports Python 3.3 - - pip install --upgrade "ipython<6.0.0" Cython trappy bart-py devlib psutil wrapt jupyter matplotlib + - pip install --upgrade trappy bart-py devlib psutil wrapt matplotlib script: - cd $TRAVIS_BUILD_DIR - source init_env && lisa-test tests/lisa/ -- GitLab From e1a71df8fa6db28c3e26eafe8bc9e81dc35d8e6b Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Wed, 20 Sep 2017 12:18:01 +0100 Subject: [PATCH 12/12] travis: Force using Agg matplotlib backend Otherwise it tries to use tkinter and fails due to headlessness --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 804a9cdfe..fd4a0c04e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,4 +21,5 @@ install: - pip install --upgrade trappy bart-py devlib psutil wrapt matplotlib script: - cd $TRAVIS_BUILD_DIR + - 'echo backend : Agg > matplotlibrc' # Otherwise it tries to use tkinter - source init_env && lisa-test tests/lisa/ -- GitLab