Merge lp:~majduk/charms/trusty/neutron-contrail/trunk into lp:~sdn-charmers/charms/trusty/neutron-contrail/trunk

Proposed by Michał Ajduk
Status: Merged
Approved by: Michał Sawicz
Approved revision: 89
Merged at revision: 75
Proposed branch: lp:~majduk/charms/trusty/neutron-contrail/trunk
Merge into: lp:~sdn-charmers/charms/trusty/neutron-contrail/trunk
Diff against target: 531 lines (+230/-37)
6 files modified
config.yaml (+10/-0)
files/40contrail (+10/-0)
hooks/neutron_contrail_hooks.py (+83/-24)
hooks/neutron_contrail_utils.py (+108/-9)
scripts/create-vrouter.sh (+11/-4)
scripts/set-scaling-governor.sh (+8/-0)
To merge this branch: bzr merge lp:~majduk/charms/trusty/neutron-contrail/trunk
Reviewer Review Type Date Requested Status
Ante Karamatić Approve
Robert Ayres Pending
Review via email: mp+340373@code.launchpad.net

Description of the change

Changelog:
  Allow changing dpdk_coremask, dpdk_mempool_size, dpdk_txd_size, dpdk_rxd_size using config-changed. Always restart supervisor-vrouter service as per Juniper recommen
  dation.
  Set kernel CPU frequency scaling_governor to performance. This is required on DPDK enabled nodes.
      Add custom restart function for vrouter. DPDK vRouter does require i40e driver to be reloaded as it is not correctly reassigned to the interfaces after vRouter stop.
  Render vrouter agent configuration (and in effect restart vrouter) only when configuration is complete. Incomplete configuration causes vrouter to deconfigure interf
  aces and fail to start.
      Store vhost0 interface IP, prefix length and gateway in config. This prevents issue where IP or Gateway is lost when config-changed is ran during vrouter restart or before vrouter was first started after the install
  Update vhost-phy, vhost-phy-ip and vhost-phy-gw on charm upgrade
      Add parameters for vrouter: dpdk-mempool-size, dpdk-txd-size, dpdk-rxd-size.
      Allow reconfiguration of dpdk-coremask in config-changed
  Use Contrail provided version of nova-*, libvirt-* and qemu-*
  Present vrouter status in juju to simplify debugging and quicker service status overview
  Setup jumboframe support

To post a comment you must log in.
Revision history for this message
Ante Karamatić (ivoks) wrote :

See comments in line.

review: Needs Fixing
Revision history for this message
Ante Karamatić (ivoks) :
Revision history for this message
Michał Ajduk (majduk) wrote :

Replies inline.

Revision history for this message
Michał Ajduk (majduk) :
Revision history for this message
Ante Karamatić (ivoks) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'config.yaml'
2--- config.yaml 2017-09-20 19:59:00 +0000
3+++ config.yaml 2018-07-05 12:51:18 +0000
4@@ -83,6 +83,16 @@
5 Value can be specified as either a hexidecimal bitmask e.g. 0xFFFFFFFF or
6 as a numbered list separated by commas e.g. 0,1 (ranges are also supported
7 using '-' e.g. 0-2).
8+ dpdk-mempool-size:
9+ type: int
10+ default: 65536
11+ description: vrouter packet pool size
12+ dpdk-txd-size:
13+ type: int
14+ description: vrouter TX packet descriptor pool size
15+ dpdk-rxd-size:
16+ type: int
17+ description: vrouter RX packet descriptor pool size
18 virtual-gateways:
19 type: string
20 description: |
21
22=== modified file 'files/40contrail'
23--- files/40contrail 2017-07-17 05:03:53 +0000
24+++ files/40contrail 2018-07-05 12:51:18 +0000
25@@ -1,3 +1,13 @@
26+Explanation: Use contrail versions of libvirt packages
27+Package: libvirt*
28+Pin: version /contrail/
29+Pin-Priority: 1001
30+
31+Explanation: Use contrail versions of qemu packages
32+Package: qemu-*
33+Pin: version /contrail/
34+Pin-Priority: 1001
35+
36 Explanation: Use contrail versions of nova packages
37 Package: nova-*
38 Pin: version /contrail/
39
40=== modified file 'hooks/neutron_contrail_hooks.py'
41--- hooks/neutron_contrail_hooks.py 2018-03-21 19:34:17 +0000
42+++ hooks/neutron_contrail_hooks.py 2018-07-05 12:51:18 +0000
43@@ -40,6 +40,7 @@
44 leader_get,
45 leader_set,
46 log,
47+ status_set,
48 relation_get,
49 relation_ids,
50 relation_set
51@@ -49,7 +50,8 @@
52 get_total_ram,
53 restart_on_change,
54 service_restart,
55- service_start
56+ service_start,
57+ service_stop
58 )
59
60 import charmhelpers.core.sysctl as sysctl
61@@ -84,6 +86,9 @@
62 provision_vrouter,
63 reboot,
64 set_dpdk_coremask,
65+ set_dpdk_mempool_size,
66+ set_dpdk_txd_size,
67+ set_dpdk_rxd_size,
68 set_huge_pages_parameters,
69 units,
70 unprovision_local_metadata,
71@@ -93,7 +98,11 @@
72 write_nodemgr_config,
73 write_vnc_api_config,
74 write_vrouter_config,
75- write_vrouter_vgw_interfaces
76+ write_vrouter_vgw_interfaces,
77+ is_vrouter_running,
78+ vhost_gateway,
79+ vhost_ip,
80+ apply_configuration
81 )
82
83 PACKAGES = [ "contrail-utils", "python-jinja2", "python-netifaces",
84@@ -103,8 +112,6 @@
85 "contrail-vrouter-dpdk-init", "contrail-vrouter-agent",
86 "contrail-vrouter-common" ]
87
88-PACKAGES_DPDK_DEPS = [ "dpdk-depends-packages" ]
89-
90 PACKAGES_LBAAS = [ "python-barbicanclient", "haproxy" ]
91
92 PACKAGES_VROUTER = [ "contrail-vrouter-dkms", "contrail-vrouter-agent",
93@@ -114,6 +121,13 @@
94 "contrail-nova-vif", "contrail-vrouter-init",
95 "contrail-vrouter-common" ]
96
97+PACKAGES_LIBVIRT = [ "libvirt-bin", "libvirt0" ]
98+
99+PACKAGES_QEMU = [ "qemu-block-extra","qemu-system","qemu-system-arm",
100+ "qemu-system-common","qemu-system-mips","qemu-system-misc",
101+ "qemu-system-ppc","qemu-system-sparc","qemu-system-x86",
102+ "qemu-utils" ]
103+
104 hooks = Hooks()
105 config = config()
106
107@@ -150,6 +164,13 @@
108 unprovision_vrouter()
109 config["vrouter-provisioned"] = False
110
111+@hooks.hook('update-status')
112+def update_status():
113+ if is_vrouter_running():
114+ status_set('active',"vrouter is running")
115+ else:
116+ status_set('blocked',"vrouter is not running")
117+
118 @hooks.hook("config-changed")
119 def config_changed():
120 configure_huge_pages()
121@@ -282,8 +303,11 @@
122 check_local_metadata()
123 contrail_discovery_relation()
124
125-@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["contrail-vrouter-agent"],
126- "/etc/contrail/contrail-vrouter-nodemgr.conf": ["contrail-vrouter-nodemgr"]})
127+@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["supervisor-vrouter"],
128+ "/etc/contrail/contrail-vrouter-nodemgr.conf": ["supervisor-vrouter"]},
129+ False,
130+ {"supervisor-vrouter": apply_configuration}
131+ )
132 def contrail_discovery_relation():
133 write_vrouter_config()
134 write_nodemgr_config()
135@@ -306,7 +330,11 @@
136 check_vrouter()
137 check_local_metadata()
138
139-@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["contrail-vrouter-agent"]})
140+@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["supervisor-vrouter"],
141+ "/etc/contrail/contrail-vrouter-nodemgr.conf": ["supervisor-vrouter"]},
142+ False,
143+ {"supervisor-vrouter": apply_configuration}
144+ )
145 def control_node_relation():
146 write_vrouter_config()
147
148@@ -346,7 +374,7 @@
149 @hooks.hook()
150 def install():
151 configure_sources(True, "install-sources", "install-keys")
152- apt_upgrade(fatal=True, dist=True)
153+ apt_upgrade(options=["--yes", "--force-yes"], fatal=True, dist=True)
154 fix_vrouter_scripts() # bug in 2.0+20141015.1 packages
155 apt_install(PACKAGES, fatal=True)
156 utils.CONTRAIL_VERSION = dpkg_version("contrail-utils")
157@@ -361,19 +389,24 @@
158 # install lbaas packages
159 apt_install(PACKAGES_LBAAS, fatal=True)
160
161+ apply_configuration("supervisor-vrouter")
162 service_restart("nova-compute")
163
164 def install_dpdk_vrouter():
165- apt_install(PACKAGES_DPDK_DEPS, fatal=True)
166- check_call(["/opt/contrail/contrail_packages_dpdk/setup.sh"])
167 with open("/etc/init/supervisor-vrouter.override", "w") as conf:
168 conf.write("manual\n")
169- apt_install(PACKAGES_DPDK, options=["--allow-unauthenticated"], fatal=True)
170+
171
172 if not os.path.exists("/etc/apt/preferences.d/40contrail"):
173+ # contrail libvirt and qemu packages
174+ shutil.copy("files/40contrail", "/etc/apt/preferences.d")
175+ apt_install(PACKAGES_LIBVIRT, options=["--reinstall", "--force-yes"],
176+ fatal=True)
177+ apt_install(PACKAGES_QEMU, options=["--reinstall", "--force-yes"],
178+ fatal=True)
179+ apt_install(PACKAGES_DPDK, options=["--allow-unauthenticated"], fatal=True)
180 # contrail nova packages contain vrouter vhostuser vif
181- shutil.copy("files/40contrail", "/etc/apt/preferences.d")
182- apt_install("nova-compute", options=["--reinstall", "--force-yes"],
183+ apt_install("nova-compute", options=["--reinstall", "--force-yes", "-o Dpkg::Options::=\"--force-confold\"", "-o Dpkg::Options::=\"--force-confdef\""],
184 fatal=True)
185
186 fix_kexec_tools()
187@@ -385,16 +418,14 @@
188 service_restart("libvirt-bin")
189 configure_vrouter()
190
191- set_dpdk_coremask(config.get("dpdk-coremask"))
192+ write_dpdk_config()
193+
194 write_agent_param_config()
195 iface = config["vhost-phy"]
196 config["dpdk-pci"] = pci_address(iface)
197 config["dpdk-mac"] = netifaces.ifaddresses(iface)[netifaces.AF_LINK][0]["addr"]
198 write_vrouter_config()
199 os.remove("/etc/init/supervisor-vrouter.override")
200- service_start("supervisor-vrouter")
201- write_vrouter_config()
202- service_restart("contrail-vrouter-agent")
203
204 fix_libvirt()
205
206@@ -424,7 +455,11 @@
207
208 @hooks.hook("neutron-metadata-relation-departed")
209 @hooks.hook("neutron-metadata-relation-broken")
210-@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["contrail-vrouter-agent"]})
211+@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["supervisor-vrouter"],
212+ "/etc/contrail/contrail-vrouter-nodemgr.conf": ["supervisor-vrouter"]},
213+ False,
214+ {"supervisor-vrouter": apply_configuration}
215+ )
216 def neutron_metadata_relation():
217 write_vrouter_config()
218
219@@ -462,22 +497,46 @@
220 except UnregisteredHookError as e:
221 log("Unknown hook {} - skipping.".format(e))
222
223+def fill_vhost_phy_opts():
224+ iface = config.get("vhost-interface")
225+ #save physical iface setting
226+ if iface:
227+ config["vhost-phy"] = iface
228+ config["vhost-phy-gw"] = vhost_gateway()
229+ config["vhost-phy-ip"] = vhost_ip(iface)
230+ if not config["vhost-phy-ip"]:
231+ config["vhost-phy-ip"] = vhost_ip("vhost0")
232+
233 @hooks.hook("upgrade-charm")
234 def upgrade_charm():
235 if "vhost-phy" not in config:
236- config["vhost-phy"] = \
237- check_output(["awk", "/^physical_interface =/ { print $3 }", "/etc/contrail/contrail-vrouter-agent.conf"]).rstrip()
238+ fill_vhost_phy_opts()
239 write_vrouter_config()
240 write_vnc_api_config()
241 write_nodemgr_config()
242- service_restart("supervisor-vrouter")
243-
244-@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["contrail-vrouter-agent"],
245- "/etc/contrail/contrail-vrouter-nodemgr.conf": ["contrail-vrouter-nodemgr"]})
246+ if config["dpdk"]:
247+ write_dpdk_config()
248+ apply_configuration("supervisor-vrouter")
249+
250+def write_dpdk_config():
251+ log("Writing file /etc/contrail/supervisord_vrouter_files/contrail-vrouter-dpdk.ini")
252+ set_dpdk_coremask(config.get("dpdk-coremask"))
253+ set_dpdk_mempool_size(config.get("dpdk-mempool-size"))
254+ set_dpdk_txd_size(config.get("dpdk-txd-size"))
255+ set_dpdk_rxd_size(config.get("dpdk-rxd-size"))
256+
257+@restart_on_change({"/etc/contrail/contrail-vrouter-agent.conf": ["supervisor-vrouter"],
258+ "/etc/contrail/contrail-vrouter-nodemgr.conf": ["supervisor-vrouter"],
259+ "/etc/contrail/supervisord_vrouter_files/contrail-vrouter-dpdk.ini": ["supervisor-vrouter"]},
260+ False,
261+ {"supervisor-vrouter": apply_configuration }
262+ )
263 def write_config():
264 write_vrouter_config()
265 write_vnc_api_config()
266 write_nodemgr_config()
267+ if config["dpdk"]:
268+ write_dpdk_config()
269
270 if __name__ == "__main__":
271 main()
272
273=== modified file 'hooks/neutron_contrail_utils.py'
274--- hooks/neutron_contrail_utils.py 2018-03-21 19:34:17 +0000
275+++ hooks/neutron_contrail_utils.py 2018-07-05 12:51:18 +0000
276@@ -51,7 +51,8 @@
277 fstab_mount,
278 mkdir,
279 service_restart,
280- service_start
281+ service_start,
282+ service_stop
283 )
284
285 from charmhelpers.core.templating import render
286@@ -122,8 +123,11 @@
287 if config["dpdk"]:
288 args.append("-d")
289 iface = config.get("vhost-interface")
290+ #save physical iface setting
291 if iface:
292 args.append(iface)
293+ config["vhost-phy-ip"] = vhost_ip(iface)
294+ config["vhost-phy-gw"] = vhost_gateway()
295 config["vhost-phy"] = check_output(args, cwd="scripts").rstrip()
296
297 def contrail_api_ctx():
298@@ -343,7 +347,7 @@
299 iface = config.get("control-interface")
300 addr = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]["addr"]
301 except (ValueError, KeyError):
302- addr = None
303+ addr = config["vhost-phy-ip"]["ip"]
304 return { "control_network_ip": addr }
305
306 def neutron_metadata_ctx():
307@@ -389,7 +393,7 @@
308
309 def provision_vrouter():
310 hostname = gethostname()
311- ip = netifaces.ifaddresses("vhost0")[netifaces.AF_INET][0]["addr"]
312+ ip = config["vhost-phy-ip"]["ip"]
313 api_port = None
314 api_ip = config.get("contrail-api-ip")
315 if api_ip:
316@@ -422,6 +426,34 @@
317 "s!^command=.*/usr/bin/contrail-vrouter-dpdk!command=taskset {} /usr/bin/contrail-vrouter-dpdk!".format(args),
318 "/etc/contrail/supervisord_vrouter_files/contrail-vrouter-dpdk.ini"])
319
320+def set_dpdk_command_param(param,value):
321+ command=check_output(["sed","-n", "-e",
322+ "/^command/p",
323+ "/etc/contrail/supervisord_vrouter_files/contrail-vrouter-dpdk.ini"]).split()
324+ try:
325+ idx = command.index(param)
326+ if value and value > 0:
327+ command[idx+1]=str(value)
328+ else:
329+ command[idx]=""
330+ command[idx+1]=""
331+ except ValueError:
332+ if value and value > 0:
333+ command.append(param)
334+ command.append(str(value))
335+ check_output(["sed","-i", "-e",
336+ "s!^command.*$!{}!".format( " ".join( command) ),
337+ "/etc/contrail/supervisord_vrouter_files/contrail-vrouter-dpdk.ini"])
338+
339+def set_dpdk_mempool_size(size):
340+ set_dpdk_command_param("--vr_mempool_sz",size)
341+
342+def set_dpdk_txd_size(size):
343+ set_dpdk_command_param("--dpdk_txd_sz",size)
344+
345+def set_dpdk_rxd_size(size):
346+ set_dpdk_command_param("--dpdk_rxd_sz",size)
347+
348 def set_huge_pages_parameters(size, pages):
349 with open("/proc/cmdline", "r") as f:
350 line = f.read()
351@@ -523,9 +555,10 @@
352 # determine vhost gateway
353 gateway = config.get("vhost-gateway")
354 if gateway == "auto":
355+ iface = config.get("vhost-interface")
356 for line in check_output(["route", "-n"]).splitlines()[2:]:
357 l = line.split()
358- if "G" in l[3] and l[7] == "vhost0":
359+ if "G" in l[3] and ( l[7] == "vhost0" or l[7] == iface ):
360 return l[1]
361 gateway = None
362 return gateway
363@@ -536,15 +569,16 @@
364 addr = netifaces.ifaddresses(iface)[netifaces.AF_INET][0]
365 ip = addr["addr"]
366 cidr = netaddr.IPNetwork(ip + "/" + addr["netmask"]).prefixlen
367- return ip + "/" + str(cidr)
368+ return { "ip":ip, "prefixlen": str(cidr) }
369 except (ValueError, KeyError):
370 return None
371
372 def vrouter_ctx():
373- return { "vhost_ip": vhost_ip("vhost0"),
374- "vhost_gateway": vhost_gateway(),
375+ return { "vhost_ip": "%s/%s" % ( config["vhost-phy-ip"]["ip"], config["vhost-phy-ip"]["prefixlen"] ),
376+ "vhost_gateway": config["vhost-phy-gw"],
377 "vhost_physical": config["vhost-phy"] }
378
379+
380 def vrouter_vgw_ctx():
381 ctx = {}
382 vgws = config.get("virtual-gateways")
383@@ -575,6 +609,45 @@
384 ctx.update(identity_admin_ctx())
385 render("vnc_api_lib.ini", "/etc/contrail/vnc_api_lib.ini", ctx)
386
387+def is_ctx_complete(ctx,dpdk=False):
388+ log("vrouter config ctx: %s" % str(ctx) )
389+ try:
390+ if ctx["control_nodes"] == "":
391+ log("control_nodes missing")
392+ return False
393+ if ctx["discovery_server"] == "":
394+ log("discovery_server missing")
395+ return False
396+ if ctx["metadata_secret"] == "":
397+ log("metadata_secret missing")
398+ return False
399+ if ctx["control_network_ip"] == "":
400+ log("control_network_ip missing")
401+ return False
402+ if ctx["vhost_ip"] is None or ctx["vhost_ip"] == "":
403+ log("vhost_ip missing")
404+ return False
405+ if ctx["vhost_gateway"] is None or ctx["vhost_gateway"] == "":
406+ log("vhost_gateway missing")
407+ return False
408+ if ctx["vhost_physical"] == "":
409+ log("vhost_physical missing")
410+ return False
411+ if dpdk:
412+ if ctx["phy_address"] == "":
413+ log("dpdk phy_address missing")
414+ return False
415+ if ctx["phy_mac"] == "":
416+ log("dpdk phy_mac missing")
417+ return False
418+ if ctx["phy_driver"] == "":
419+ log("dpdk phy_driver missing")
420+ return False
421+ return True
422+ except KeyError as e:
423+ log("Error %s missing" % str(e) )
424+ return False
425+
426 def write_vrouter_config():
427 ctx = {}
428 ctx.update(control_node_ctx())
429@@ -586,9 +659,35 @@
430 if config["dpdk"]:
431 ctx["dpdk"] = True
432 ctx.update(dpdk_ctx())
433- render("contrail-vrouter-agent.conf",
434- "/etc/contrail/contrail-vrouter-agent.conf", ctx, perms=0440)
435+ if is_ctx_complete(ctx):
436+ render("contrail-vrouter-agent.conf",
437+ "/etc/contrail/contrail-vrouter-agent.conf", ctx, perms=0440)
438+ else:
439+ log("Configuration incomplete: contrail-vrouter-agent.conf")
440+
441
442 def write_vrouter_vgw_interfaces():
443 ctx = vrouter_vgw_ctx()
444 render("vrouter-vgw.cfg", "/etc/network/interfaces.d/vrouter-vgw.cfg", ctx)
445+
446+def is_vrouter_running():
447+ try:
448+ for line in check_output(["contrail-status","-d"]).splitlines():
449+ state = line.strip().split()
450+ if len(state) > 0 and state[0] != '==':
451+ if state[1] != 'active':
452+ return False
453+ return True
454+ except CalledProcessError:
455+ return False
456+
457+def configure_scaling_governor():
458+ check_call(["./set-scaling-governor.sh"], cwd="scripts")
459+
460+def apply_configuration(service):
461+ #service is provided by @restart_on_change hook
462+ log("Configuration changed for %s, restarting vrouter" % service)
463+ service_stop("supervisor-vrouter")
464+ if config["dpdk"]:
465+ configure_scaling_governor()
466+ service_start("supervisor-vrouter")
467
468=== added symlink 'hooks/update-status'
469=== target is u'neutron_contrail_hooks.py'
470=== modified file 'scripts/create-vrouter.sh'
471--- scripts/create-vrouter.sh 2018-03-21 19:34:17 +0000
472+++ scripts/create-vrouter.sh 2018-07-05 12:51:18 +0000
473@@ -29,6 +29,11 @@
474
475 configVRouter()
476 {
477+ if [ $6 -gt 0 ];
478+ mtu_param="mtu $6"
479+ else
480+ mtu_param=""
481+ fi
482 cat juju-header
483 if [ -s "$3" ]; then
484 printf "\n%s\n" "auto $2"
485@@ -43,14 +48,15 @@
486 echo "iface vhost0 inet dhcp"
487 fi
488 if [ -n "$1" ]; then
489- cat <<-EOF
490+ cat <<-EOF
491+ $mtu_param
492 post-up ip link set vhost0 address $5
493 post-up [ -e /etc/network/routes ] \\
494 && { service networking-routes stop; service networking-routes start; }
495 EOF
496 else
497 cat <<-EOF
498- pre-up ip link add address \$(cat /sys/class/net/$2/address) type vhost
499+ pre-up ip link add address \$(cat /sys/class/net/$2/address) type vhost
500 pre-up vif --add $2 --mac \$(cat /sys/class/net/$2/address) --vrf 0 --vhost-phys --type physical
501 pre-up vif --add vhost0 --mac \$(cat /sys/class/net/$2/address) --vrf 0 --type vhost --xconnect $2
502 post-down vif --list | awk '/^vif.*OS: vhost0/ {split(\$1, arr, "\\/"); print arr[2];}' | xargs vif --delete
503@@ -117,12 +123,13 @@
504 iface_cfg=/dev/null
505 fi
506 if [ -n "$1" ]; then
507- mac=$(cat /sys/class/net/$2/address)
508+ mac=$(cat /sys/class/net/$2/address )
509+ mtu=$(cat /sys/class/net/$2/mtu )
510 fi
511 ifacedown $iface_down vhost0 >&2; sleep 5
512 configureInterfacesDir
513 configureInterfaces $iface_delete
514- configVRouter "$1" $iface_up $iface_cfg $TMP/vrouter.cfg $mac \
515+ configVRouter "$1" $iface_up $iface_cfg $TMP/vrouter.cfg ${mac:-0} ${mtu:-0} \
516 > /etc/network/interfaces.d/vrouter.cfg
517 ifaceup $iface_up >&2
518 if [ -z "$1" ]; then
519
520=== added file 'scripts/set-scaling-governor.sh'
521--- scripts/set-scaling-governor.sh 1970-01-01 00:00:00 +0000
522+++ scripts/set-scaling-governor.sh 2018-07-05 12:51:18 +0000
523@@ -0,0 +1,8 @@
524+#!/bin/sh -e
525+#
526+# Script used to set scaling_governor to performance
527+
528+for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ; do
529+ echo performance > $f ;
530+done
531+

Subscribers

People subscribed via source and target branches