diff options
author | Mark Hatle <mark.hatle@windriver.com> | 2018-05-14 10:21:39 -0400 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-06-15 17:57:30 +0100 |
commit | a0cb1021c04c37b972bbf3d3626c7eef8a9876d1 (patch) | |
tree | d3e2a4177c6402a9db46f81e879d2abde3362721 /bitbake/lib/bb/runqueue.py | |
parent | 27101e647f6323a783a17391b57fe4145fa5dec5 (diff) | |
download | poky-a0cb1021c04c37b972bbf3d3626c7eef8a9876d1.tar.gz |
bitbake: runqueue.py: Initial implementation of per task process limits
On high core machines, in do_fetch, it is possible to DDoS your own machine.
A method to limit any arbitrary task type to a certain number of simultaneous
threads is needed. (Similar to how BB_NUMBER_THREADS works in the general
case.) The format of this new limitation is:
do_fetch[number_threads] = "2"
This should be set globally. If it is set in individual recipes it could
result in unpredictable behavior.
Note: a value for number_threads > BB_NUMBER_THREADS will have no effect.
(Bitbake rev: 055865047c63b9c3b213b47a1884924ce0adeda0)
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index a937a0ba76..2d9e18d888 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -134,6 +134,7 @@ class RunQueueScheduler(object): | |||
134 | self.prio_map = [self.rqdata.runtaskentries.keys()] | 134 | self.prio_map = [self.rqdata.runtaskentries.keys()] |
135 | 135 | ||
136 | self.buildable = [] | 136 | self.buildable = [] |
137 | self.skip_maxthread = {} | ||
137 | self.stamps = {} | 138 | self.stamps = {} |
138 | for tid in self.rqdata.runtaskentries: | 139 | for tid in self.rqdata.runtaskentries: |
139 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) | 140 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) |
@@ -150,8 +151,25 @@ class RunQueueScheduler(object): | |||
150 | self.buildable = [x for x in self.buildable if x not in self.rq.runq_running] | 151 | self.buildable = [x for x in self.buildable if x not in self.rq.runq_running] |
151 | if not self.buildable: | 152 | if not self.buildable: |
152 | return None | 153 | return None |
154 | |||
155 | # Filter out tasks that have a max number of threads that have been exceeded | ||
156 | skip_buildable = {} | ||
157 | for running in self.rq.runq_running.difference(self.rq.runq_complete): | ||
158 | rtaskname = taskname_from_tid(running) | ||
159 | if rtaskname not in self.skip_maxthread: | ||
160 | self.skip_maxthread[rtaskname] = self.rq.cfgData.getVarFlag(rtaskname, "number_threads") | ||
161 | if not self.skip_maxthread[rtaskname]: | ||
162 | continue | ||
163 | if rtaskname in skip_buildable: | ||
164 | skip_buildable[rtaskname] += 1 | ||
165 | else: | ||
166 | skip_buildable[rtaskname] = 1 | ||
167 | |||
153 | if len(self.buildable) == 1: | 168 | if len(self.buildable) == 1: |
154 | tid = self.buildable[0] | 169 | tid = self.buildable[0] |
170 | taskname = taskname_from_tid(tid) | ||
171 | if taskname in skip_buildable and skip_buildable[taskname] >= int(self.skip_maxthread[taskname]): | ||
172 | return None | ||
155 | stamp = self.stamps[tid] | 173 | stamp = self.stamps[tid] |
156 | if stamp not in self.rq.build_stamps.values(): | 174 | if stamp not in self.rq.build_stamps.values(): |
157 | return tid | 175 | return tid |
@@ -164,6 +182,9 @@ class RunQueueScheduler(object): | |||
164 | best = None | 182 | best = None |
165 | bestprio = None | 183 | bestprio = None |
166 | for tid in self.buildable: | 184 | for tid in self.buildable: |
185 | taskname = taskname_from_tid(tid) | ||
186 | if taskname in skip_buildable and skip_buildable[taskname] >= int(self.skip_maxthread[taskname]): | ||
187 | continue | ||
167 | prio = self.rev_prio_map[tid] | 188 | prio = self.rev_prio_map[tid] |
168 | if bestprio is None or bestprio > prio: | 189 | if bestprio is None or bestprio > prio: |
169 | stamp = self.stamps[tid] | 190 | stamp = self.stamps[tid] |