From 9094203c5bf370e8c80efabc7150519ef9cb8331 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 6 Feb 2023 05:51:32 -0500 Subject: [PATCH 1/5] Add power management for linux. --- ansible/playbook.yaml | 1 + ansible/roles/power/tasks/common.yaml | 15 ++++++++++ ansible/roles/power/tasks/freebsd.yaml | 5 ++++ ansible/roles/power/tasks/linux.yaml | 22 ++++++++++++++ ansible/roles/power/tasks/main.yaml | 2 ++ ansible/roles/power/tasks/peruser.yaml | 29 +++++++++++++++++++ .../roles/power/tasks/peruser_freebsd.yaml | 0 ansible/roles/power/tasks/peruser_linux.yaml | 0 8 files changed, 74 insertions(+) create mode 100644 ansible/roles/power/tasks/common.yaml create mode 100644 ansible/roles/power/tasks/freebsd.yaml create mode 100644 ansible/roles/power/tasks/linux.yaml create mode 100644 ansible/roles/power/tasks/main.yaml create mode 100644 ansible/roles/power/tasks/peruser.yaml create mode 100644 ansible/roles/power/tasks/peruser_freebsd.yaml create mode 100644 ansible/roles/power/tasks/peruser_linux.yaml diff --git a/ansible/playbook.yaml b/ansible/playbook.yaml index aa170d8..e5a96c7 100644 --- a/ansible/playbook.yaml +++ b/ansible/playbook.yaml @@ -41,6 +41,7 @@ - wireguard - portshaker - poudriere + - power - android - latex - pyenv diff --git a/ansible/roles/power/tasks/common.yaml b/ansible/roles/power/tasks/common.yaml new file mode 100644 index 0000000..fef1101 --- /dev/null +++ b/ansible/roles/power/tasks/common.yaml @@ -0,0 +1,15 @@ +- import_tasks: tasks/freebsd.yaml + when: 'os_flavor == "freebsd"' + +- import_tasks: tasks/linux.yaml + when: 'os_flavor == "linux"' + +- include_tasks: + file: tasks/peruser.yaml + apply: + become: yes + become_user: "{{ initialize_user }}" + when: users is defined + loop: "{{ users | dict2items | community.general.json_query('[?value.initialize==`true`].key') }}" + loop_control: + loop_var: initialize_user diff --git a/ansible/roles/power/tasks/freebsd.yaml b/ansible/roles/power/tasks/freebsd.yaml new file mode 100644 index 0000000..b417174 --- /dev/null +++ b/ansible/roles/power/tasks/freebsd.yaml @@ -0,0 +1,5 @@ +# - name: Install packages +# package: +# name: +# - foo +# state: present diff --git a/ansible/roles/power/tasks/linux.yaml b/ansible/roles/power/tasks/linux.yaml new file mode 100644 index 0000000..b85a378 --- /dev/null +++ b/ansible/roles/power/tasks/linux.yaml @@ -0,0 +1,22 @@ +- name: Install packages + package: + name: + - powertop + state: present + +- name: Copy files + copy: + src: "files/{{ item.src }}" + dest: "{{ item.dest }}" + mode: 0600 + owner: root + group: wheel + loop: + - src: powertop.service + dest: /etc/systemd/system/ + +- name: Enable services + systemd: + name: powertop.service + daemon_reload: yes + enabled: true diff --git a/ansible/roles/power/tasks/main.yaml b/ansible/roles/power/tasks/main.yaml new file mode 100644 index 0000000..6805b9d --- /dev/null +++ b/ansible/roles/power/tasks/main.yaml @@ -0,0 +1,2 @@ +- import_tasks: tasks/common.yaml + # when: foo is defined diff --git a/ansible/roles/power/tasks/peruser.yaml b/ansible/roles/power/tasks/peruser.yaml new file mode 100644 index 0000000..111e886 --- /dev/null +++ b/ansible/roles/power/tasks/peruser.yaml @@ -0,0 +1,29 @@ +- include_role: + name: per_user + +# - name: Create directories +# file: +# name: "{{ account_homedir.stdout }}/{{ item }}" +# state: directory +# mode: 0700 +# owner: "{{ account_name.stdout }}" +# group: "{{ group_name.stdout }}" +# loop: +# - ".config/foo" + +# - name: Copy files +# copy: +# src: "files/{{ item.src }}" +# dest: "{{ account_homedir.stdout }}/{{ item.dest }}" +# mode: 0600 +# owner: "{{ account_name.stdout }}" +# group: "{{ group_name.stdout }}" +# loop: +# - src: foo.conf +# dest: .config/foo/foo.conf + +- import_tasks: tasks/peruser_freebsd.yaml + when: 'os_flavor == "freebsd"' + +- import_tasks: tasks/peruser_linux.yaml + when: 'os_flavor == "linux"' diff --git a/ansible/roles/power/tasks/peruser_freebsd.yaml b/ansible/roles/power/tasks/peruser_freebsd.yaml new file mode 100644 index 0000000..e69de29 diff --git a/ansible/roles/power/tasks/peruser_linux.yaml b/ansible/roles/power/tasks/peruser_linux.yaml new file mode 100644 index 0000000..e69de29 From 0340d2fd51b4c84cb979871fe29adeb7834a0b65 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Tue, 7 Feb 2023 15:40:50 -0500 Subject: [PATCH 2/5] starting to switch to tlp. --- ansible/roles/power/tasks/linux.yaml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/ansible/roles/power/tasks/linux.yaml b/ansible/roles/power/tasks/linux.yaml index b85a378..9e7b801 100644 --- a/ansible/roles/power/tasks/linux.yaml +++ b/ansible/roles/power/tasks/linux.yaml @@ -4,19 +4,8 @@ - powertop state: present -- name: Copy files - copy: - src: "files/{{ item.src }}" - dest: "{{ item.dest }}" - mode: 0600 - owner: root - group: wheel - loop: - - src: powertop.service - dest: /etc/systemd/system/ - - name: Enable services systemd: - name: powertop.service + name: tlp.service daemon_reload: yes enabled: true From dd8c2ff93784eba97afe909d58e864bf1c0fdc9d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 18 Feb 2023 11:30:46 -0500 Subject: [PATCH 3/5] Configure vm.laptop_mode and vm.dirty_writeback_centisecs. --- .../environments/laptop/host_vars/odolinux | 3 ++ ansible/roles/power/defaults/main.yaml | 15 ++++++++ ansible/roles/power/tasks/linux.yaml | 37 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 ansible/roles/power/defaults/main.yaml diff --git a/ansible/environments/laptop/host_vars/odolinux b/ansible/environments/laptop/host_vars/odolinux index 13a7128..d4cb545 100644 --- a/ansible/environments/laptop/host_vars/odolinux +++ b/ansible/environments/laptop/host_vars/odolinux @@ -23,3 +23,6 @@ graphics_driver: "intel" build_user: name: talexander group: talexander +wireguard_directory: odo +enabled_wireguard: + - wgh diff --git a/ansible/roles/power/defaults/main.yaml b/ansible/roles/power/defaults/main.yaml new file mode 100644 index 0000000..bdc48d1 --- /dev/null +++ b/ansible/roles/power/defaults/main.yaml @@ -0,0 +1,15 @@ +tlp_config: + PCIE_ASPM_ON_BAT: powersupersave + USB_ALLOWLIST: "1050:0406" + CPU_BOOST_ON_AC: "0" + CPU_BOOST_ON_BAT: "0" + CPU_ENERGY_PERF_POLICY_ON_BAT: "power" + DISK_IDLE_SECS_ON_BAT: "5" + CPU_MIN_PERF_ON_AC: "0" + CPU_MAX_PERF_ON_AC: "100" + CPU_MIN_PERF_ON_BAT: "0" + CPU_MAX_PERF_ON_BAT: "100" + # WIFI_PWR_ON_AC: "on" + # WIFI_PWR_ON_BAT: "on" + # CPU_HWP_DYN_BOOST_ON_AC: "0" + # CPU_HWP_DYN_BOOST_ON_BAT: "0" diff --git a/ansible/roles/power/tasks/linux.yaml b/ansible/roles/power/tasks/linux.yaml index 9e7b801..bc15c06 100644 --- a/ansible/roles/power/tasks/linux.yaml +++ b/ansible/roles/power/tasks/linux.yaml @@ -2,8 +2,45 @@ package: name: - powertop + - tlp state: present +# - name: Configure TLP +# lineinfile: +# path: /etc/tlp.conf +# regexp: "^{{ item.key }}=" +# line: '{{ item.key }}="{{ item.value }}"' +# loop: "{{ tlp_config | dict2items }}" +# when: '" " in item.value' + +# - name: Configure TLP +# lineinfile: +# path: /etc/tlp.conf +# regexp: "^{{ item.key }}=" +# line: "{{ item.key }}={{ item.value }}" +# loop: "{{ tlp_config | dict2items }}" +# when: '" " not in item.value' + +- name: Configure sysctls + sysctl: + name: "{{ item.name }}" + value: "{{ item.value }}" + state: present + sysctl_file: /etc/sysctl.d/dirty.conf + loop: + - name: vm.dirty_writeback_centisecs + value: 2000 # Default is 500 (5 seconds) + +- name: Configure sysctls + sysctl: + name: "{{ item.name }}" + value: "{{ item.value }}" + state: present + sysctl_file: /etc/sysctl.d/laptop.conf + loop: + - name: vm.laptop_mode + value: 5 + - name: Enable services systemd: name: tlp.service From 977e3827263b36d35d8f41220444e6878c07c853 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Thu, 23 Mar 2023 16:09:37 -0400 Subject: [PATCH 4/5] Change the power role to just setting the energy performance preference (epp). --- .../environments/laptop/host_vars/odolinux | 2 + ansible/roles/power/defaults/main.yaml | 15 ----- .../files/disable_turboboost_tmpfiles.conf | 2 + ansible/roles/power/tasks/linux.yaml | 57 ++++++------------- .../energy_performance_preference.conf.j2 | 4 ++ 5 files changed, 26 insertions(+), 54 deletions(-) delete mode 100644 ansible/roles/power/defaults/main.yaml create mode 100644 ansible/roles/power/files/disable_turboboost_tmpfiles.conf create mode 100644 ansible/roles/power/templates/energy_performance_preference.conf.j2 diff --git a/ansible/environments/laptop/host_vars/odolinux b/ansible/environments/laptop/host_vars/odolinux index d4cb545..90062eb 100644 --- a/ansible/environments/laptop/host_vars/odolinux +++ b/ansible/environments/laptop/host_vars/odolinux @@ -26,3 +26,5 @@ build_user: wireguard_directory: odo enabled_wireguard: - wgh +hwpstate: true +cores: 8 diff --git a/ansible/roles/power/defaults/main.yaml b/ansible/roles/power/defaults/main.yaml deleted file mode 100644 index bdc48d1..0000000 --- a/ansible/roles/power/defaults/main.yaml +++ /dev/null @@ -1,15 +0,0 @@ -tlp_config: - PCIE_ASPM_ON_BAT: powersupersave - USB_ALLOWLIST: "1050:0406" - CPU_BOOST_ON_AC: "0" - CPU_BOOST_ON_BAT: "0" - CPU_ENERGY_PERF_POLICY_ON_BAT: "power" - DISK_IDLE_SECS_ON_BAT: "5" - CPU_MIN_PERF_ON_AC: "0" - CPU_MAX_PERF_ON_AC: "100" - CPU_MIN_PERF_ON_BAT: "0" - CPU_MAX_PERF_ON_BAT: "100" - # WIFI_PWR_ON_AC: "on" - # WIFI_PWR_ON_BAT: "on" - # CPU_HWP_DYN_BOOST_ON_AC: "0" - # CPU_HWP_DYN_BOOST_ON_BAT: "0" diff --git a/ansible/roles/power/files/disable_turboboost_tmpfiles.conf b/ansible/roles/power/files/disable_turboboost_tmpfiles.conf new file mode 100644 index 0000000..e70a469 --- /dev/null +++ b/ansible/roles/power/files/disable_turboboost_tmpfiles.conf @@ -0,0 +1,2 @@ +# Disable turboboost. This makes the laptop significantly quieter and probably helps battery life. +w- /sys/devices/system/cpu/intel_pstate/no_turbo - - - - 1 diff --git a/ansible/roles/power/tasks/linux.yaml b/ansible/roles/power/tasks/linux.yaml index bc15c06..41c49eb 100644 --- a/ansible/roles/power/tasks/linux.yaml +++ b/ansible/roles/power/tasks/linux.yaml @@ -2,47 +2,26 @@ package: name: - powertop - - tlp state: present -# - name: Configure TLP -# lineinfile: -# path: /etc/tlp.conf -# regexp: "^{{ item.key }}=" -# line: '{{ item.key }}="{{ item.value }}"' -# loop: "{{ tlp_config | dict2items }}" -# when: '" " in item.value' - -# - name: Configure TLP -# lineinfile: -# path: /etc/tlp.conf -# regexp: "^{{ item.key }}=" -# line: "{{ item.key }}={{ item.value }}" -# loop: "{{ tlp_config | dict2items }}" -# when: '" " not in item.value' - -- name: Configure sysctls - sysctl: - name: "{{ item.name }}" - value: "{{ item.value }}" - state: present - sysctl_file: /etc/sysctl.d/dirty.conf +- name: Install tmpfiles.d configuration + copy: + src: "files/{{ item }}_tmpfiles.conf" + dest: "/etc/tmpfiles.d/{{ item }}.conf" + mode: 0644 + owner: root + group: wheel loop: - - name: vm.dirty_writeback_centisecs - value: 2000 # Default is 500 (5 seconds) + - disable_turboboost -- name: Configure sysctls - sysctl: - name: "{{ item.name }}" - value: "{{ item.value }}" - state: present - sysctl_file: /etc/sysctl.d/laptop.conf +- name: Favor energy efficiency for Speed Shift + when: hwpstate is defined and hwpstate and cores is defined + template: + src: "templates/{{ item.src }}.j2" + dest: "{{ item.dest }}" + mode: 0755 + owner: root + group: wheel loop: - - name: vm.laptop_mode - value: 5 - -- name: Enable services - systemd: - name: tlp.service - daemon_reload: yes - enabled: true + - src: energy_performance_preference.conf + dest: /etc/tmpfiles.d/energy_performance_preference.conf diff --git a/ansible/roles/power/templates/energy_performance_preference.conf.j2 b/ansible/roles/power/templates/energy_performance_preference.conf.j2 new file mode 100644 index 0000000..b5a4239 --- /dev/null +++ b/ansible/roles/power/templates/energy_performance_preference.conf.j2 @@ -0,0 +1,4 @@ +# Favor energy efficiency for Speed Shift +{% for core in range(0, cores, 1) %} +w- /sys/devices/system/cpu/cpufreq/policy{{core}}/energy_performance_preference - - - - power +{% endfor %} From 4e957fa9599454f5b80b4077b03ed7b6bf128beb Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Thu, 23 Mar 2023 16:33:47 -0400 Subject: [PATCH 5/5] Move the power role into the CPU role. --- .../environments/laptop/host_vars/odolinux | 1 + ansible/playbook.yaml | 1 - .../files/disable_turboboost_tmpfiles.conf | 0 ansible/roles/cpu/tasks/linux.yaml | 8 ++--- .../linux.yaml => cpu/tasks/linux_intel.yaml} | 0 .../energy_performance_preference.conf.j2 | 0 ansible/roles/power/tasks/common.yaml | 15 ---------- ansible/roles/power/tasks/freebsd.yaml | 5 ---- ansible/roles/power/tasks/main.yaml | 2 -- ansible/roles/power/tasks/peruser.yaml | 29 ------------------- .../roles/power/tasks/peruser_freebsd.yaml | 0 ansible/roles/power/tasks/peruser_linux.yaml | 0 12 files changed, 3 insertions(+), 58 deletions(-) rename ansible/roles/{power => cpu}/files/disable_turboboost_tmpfiles.conf (100%) rename ansible/roles/{power/tasks/linux.yaml => cpu/tasks/linux_intel.yaml} (100%) rename ansible/roles/{power => cpu}/templates/energy_performance_preference.conf.j2 (100%) delete mode 100644 ansible/roles/power/tasks/common.yaml delete mode 100644 ansible/roles/power/tasks/freebsd.yaml delete mode 100644 ansible/roles/power/tasks/main.yaml delete mode 100644 ansible/roles/power/tasks/peruser.yaml delete mode 100644 ansible/roles/power/tasks/peruser_freebsd.yaml delete mode 100644 ansible/roles/power/tasks/peruser_linux.yaml diff --git a/ansible/environments/laptop/host_vars/odolinux b/ansible/environments/laptop/host_vars/odolinux index 90062eb..ed6cf1c 100644 --- a/ansible/environments/laptop/host_vars/odolinux +++ b/ansible/environments/laptop/host_vars/odolinux @@ -26,5 +26,6 @@ build_user: wireguard_directory: odo enabled_wireguard: - wgh +cputype: "intel" hwpstate: true cores: 8 diff --git a/ansible/playbook.yaml b/ansible/playbook.yaml index e5a96c7..aa170d8 100644 --- a/ansible/playbook.yaml +++ b/ansible/playbook.yaml @@ -41,7 +41,6 @@ - wireguard - portshaker - poudriere - - power - android - latex - pyenv diff --git a/ansible/roles/power/files/disable_turboboost_tmpfiles.conf b/ansible/roles/cpu/files/disable_turboboost_tmpfiles.conf similarity index 100% rename from ansible/roles/power/files/disable_turboboost_tmpfiles.conf rename to ansible/roles/cpu/files/disable_turboboost_tmpfiles.conf diff --git a/ansible/roles/cpu/tasks/linux.yaml b/ansible/roles/cpu/tasks/linux.yaml index e1835f0..69f3268 100644 --- a/ansible/roles/cpu/tasks/linux.yaml +++ b/ansible/roles/cpu/tasks/linux.yaml @@ -1,6 +1,2 @@ -# - name: Install packages -# pacman: -# name: -# - foo -# state: present -# update_cache: true +- include_tasks: "tasks/linux_{{cputype}}.yaml" + when: cputype is defined diff --git a/ansible/roles/power/tasks/linux.yaml b/ansible/roles/cpu/tasks/linux_intel.yaml similarity index 100% rename from ansible/roles/power/tasks/linux.yaml rename to ansible/roles/cpu/tasks/linux_intel.yaml diff --git a/ansible/roles/power/templates/energy_performance_preference.conf.j2 b/ansible/roles/cpu/templates/energy_performance_preference.conf.j2 similarity index 100% rename from ansible/roles/power/templates/energy_performance_preference.conf.j2 rename to ansible/roles/cpu/templates/energy_performance_preference.conf.j2 diff --git a/ansible/roles/power/tasks/common.yaml b/ansible/roles/power/tasks/common.yaml deleted file mode 100644 index fef1101..0000000 --- a/ansible/roles/power/tasks/common.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- import_tasks: tasks/freebsd.yaml - when: 'os_flavor == "freebsd"' - -- import_tasks: tasks/linux.yaml - when: 'os_flavor == "linux"' - -- include_tasks: - file: tasks/peruser.yaml - apply: - become: yes - become_user: "{{ initialize_user }}" - when: users is defined - loop: "{{ users | dict2items | community.general.json_query('[?value.initialize==`true`].key') }}" - loop_control: - loop_var: initialize_user diff --git a/ansible/roles/power/tasks/freebsd.yaml b/ansible/roles/power/tasks/freebsd.yaml deleted file mode 100644 index b417174..0000000 --- a/ansible/roles/power/tasks/freebsd.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# - name: Install packages -# package: -# name: -# - foo -# state: present diff --git a/ansible/roles/power/tasks/main.yaml b/ansible/roles/power/tasks/main.yaml deleted file mode 100644 index 6805b9d..0000000 --- a/ansible/roles/power/tasks/main.yaml +++ /dev/null @@ -1,2 +0,0 @@ -- import_tasks: tasks/common.yaml - # when: foo is defined diff --git a/ansible/roles/power/tasks/peruser.yaml b/ansible/roles/power/tasks/peruser.yaml deleted file mode 100644 index 111e886..0000000 --- a/ansible/roles/power/tasks/peruser.yaml +++ /dev/null @@ -1,29 +0,0 @@ -- include_role: - name: per_user - -# - name: Create directories -# file: -# name: "{{ account_homedir.stdout }}/{{ item }}" -# state: directory -# mode: 0700 -# owner: "{{ account_name.stdout }}" -# group: "{{ group_name.stdout }}" -# loop: -# - ".config/foo" - -# - name: Copy files -# copy: -# src: "files/{{ item.src }}" -# dest: "{{ account_homedir.stdout }}/{{ item.dest }}" -# mode: 0600 -# owner: "{{ account_name.stdout }}" -# group: "{{ group_name.stdout }}" -# loop: -# - src: foo.conf -# dest: .config/foo/foo.conf - -- import_tasks: tasks/peruser_freebsd.yaml - when: 'os_flavor == "freebsd"' - -- import_tasks: tasks/peruser_linux.yaml - when: 'os_flavor == "linux"' diff --git a/ansible/roles/power/tasks/peruser_freebsd.yaml b/ansible/roles/power/tasks/peruser_freebsd.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/ansible/roles/power/tasks/peruser_linux.yaml b/ansible/roles/power/tasks/peruser_linux.yaml deleted file mode 100644 index e69de29..0000000