From 08d611f49b5045ba64e61aea35394435075eb63e Mon Sep 17 00:00:00 2001 From: Cody Burkard <cody@onlab.us> Date: Fri, 31 Oct 2014 12:47:34 -0700 Subject: [PATCH] fix silent failures when rt cannot be assigned --- mininet/node.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/mininet/node.py b/mininet/node.py index c82d2932..d6ecfd0c 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -510,7 +510,7 @@ def setParam( self, results, method, **param ): value may also be list or dict""" name, value = param.items()[ 0 ] f = getattr( self, method, None ) - if not f or value is None: + if not f: return if type( value ) is list: result = f( *value ) @@ -655,8 +655,14 @@ def popen( self, *args, **kwargs ): # Tell mnexec to execute command in our cgroup mncmd = [ 'mnexec', '-g', self.name, '-da', str( self.pid ) ] - if self.sched == 'rt': + cpuTime = int( self.cgroupGet( 'rt_runtime_us', 'cpu' ) ) + # if our cgroup is not given any cpu time, + # we cannot assign the RR Scheduler. + if self.sched == 'rt' and cpuTime > 0: mncmd += [ '-r', str( self.rtprio ) ] + elif self.sched == 'rt' and cpuTime <= 0: + debug( '***error: not enough cpu time available for %s.' % self.name, + 'Using cfs scheduler for subprocess\n' ) return Host.popen( self, *args, mncmd=mncmd, **kwargs ) def cleanup( self ): @@ -707,8 +713,9 @@ def setCPUFrac( self, f=-1, sched=None): f: CPU bandwidth limit (fraction) sched: 'rt' or 'cfs' Note 'cfs' requires CONFIG_CFS_BANDWIDTH""" + # if cpu fraction is None, reset to default of 0 if not f: - return + f = -1 if not sched: sched = self.sched if sched == 'rt': @@ -721,15 +728,17 @@ def setCPUFrac( self, f=-1, sched=None): # Reset to unlimited quota = -1 # Set cgroup's period and quota - self.cgroupSet( pstr, period ) - self.cgroupSet( qstr, quota ) + setPeriod = self.cgroupSet( pstr, period ) + setQuota = self.cgroupSet( qstr, quota ) if sched == 'rt': # Set RT priority if necessary - self.chrt() - info( '(%s %d/%dus) ' % ( sched, quota, period ) ) + sched = self.chrt() + info( '(%s %d/%dus) ' % ( sched, setQuota, setPeriod ) ) def setCPUs( self, cores, mems=0 ): "Specify (real) cores that our cgroup can run on" + if not cores: + return if type( cores ) is list: cores = ','.join( [ str( c ) for c in cores ] ) self.cgroupSet( resource='cpuset', param='cpus', @@ -743,7 +752,7 @@ def setCPUs( self, cores, mems=0 ): errFail( 'cgclassify -g cpuset:/%s %s' % ( self.name, self.pid ) ) - def config( self, cpu=None, cores=None, **params ): + def config( self, cpu=-1, cores=None, **params ): """cpu: desired overall system CPU fraction cores: (real) core(s) this host can run on params: parameters for Node.config()""" -- GitLab