Import from AlmaLinux stable repository

This commit is contained in:
eabdullin 2024-05-15 09:03:54 +00:00
parent 20f3998a19
commit 7871d1795b
19 changed files with 637 additions and 1896 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/tuna-0.18.tar.xz SOURCES/tuna-0.19.tar.xz

View File

@ -1 +1 @@
70666ad7164e0b80d63c11afc9888af273966896 SOURCES/tuna-0.18.tar.xz 4b8a04d219536ff295ef8ed188c6efcd0f74ee38 SOURCES/tuna-0.19.tar.xz

View File

@ -0,0 +1,357 @@
From fbde2418c84e57723ae1698acfe5932a11f4d611 Mon Sep 17 00:00:00 2001
From: Clark Williams <clrkwllms@kernel.org>
Date: Thu, 17 Aug 2023 08:12:38 -0500
Subject: [PATCH 1/2] Add SPDX license identifiers
use SPDX license identifiers to clarify the licences under which
tuna is released.
Signed-off-by: Clark Williams <williams@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
---
Makefile | 3 +++
org.tuna.policy | 1 +
oscilloscope-cmd.py | 15 +--------------
setup.py | 1 +
testuna | 10 +++++-----
tuna-cmd.py | 9 +--------
tuna.desktop | 1 +
tuna/__init__.py | 2 +-
tuna/config.py | 2 ++
tuna/gui/__init__.py | 2 ++
tuna/gui/commonview.py | 2 ++
tuna/gui/cpuview.py | 1 +
tuna/gui/irqview.py | 1 +
tuna/gui/procview.py | 1 +
tuna/gui/profileview.py | 1 +
tuna/gui/util.py | 1 +
tuna/new_eth.py | 1 +
tuna/oscilloscope.py | 15 +--------------
tuna/sysfs.py | 2 ++
tuna/tuna.py | 7 ++++---
tuna/tuna_gui.py | 1 +
tuna/tuna_sched.py | 1 +
22 files changed, 35 insertions(+), 45 deletions(-)
diff --git a/Makefile b/Makefile
index 50ded3985743..a3d71d2de896 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,6 @@
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
PACKAGE := tuna
VERSION := $(shell rpm -q --qf '%{VERSION} ' --specfile rpm/SPECS/$(PACKAGE).spec | cut -d' ' -f1)
diff --git a/org.tuna.policy b/org.tuna.policy
index 4f71d4ad65f4..b3b3900a4d76 100644
--- a/org.tuna.policy
+++ b/org.tuna.policy
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- SPDX-License-Identifier: GPL-2.0-only -->
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD polkit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">
<policyconfig>
diff --git a/oscilloscope-cmd.py b/oscilloscope-cmd.py
index 2ca87e9edc62..a65117637160 100755
--- a/oscilloscope-cmd.py
+++ b/oscilloscope-cmd.py
@@ -5,20 +5,7 @@
# http://git.kernel.org/?p=linux/kernel/git/acme/tuna.git;a=tree
# For newer versions and to see it integrated with tuna
#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-# USA
+# SPDX-License-Identifier: LGPL-2.1-only
import getopt
import sys
diff --git a/setup.py b/setup.py
index db0f00735524..f119e75abdeb 100755
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,5 @@
#!/usr/bin/python3
+# SPDX-License-Identifier: GPL-2.0-only
import os
import sysconfig
from os.path import isfile, relpath
diff --git a/testuna b/testuna
index 4bf91ebdb76f..cb98640c0167 100755
--- a/testuna
+++ b/testuna
@@ -2,7 +2,7 @@
# Regression tests for tuna
# (c) 2008 Red Hat Inc.
# Arnaldo Carvalho de Melo <acme@redhat.com>
-# Released under the GPLv2
+# SPDX-License-Identifier: GPL-2.0-only
dprint() {
[ -n "$VERBOSE" ] && echo $1
@@ -111,21 +111,21 @@ PID=$(ktpidof "watchdog")
RTPRIO=$(get_rtprio $PID)
POLICY=$(get_policy $PID)
POLICY=$(echo ${POLICY:6:1} | tr 'A-Z' 'a-z')
-chrt -$POLICY -p $((RTPRIO - 1)) $PID
+chrt -$POLICY -p $((RTPRIO - 1)) $PID
die_if_not_saved 1 'Saving changes to a kernel thread priority'
-chrt -$POLICY -p $RTPRIO $PID
+chrt -$POLICY -p $RTPRIO $PID
die_if_conf_changed 'Restoring kernel thread priority'
new_policy=$(echo $POLICY | tr fr rf)
-chrt -$new_policy -p $RTPRIO $PID
+chrt -$new_policy -p $RTPRIO $PID
die_if_not_saved 1 'Changing kernel thread sched policy'
-chrt -$POLICY -p $RTPRIO $PID
+chrt -$POLICY -p $RTPRIO $PID
die_if_conf_changed 'Restoring kernel thread sched policy'
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 6a980598526f..e953869c4f48 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -5,14 +5,7 @@
# Copyright (C) 2008, 2009, 2010, 2011 Red Hat Inc.
# Arnaldo Carvalho de Melo <acme@redhat.com>
#
-# This application is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; version 2.
-#
-# This application is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
+# SPDX-License-Identifier: GPL-2.0-only
""" tuna - Application Tuning Program"""
diff --git a/tuna.desktop b/tuna.desktop
index 603011f79467..87ca3a35ce63 100644
--- a/tuna.desktop
+++ b/tuna.desktop
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
[Desktop Entry]
Name=tuna
GenericName=Application Tuner
diff --git a/tuna/__init__.py b/tuna/__init__.py
index 30924a00cf96..614e3e4c7ed8 100755
--- a/tuna/__init__.py
+++ b/tuna/__init__.py
@@ -4,4 +4,4 @@ Copyright (c) 2008, 2009 Red Hat Inc.
Application Tuning GUI
"""
__author__ = "Arnaldo Carvalho de Melo <acme@redhat.com>"
-__license__ = "GPLv2 License"
+__license__ = "SPDX-License-Identifier: GPL-2.0-only"
diff --git a/tuna/config.py b/tuna/config.py
index 09d26dd87029..63c9f23bb09b 100644
--- a/tuna/config.py
+++ b/tuna/config.py
@@ -1,3 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
import io
import os
import re
diff --git a/tuna/gui/__init__.py b/tuna/gui/__init__.py
index ad1191c13d8d..a40f86292e6f 100755
--- a/tuna/gui/__init__.py
+++ b/tuna/gui/__init__.py
@@ -1,3 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
"""
Copyright (c) 2009 Red Hat Inc.
diff --git a/tuna/gui/commonview.py b/tuna/gui/commonview.py
index cc8f913819a2..8089ed154dae 100644
--- a/tuna/gui/commonview.py
+++ b/tuna/gui/commonview.py
@@ -1,3 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
from gi.repository import Gtk
from tuna import tuna
diff --git a/tuna/gui/cpuview.py b/tuna/gui/cpuview.py
index cc3f0f905ae7..844705a4bb21 100755
--- a/tuna/gui/cpuview.py
+++ b/tuna/gui/cpuview.py
@@ -1,5 +1,6 @@
# -*- python -*-
# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: GPL-2.0-only
from functools import reduce
diff --git a/tuna/gui/irqview.py b/tuna/gui/irqview.py
index 5143d6dc0df5..e89fb70197fc 100755
--- a/tuna/gui/irqview.py
+++ b/tuna/gui/irqview.py
@@ -1,5 +1,6 @@
# -*- python -*-
# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: GPL-2.0-only
from tuna import tuna, gui
import procfs
from gi.repository import Gdk
diff --git a/tuna/gui/procview.py b/tuna/gui/procview.py
index 440a289a1b29..78d5f573dd49 100755
--- a/tuna/gui/procview.py
+++ b/tuna/gui/procview.py
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
import re
import os
import tuna.tuna_sched as tuna_sched
diff --git a/tuna/gui/profileview.py b/tuna/gui/profileview.py
index 26f58cbc8f4f..7570bc0e57ce 100644
--- a/tuna/gui/profileview.py
+++ b/tuna/gui/profileview.py
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
import os
import shutil
import gi
diff --git a/tuna/gui/util.py b/tuna/gui/util.py
index ec368ae4b2c9..92bd368179cc 100644
--- a/tuna/gui/util.py
+++ b/tuna/gui/util.py
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
import errno
import os
import gi
diff --git a/tuna/new_eth.py b/tuna/new_eth.py
index 98f9179d5695..e2888d4cef36 100755
--- a/tuna/new_eth.py
+++ b/tuna/new_eth.py
@@ -1,4 +1,5 @@
# Copyright (C) 2022 John Kacur
+# SPDX-License-Identifier: GPL-2.0-only
""" A few functions similar to ethtool """
import os
import socket
diff --git a/tuna/oscilloscope.py b/tuna/oscilloscope.py
index 317fe4554c60..a44ace53ec27 100755
--- a/tuna/oscilloscope.py
+++ b/tuna/oscilloscope.py
@@ -8,20 +8,7 @@
# http://git.kernel.org/?p=linux/kernel/git/acme/tuna.git;a=tree
# For newer versions and to see it integrated with tuna
#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-# USA
+# SPDX-License-Identifier: LGPL-2.1-only
import os
import sys
diff --git a/tuna/sysfs.py b/tuna/sysfs.py
index 1c903e106a44..cd2377a8df26 100755
--- a/tuna/sysfs.py
+++ b/tuna/sysfs.py
@@ -1,5 +1,7 @@
# -*- python -*-
# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: GPL-2.0-only
+
"""
classes for /sys/devices/system/cpu/
so we can get topology information and do CPU hotplug operations
diff --git a/tuna/tuna.py b/tuna/tuna.py
index e527facb151c..bd678e2dc7ae 100755
--- a/tuna/tuna.py
+++ b/tuna/tuna.py
@@ -1,5 +1,6 @@
# -*- python -*-
# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: GPL-2.0-only
import copy
import errno
@@ -647,12 +648,12 @@ def generate_rtgroups(filename, kthreads, nr_cpus):
f.write('''# Generated by tuna
#
# Use it with rtctl:
-#
+#
# rtctl --file %s reset
#
# Please use 'man rtctl' for more operations
#
-# Associate processes into named groups with default priority and
+# Associate processes into named groups with default priority and
# scheduling policy.
#
# Format is: <groupname>:<sched>:<prio>:<regex>
@@ -661,7 +662,7 @@ def generate_rtgroups(filename, kthreads, nr_cpus):
# sched must be one of: 'f' (fifo)
# 'b' (batch)
# 'r' (round-robin)
-# 'o' (other)
+# 'o' (other)
# '*' (leave alone)
# regex is an awk regex
#
diff --git a/tuna/tuna_gui.py b/tuna/tuna_gui.py
index 459f90303ed5..cefee4a57697 100755
--- a/tuna/tuna_gui.py
+++ b/tuna/tuna_gui.py
@@ -1,5 +1,6 @@
# -*- python -*-
# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: GPL-2.0-only
import sys
import os
diff --git a/tuna/tuna_sched.py b/tuna/tuna_sched.py
index de9846bb5fae..1051983e53f9 100644
--- a/tuna/tuna_sched.py
+++ b/tuna/tuna_sched.py
@@ -1,5 +1,6 @@
#!/usr/bin/python3
# Copyright (C) 2022 John Kacur
+# SPDX-License-Identifier: GPL-2.0-only
"""
Functions to translate a scheduling policy into either a string name or an
equivalent integer
--
2.41.0

View File

@ -1,148 +0,0 @@
From b04ce6fa8b183f6a930fbff240eff44efe801f91 Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Mon, 14 Nov 2022 14:55:08 -0500
Subject: [PATCH] tuna: Adapt show_threads cgroup output to terminal size
Passing the --cgroup flag to the show_threads command currently displays
long cgroup strings on the thread output and decreases readability.
Adapt the show_threads output to account for output string and terminal
size, and format output accordingly to improve readability. Add
--spaced flag to show_threads to print cgroups with spacing in
between thread outputs.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
---
target branch: main
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/docs/tuna.8 b/docs/tuna.8
index f50a8c2a0a16..242389455f83 100644
--- a/docs/tuna.8
+++ b/docs/tuna.8
@@ -188,6 +188,7 @@ optional arguments:
Operation will affect children threads
-G, --cgroups Display the processes with the type of cgroups they
are in
+ -z, --spaced Display spaced view for cgroups
.TP
\fBtuna show_irqs\fR
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 8be35f7fb4c4..630c8bc60deb 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -114,6 +114,7 @@ def gen_parser():
"sockets": dict(dest='cpu_list', default=[], metavar='CPU-SOCKET-LIST', type=socketstring_to_list, help="CPU-SOCKET-LIST affected by commands"),
"show_sockets": dict(action='store_true', help='Show network sockets in use by threads'),
"cgroups": dict(action='store_true', dest='cgroups', help='Display the processes with the type of cgroups they are in'),
+ "spaced": dict(action='store_false', dest='compact', help='Display spaced view for cgroups'),
"affect_children": dict(action='store_true', help="Operation will affect children threads"),
"nohz_full": dict(action='store_true', help="CPUs in nohz_full kernel command line will be affected by operations"),
"no_uthreads": dict(action='store_false', dest='uthreads', help="Operations will not affect user threads"),
@@ -215,6 +216,7 @@ def gen_parser():
if have_inet_diag:
show_threads.add_argument('-n', '--show_sockets', **MODS['show_sockets'])
show_threads.add_argument('-G', '--cgroups', **MODS['cgroups'])
+ show_threads.add_argument('-z', '--spaced', **MODS['spaced'])
show_irqs_group = show_irqs.add_mutually_exclusive_group(required=False)
@@ -335,7 +337,7 @@ def format_affinity(affinity):
return ",".join(str(hex(a)) for a in procfs.hexbitmask(affinity, get_nr_cpus()))
def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes,
- sock_inode_re, cgroups):
+ sock_inode_re, cgroups, columns=None, compact=True):
global irqs
try:
affinity = format_affinity(os.sched_getaffinity(pid))
@@ -372,10 +374,20 @@ def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes,
nonvoluntary_ctxt_switches)
# Indent affected children
- print(" %-5d " % pid if affect_children else " %-5d" % pid, end=' ')
- print("%6s %5d %8s%s %15s %s" % (sched, rtprio, affinity,
- ctxt_switch_info, cmd, users), end=' ')
- print(" %9s" % cgout if cgroups else "")
+ s1 = " %-5d " % pid if affect_children else " %-5d" % pid
+ print(s1, end=' ')
+ s2 = "%6s %5d %8s%s %15s %s" % (sched, rtprio, affinity,
+ ctxt_switch_info, cmd, users)
+ print(s2, end=' ')
+
+ if cgroups:
+ length = int(columns) - len(s1 + " ") - len(s2 + " ")
+ if len(" %9s" % cgout) <= length:
+ print("%s" % cgout)
+ else:
+ print("\n %s" % cgout + ("" if compact else "\n"))
+ else:
+ print()
if sock_inodes:
ps_show_sockets(pid, ps, sock_inodes, sock_inode_re,
@@ -384,12 +396,12 @@ def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes,
for tid in list(ps[pid]["threads"].keys()):
ps_show_thread(tid, False, ps[pid]["threads"],
has_ctxt_switch_info,
- sock_inodes, sock_inode_re, cgroups)
+ sock_inodes, sock_inode_re, cgroups, columns, compact)
def ps_show(ps, affect_children, thread_list, cpu_list,
irq_list_numbers, show_uthreads, show_kthreads,
- has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups):
+ has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups, compact):
ps_list = []
for pid in list(ps.keys()):
@@ -426,9 +438,15 @@ def ps_show(ps, affect_children, thread_list, cpu_list,
ps_list.sort()
+
+ # Width of terminal in columns
+ columns = None
+ if cgroups:
+ _, columns = os.popen('stty size', 'r').read().split()
+
for pid in ps_list:
ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info,
- sock_inodes, sock_inode_re, cgroups)
+ sock_inodes, sock_inode_re, cgroups, columns, compact)
def load_socktype(socktype, inodes):
@@ -449,7 +467,7 @@ def load_sockets():
def do_ps(thread_list, cpu_list, irq_list, show_uthreads, show_kthreads,
- affect_children, show_sockets, cgroups):
+ affect_children, show_sockets, cgroups, compact):
ps = procfs.pidstats()
if affect_children:
ps.reload_threads()
@@ -466,7 +484,7 @@ def do_ps(thread_list, cpu_list, irq_list, show_uthreads, show_kthreads,
ps_show_header(has_ctxt_switch_info, cgroups)
ps_show(ps, affect_children, thread_list,
cpu_list, irq_list, show_uthreads, show_kthreads,
- has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups)
+ has_ctxt_switch_info, sock_inodes, sock_inode_re, cgroups, compact)
except IOError:
# 'tuna -P | head' for instance
pass
@@ -698,7 +716,7 @@ def main():
elif args.command in ['show_threads']:
do_ps(args.thread_list, args.cpu_list, args.irq_list, args.uthreads,
- args.kthreads, args.affect_children, args.show_sockets if "show_sockets" in args else None, args.cgroups)
+ args.kthreads, args.affect_children, args.show_sockets if "show_sockets" in args else None, args.cgroups, args.compact)
elif args.command in ['show_irqs']:
show_irqs(args.irq_list, args.cpu_list)
--
2.31.1

View File

@ -1,137 +0,0 @@
From 87f6d9e29bab615b03b26210e3ead493fd08fe1f Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Thu, 8 Sep 2022 14:49:35 -0400
Subject: [PATCH 3/6] tuna: Add --sockets command line option
The getopt version of tuna implements the --sockets argument which is used
to specify a cpulist from the cpu sockets on a system. The --sockets
and --cpus arguments in the getopt version override each other, such
that 'tuna -S 0 -c 1,2' will cause a cpu_list of [1, 2].
In the argparse cli, add support for a --sockets argument used to specify a
cpulist and is mutually exclusive with the --cpus and --nohz_full arguments.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 554912057f03..9a3d3f32398b 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -112,7 +112,7 @@ def gen_parser():
"threads": dict(dest='thread_list', default=[], metavar='THREAD-LIST', type=threadstring_to_list, help="THREAD-LIST affected by commands"),
"irqs": dict(dest='irq_list', default=[], metavar='IRQ-LIST', type=irqstring_to_list, help="IRQ-LIST affect by commands"),
"cpus": dict(dest='cpu_list', default=[], metavar='CPU-LIST', type=tuna.cpustring_to_list, help='CPU-LIST affected by commands'),
- "sockets": dict(default=[], nargs='+', type=int, help="CPU-SOCKET-LIST affected by commands"),
+ "sockets": dict(dest='cpu_list', default=[], metavar='CPU-SOCKET-LIST', type=socketstring_to_list, help="CPU-SOCKET-LIST affected by commands"),
"show_sockets": dict(action='store_true', help='Show network sockets in use by threads'),
"cgroups": dict(action='store_true', dest='cgroups', help='Display the processes with the type of cgroups they are in'),
"affect_children": dict(action='store_true', help="Operation will affect children threads"),
@@ -159,20 +159,24 @@ def gen_parser():
isolate_group = isolate.add_mutually_exclusive_group(required=True)
isolate_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ isolate_group.add_argument('-S', '--sockets', **MODS['sockets'])
isolate_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
include_group = include.add_mutually_exclusive_group(required=True)
include_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ include_group.add_argument('-S', '--sockets', **MODS['sockets'])
include_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
move_group = move.add_mutually_exclusive_group(required=True)
move_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ move_group.add_argument('-S', '--sockets', **MODS['sockets'])
move_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
move.add_argument('-t', '--threads', **MODS['threads'])
move.add_argument('-q', '--irqs', **MODS['irqs'])
spread_group = spread.add_mutually_exclusive_group(required=True)
spread_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ spread_group.add_argument('-S', '--sockets', **MODS['sockets'])
spread_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
spread.add_argument('-t', '--threads', **MODS['threads'])
spread.add_argument('-q', '--irqs', **MODS['irqs'])
@@ -182,12 +186,18 @@ def gen_parser():
priority.add_argument('-C', '--affect_children', **MODS['affect_children'])
run.add_argument('run_command', **POS['run_command'])
- run.add_argument('-c', '--cpus', **MODS['cpus'])
+ run_group = run.add_mutually_exclusive_group(required=False)
+ run_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ run_group.add_argument('-S', '--sockets', **MODS['sockets'])
+ run_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
run.add_argument('-p', '--priority', **MODS['priority'])
run.add_argument('-b', '--background', **MODS['background'])
save.add_argument('filename', **POS['filename'])
- save.add_argument('-c', '--cpus', **MODS['cpus'])
+ save_group = save.add_mutually_exclusive_group(required=False)
+ save_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ save_group.add_argument('-S', '--sockets', **MODS['sockets'])
+ save_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
save.add_argument('-t', '--threads', **MODS['threads'])
apply.add_argument('profilename', **POS['profilename'])
@@ -195,6 +205,7 @@ def gen_parser():
show_threads_group1 = show_threads.add_mutually_exclusive_group(required=False)
show_threads_group1.add_argument('-c', '--cpus', **MODS['cpus'])
show_threads_group1.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ show_threads_group1.add_argument('-S', '--sockets', **MODS['sockets'])
show_threads_group2 = show_threads.add_mutually_exclusive_group(required=False)
show_threads_group2.add_argument('-t', '--threads', **MODS['threads'])
show_threads_group2.add_argument('-q', '--irqs', **MODS['irqs'])
@@ -206,14 +217,21 @@ def gen_parser():
show_threads.add_argument('-n', '--show_sockets', **MODS['show_sockets'])
show_threads.add_argument('-G', '--cgroups', **MODS['cgroups'])
- show_irqs.add_argument('-c', '--cpus', **MODS['cpus'])
+
+ show_irqs_group = show_irqs.add_mutually_exclusive_group(required=False)
+ show_irqs_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ show_irqs_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ show_irqs_group.add_argument('-S', '--sockets', **MODS['sockets'])
show_irqs.add_argument('-q', '--irqs', **MODS['irqs'])
what_is.add_argument('thread_list', **POS['thread_list'])
gui.add_argument('-d', '--disable_perf', **MODS['disable_perf'])
gui.add_argument('-R', '--refresh', **MODS['refresh'])
- gui.add_argument('-c', '--cpus', **MODS['cpus'])
+ gui_group = gui.add_mutually_exclusive_group(required=False)
+ gui_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ gui_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ gui_group.add_argument('-S', '--sockets', **MODS['sockets'])
gui.add_argument('-U', '--no_uthreads', **MODS['no_uthreads'])
gui.add_argument('-K', '--no_kthreads', **MODS['no_kthreads'])
@@ -536,7 +554,6 @@ def irqstring_to_list(irqstr):
irq_list = []
irq_strings = list(set(irqstr.split(',')))
- print(irq_strings)
for s in irq_strings:
if s.isdigit():
irq_list.append(int(s))
@@ -546,6 +563,18 @@ def irqstring_to_list(irqstr):
irq_list += [int(i) for i in irq_list_str if i.isdigit()]
return irq_list
+def socketstring_to_list(socketstr):
+ cpu_list = []
+ socket_strings = list(set(socketstr.split(',')))
+ cpu_info = sysfs.cpus()
+
+ for s in socket_strings:
+ if s not in cpu_info.sockets:
+ print("tuna: invalid socket %(socket)s sockets available: %(available)s" %
+ {"socket": s,"available": ",".join(list(cpu_info.sockets.keys()))})
+ sys.exit(2)
+ cpu_list += [int(cpu.name[3:]) for cpu in cpu_info.sockets[s]]
+ return cpu_list
def pick_op(argument):
if argument == "":
--
2.31.1

View File

@ -0,0 +1,34 @@
From 5c2ff1e15bbce8d76a038de55abc20e8b3164bb7 Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
Date: Mon, 11 Dec 2023 16:35:03 -0500
Subject: [PATCH] tuna: Don't start the gui if a display is not available
This is intended for the main branch of tuna.
Don't start the gui if a display is not available.
Signed-off-by: John Kacur <jkacur@redhat.com>
---
tuna-cmd.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tuna-cmd.py b/tuna-cmd.py
index e953869c4f48..f37e286bffdb 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -736,6 +736,12 @@ def main():
thread_help(tid)
elif args.command in ['g', 'gui']:
+ # Don't try to start the gui if no display is available
+ display = os.getenv("DISPLAY")
+ if not display:
+ parser.print_help()
+ return
+
try:
from tuna import tuna_gui
except ImportError:
--
2.42.0

View File

@ -1,49 +0,0 @@
From 3f1fbb092f5ef07d04fef7ddec9e538f36d84450 Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
Date: Fri, 2 Sep 2022 11:55:07 -0400
Subject: [PATCH 5/6] tuna: Fix matching irqs in ps_show_thread
To new format to match irqs is "irqs/"
We already test this when we call is_irq_thread(cmd):
With this fix if you do
tuna show_threads
You will get nic information that was previously missed such as
986 FIFO 50 9 69286 2 irq/164-iwlwifi:default_que
ue iwlwifi:default_queue
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index b13b25b8a801..80e27523acc6 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -351,17 +351,12 @@ def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes,
try:
if not irqs:
irqs = procfs.interrupts()
- if cmd[:4] == "IRQ-":
- users = irqs[tuna.irq_thread_number(cmd)]["users"]
- for u in users:
- if u in get_nics():
- users[users.index(u)] = "%s(%s)" % (
- u, ethtool.get_module(u))
- users = ",".join(users)
- else:
- u = cmd[cmd.find('-') + 1:]
+ users = irqs[tuna.irq_thread_number(cmd)]["users"]
+ for u in users:
if u in get_nics():
- users = ethtool.get_module(u)
+ users[users.index(u)] = "%s(%s)" % (
+ u, ethtool.get_module(u))
+ users = ",".join(users)
except:
users = "Not found in /proc/interrupts!"
--
2.31.1

View File

@ -1,42 +0,0 @@
From 4ccef8c2996e59e7031e77d7f8e2b42b73036210 Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Wed, 23 Nov 2022 14:14:36 -0500
Subject: [PATCH] tuna: Fix show_threads --cgroups run without a term
When tuna show_threads --cgroups is run without a term,
provide a default column size of 80 to fix a traceback
that occurred when querying the terminal size.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
- Edited the commit title
- Edited the description
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 630c8bc..4e809dd 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -31,6 +31,7 @@ import procfs
from tuna import tuna, sysfs
import logging
import time
+import shutil
def get_loglevel(level):
if level.isdigit() and int(level) in range(0,5):
@@ -440,9 +441,10 @@ def ps_show(ps, affect_children, thread_list, cpu_list,
# Width of terminal in columns
- columns = None
+ columns = 80
if cgroups:
- _, columns = os.popen('stty size', 'r').read().split()
+ if os.isatty(sys.stdout.fileno()):
+ columns = shutil.get_terminal_size().columns
for pid in ps_list:
ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info,
--
2.38.1

View File

@ -1,48 +0,0 @@
From 9dd8c3e889fe632405561cc8476ed42659a99e2e Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Thu, 4 Aug 2022 09:39:11 -0400
Subject: [PATCH 2/6] tuna: Move get_policy_and_rtprio call to parser level
Due to the implementation of the parser for the priority action,
the valid policy and rtprio input can be checked at the parser level.
Call get_policy_and_rtprio on `priority` and `run --priority` commands
at argparse level.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index f49cce4d84d4..554912057f03 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -102,7 +102,7 @@ def gen_parser():
"filename": dict(metavar='FILENAME', type=str, help="Save kthreads sched tunables to this file"),
"profilename": dict(type=str, help="Apply changes described in this file"),
"run_command": dict(metavar='COMMAND', type=str, help="fork a new process and run the \"COMMAND\""),
- "priority": dict(type=str, help="policy/priority help"),
+ "priority": dict(type=tuna.get_policy_and_rtprio, help="policy/priority help"),
}
MODS = {
diff --git a/tuna/tuna.py b/tuna/tuna.py
index 8650f11c81c3..30a5a570c9d4 100755
--- a/tuna/tuna.py
+++ b/tuna/tuna.py
@@ -558,11 +558,8 @@ def thread_set_priority(tid, policy, rtprio):
os.sched_setscheduler(tid, policy, param)
def threads_set_priority(tids, parm, affect_children=False):
- try:
- (policy, rtprio) = get_policy_and_rtprio(parm)
- except ValueError:
- print("tuna: " + _("\"%s\" is an unsupported priority value!") % parm[0])
- return
+
+ (policy, rtprio) = parm
for tid in tids:
try:
--
2.31.1

View File

@ -0,0 +1,220 @@
From 0c93bd0f26c3d7abda51e51a43ea979ecd794cc9 Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
Date: Wed, 18 Oct 2023 10:54:49 -0400
Subject: [PATCH 2/2] tuna: Remove spec file from git
The specfile should be maintained in the distribution and not upstream
The specfile that is upstream is largely unmaintained anyway.
This change also guts the Makefile which uses the specfile.
Most of the functionality in the Makefile is available through tools
such as rpmbuild anyway. Leaving the Makefile in place for a few
minor things like makeing tagfiles
Signed-off-by: John Kacur <jkacur@redhat.com>
---
Makefile | 39 +------------
rpm/SPECS/tuna.spec | 137 --------------------------------------------
2 files changed, 3 insertions(+), 173 deletions(-)
delete mode 100644 rpm/SPECS/tuna.spec
diff --git a/Makefile b/Makefile
index a3d71d2de896..a55821a8f908 100644
--- a/Makefile
+++ b/Makefile
@@ -1,42 +1,8 @@
#
# SPDX-License-Identifier: GPL-2.0-only
#
-PACKAGE := tuna
-VERSION := $(shell rpm -q --qf '%{VERSION} ' --specfile rpm/SPECS/$(PACKAGE).spec | cut -d' ' -f1)
-
-rpmdirs:
- @[ -d rpm/BUILD ] || mkdir rpm/BUILD
- @[ -d rpm/RPMS ] || mkdir rpm/RPMS
- @[ -d rpm/SRPMS ] || mkdir rpm/SRPMS
- @[ -d rpm/SOURCES ] || mkdir rpm/SOURCES
-
-bz2: rpmdirs
- git archive --format=tar --prefix=$(PACKAGE)-$(VERSION)/ HEAD | \
- bzip2 -9 > rpm/SOURCES/$(PACKAGE)-$(VERSION).tar.bz2
-
-rpm: bz2 rpmdirs
- rpmbuild -ba --define "_topdir $(PWD)/rpm" rpm/SPECS/$(PACKAGE).spec
-
-bz2dev: rpmdirs
- @mkdir -p /tmp/$(PACKAGE)-$(VERSION)
- @tar cf - `cat MANIFEST` | (cd /tmp/$(PACKAGE)-$(VERSION) ; tar xf -)
- @(cd /tmp; tar cf - $(PACKAGE)-$(VERSION)) | bzip2 -9 > rpm/SOURCES/$(PACKAGE)-$(VERSION).tar.bz2
-
-rpmdev: bz2dev rpmdirs
- rpmbuild -ba --define "_topdir $(PWD)/rpm" rpm/SPECS/$(PACKAGE).spec
-
-po/$(PACKAGE).pot:
- xgettext -k_ -kN_ -f po/POTFILES.in -o $@
-
-po/%.po: po/$(PACKAGE).pot
- msgmerge --suffix=.old -U $@ $< && rm -f $@.old
-
-rpmclean:
- @rm -f rpm/RPMS/*/$(PACKAGE)-$(VERSION)-*.rpm
- @rm -f rpm/SRPMS/$(PACKAGE)-$(VERSION)-*.src.rpm
- @rm -f rpm/SOURCES/$(PACKAGE)-$(VERSION).tar.bz2
- @rm -rf rpm/BUILD/$(PACKAGE)-$(VERSION)*
+.PHONY: pyclean
pyclean:
@find . -type f \( -name \*~ -o -name \*.pyc \) -delete
@@ -52,4 +18,5 @@ cleantags:
cleanlogs:
rm -rf tuna-20*
-clean: pyclean rpmclean
+.PHONY: clean
+clean: pyclean
diff --git a/rpm/SPECS/tuna.spec b/rpm/SPECS/tuna.spec
deleted file mode 100644
index eca96c833265..000000000000
--- a/rpm/SPECS/tuna.spec
+++ /dev/null
@@ -1,137 +0,0 @@
-Name: tuna
-Version: 0.15
-Release: 1%{?dist}
-License: GPLv2
-Summary: Application tuning GUI & command line utility
-Group: Applications/System
-Source: http://userweb.kernel.org/~acme/tuna/%{name}-%{version}.tar.bz2
-URL: http://userweb.kernel.org/~acme/tuna/
-BuildArch: noarch
-BuildRequires: python-devel, gettext, desktop-file-utils
-Requires: python-ethtool
-Requires: python-linux-procfs >= 0.6
-# This really should be a Suggests...
-# Requires: python-inet_diag
-BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
-
-%description
-Provides interface for changing scheduler and IRQ tunables, at whole CPU and at
-per thread/IRQ level. Allows isolating CPUs for use by a specific application
-and moving threads and interrupts to a CPU by just dragging and dropping them.
-Operations can be done on CPU sockets, understanding CPU topology.
-
-Can be used as a command line utility without requiring the GUI libraries to be
-installed.
-
-%package -n oscilloscope
-Summary: Generic graphical signal plotting tool
-Group: Applications/System
-Requires: python-matplotlib
-Requires: numpy
-Requires: pygtk2
-Requires: tuna = %{version}-%{release}
-
-%description -n oscilloscope
-Plots stream of values read from standard input on the screen together with
-statistics and a histogram.
-
-Allows to instantly see how a signal generator, such as cyclictest, signaltest
-or even ping, reacts when, for instance, its scheduling policy or real time
-priority is changed, be it using tuna or plain chrt & taskset.
-
-%prep
-%setup -q
-
-%build
-%{python3} setup.py build
-
-%install
-rm -rf %{buildroot}
-%{python3} setup.py install --skip-build --root %{buildroot}
-mkdir -p %{buildroot}/%{_sysconfdir}/tuna/
-mkdir -p %{buildroot}/{%{_bindir},%{_datadir}/tuna/help/kthreads,%{_mandir}/man8}
-mkdir -p %{buildroot}/%{_datadir}/polkit-1/actions/
-install -p -m644 tuna/tuna_gui.glade %{buildroot}/%{_datadir}/tuna/
-install -p -m755 tuna-cmd.py %{buildroot}/%{_bindir}/tuna
-install -p -m755 oscilloscope-cmd.py %{buildroot}/%{_bindir}/oscilloscope
-install -p -m644 help/kthreads/* %{buildroot}/%{_datadir}/tuna/help/kthreads/
-install -p -m644 docs/tuna.8 %{buildroot}/%{_mandir}/man8/
-install -p -m644 etc/tuna/example.conf %{buildroot}/%{_sysconfdir}/tuna/
-install -p -m644 etc/tuna.conf %{buildroot}/%{_sysconfdir}/
-install -p -m644 org.tuna.policy %{buildroot}/%{_datadir}/polkit-1/actions/
-desktop-file-install --dir=%{buildroot}/%{_datadir}/applications tuna.desktop
-
-# l10n-ed message catalogues
-for lng in `cat po/LINGUAS`; do
- po=po/"$lng.po"
- mkdir -p %{buildroot}/%{_datadir}/locale/${lng}/LC_MESSAGES
- msgfmt $po -o %{buildroot}/%{_datadir}/locale/${lng}/LC_MESSAGES/%{name}.mo
-done
-
-%find_lang %name
-
-%clean
-rm -rf %{buildroot}
-
-%files -f %{name}.lang
-%defattr(-,root,root,-)
-%doc ChangeLog
-%if "%{python_ver}" >= "2.5"
-%{python2_sitelib}/*.egg-info
-%endif
-%{_bindir}/tuna
-%{_datadir}/tuna/
-%{python3_sitelib}/tuna/
-%{_mandir}/man8/tuna.8*
-%{_sysconfdir}/tuna.conf
-%{_sysconfdir}/tuna/*
-%{_datadir}/polkit-1/actions/org.tuna.policy
-%{_datadir}/applications/tuna.desktop
-
-%files -n oscilloscope
-%defattr(-,root,root,-)
-%{_bindir}/oscilloscope
-%doc docs/oscilloscope+tuna.html
-%doc docs/oscilloscope+tuna.pdf
-
-%changelog
-* Fri Feb 1 2013 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.10.4-1
-- New upstream release
-
-* Fri Aug 24 2012 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.10.3-1
-- New upstream release
-
-* Thu Jul 28 2011 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.10.2-1
-- New upstream release
-
-* Wed Feb 23 2011 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.10.1-1
-- New upstream release
-
-* Wed Feb 23 2011 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.10-1
-- New upstream release
-
-* Mon May 17 2010 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9.3-1
-- New upstream release
-- Fixes the folowing bugzilla.redhat.com tickets:
-- 563355 error in tuna --help output
-- 574950 cannot use cpu ranges in the tuna GUI
-- 559770 tuna backtrace when moving threads
-- 563352 tuna backtrace when no thread list is given for --priority
-- 563350 tuna backtrace when scheduler is mis-typed.
-
-* Thu Nov 12 2009 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9.2-1
-- New upstream release
-
-* Thu Sep 03 2009 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9.1-1
-- New upstream release
-
-* Wed Aug 26 2009 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9-3
-- Rewrite the oscilloscope package summary
-- Remove the shebang in tuna/oscilloscope.py
-
-* Mon Aug 17 2009 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9-2
-- Use install -p
-- Add BuildRequires for gettext
-
-* Fri Jul 10 2009 Arnaldo Carvalho de Melo <acme@redhat.com> - 0.9-1
-- Fedora package reviewing changes: introduce ChangeLog file
--
2.41.0

View File

@ -1,24 +0,0 @@
From b82d9037fe7f51e49a9b3c84b1ccb71fda1e1f61 Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Tue, 25 Oct 2022 16:19:25 -0400
Subject: [PATCH 6/6] tuna: Remove threads print statement
Remove unnecessary print statement from threadstring_to_list function
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 80e27523acc6..c5bc65059da7 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -533,7 +533,6 @@ def threadstring_to_list(threadstr):
global ps
thread_list = []
thread_strings = list(set(threadstr.split(',')))
- print(thread_strings)
for s in thread_strings:
if s.isdigit():
thread_list.append(int(s))
--
2.31.1

View File

@ -1,97 +0,0 @@
From f2a28b05264fa9557192b73a1b888756748930ac Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
Date: Tue, 27 Sep 2022 12:59:54 -0400
Subject: [PATCH 4/6] tuna: Replace python_ethtool with builtin funtionality
This patch replaces the dependency on python_ethtool with some
simplified functions to achieve the same result.
Reviewed-by: Federico Pellegrin <fede@evolware.org>
- return 'tun' only if tun_flags exists
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 9a3d3f32398b..b13b25b8a801 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -26,7 +26,7 @@ import fnmatch
import gettext
import locale
from functools import reduce
-import ethtool
+import tuna.new_eth as ethtool
import tuna.tuna_sched as tuna_sched
import procfs
from tuna import tuna, sysfs
diff --git a/tuna/gui/irqview.py b/tuna/gui/irqview.py
index 35fc3fd0b0ca..5143d6dc0df5 100755
--- a/tuna/gui/irqview.py
+++ b/tuna/gui/irqview.py
@@ -7,7 +7,7 @@ from gi.repository import Gtk
from gi.repository import GObject
import os
from functools import reduce
-import ethtool
+import tuna.new_eth as ethtool
import tuna.tuna_sched as tuna_sched
import gi
diff --git a/tuna/new_eth.py b/tuna/new_eth.py
new file mode 100755
index 000000000000..98f9179d5695
--- /dev/null
+++ b/tuna/new_eth.py
@@ -0,0 +1,37 @@
+# Copyright (C) 2022 John Kacur
+""" A few functions similar to ethtool """
+import os
+import socket
+
+def get_active_devices():
+ """ return a list of network devices """
+ ret = []
+
+ for device in socket.if_nameindex():
+ ret.append(device[1])
+
+ return ret
+
+def get_module(intf):
+ """ return the kernel module for the given network interface """
+ if intf == 'lo':
+ return ""
+ myp = f'/sys/class/net/{intf}/device/driver'
+ if os.path.exists(myp):
+ return os.path.basename(os.readlink(myp))
+ if os.path.exists(f'/sys/class/net/{intf}/bridge'):
+ return 'bridge'
+ if os.path.exists(f'/sys/class/net/{intf}/tun_flags'):
+ return 'tun'
+ return ""
+
+if __name__ == "__main__":
+ nics = get_active_devices()
+ print(f'nics = {nics}')
+
+ for intf in nics:
+ driver = get_module(intf)
+ if driver:
+ print(f'{intf}, {driver}')
+ else:
+ print(f'{intf}')
diff --git a/tuna/tuna.py b/tuna/tuna.py
index 30a5a570c9d4..43adb84079e4 100755
--- a/tuna/tuna.py
+++ b/tuna/tuna.py
@@ -9,7 +9,7 @@ import sys
import shlex
import fnmatch
import platform
-import ethtool
+import tuna.new_eth as ethtool
import procfs
from procfs import utilist
from tuna import help
--
2.31.1

View File

@ -1,733 +0,0 @@
From eba1333c50f8a5eebb12b523c30faffac33681b3 Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Thu, 4 Aug 2022 09:39:10 -0400
Subject: [PATCH 1/6] tuna: Update command-line interface
The current command-line interface allows for chaining of multiple
actions, which results in ambiguous user input, a need for maintaining
variable states (thread-list, cpu-list, etc.) in the program, and a need
to type check input after parsing. The help menu can also be
overwhelming.
Allow for the use of argparse rather than getopt to significantly
simplify the program.
Provide subcommands and clearer usage menus for the user,
introduce type checking at the parser level, and remove
ambiguity for user input.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index bdaa70ffc156..f49cce4d84d4 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -14,8 +14,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
-""" tuna - Application Tuning GUI """
+""" tuna - Application Tuning Program"""
+import argparse
import os
import sys
import errno
@@ -37,7 +38,7 @@ def get_loglevel(level):
# logging built-in module levels:
# 0 - NOTSET
# 10 - DEBUG
- # 20 - INFO,
+ # 20 - INFO
# 30 - WARNING
# 40 - ERROR
return int(level) * 10
@@ -85,70 +86,138 @@ except:
nr_cpus = None
ps = None
irqs = None
-version = "0.18"
-
-
-def usage():
- print(_('Usage: tuna [OPTIONS]'))
- fmt = '\t%-40s %s'
- print(fmt % ('-h, --help', _('Give this help list')))
- print(fmt % ('-a, --config_file_apply=profilename',
- _('Apply changes described in profile')))
- print(fmt % ('-l, --config_file_list',
- _('List preloaded profiles')))
- print(fmt % ('-g, --gui', _('Start the GUI')))
- print(fmt % ('-G, --cgroup',
- _('Display the processes with the type of cgroups they are in')))
- print(fmt % ('-c, --cpus=' + _('CPU-LIST'), _('%(cpulist)s affected by commands') %
- {"cpulist": _('CPU-LIST')}))
- print(fmt % ('-C, --affect_children',
- _('Operation will affect children threads')))
- print(fmt % ('-d, --disable_perf',
- _('Explicitly disable usage of perf in GUI for process view')))
- print(fmt % ('-D, --debug', _('Print DEBUG level logging details to console')))
- print(fmt % ('-f, --filter',
- _('Display filter the selected entities')))
- print(fmt % ('-i, --isolate', _('Move all allowed threads and IRQs away from %(cpulist)s') %
- {"cpulist": _('CPU-LIST')}))
- print(fmt % ('-I, --include', _('Allow all allowed threads and IRQs to run on %(cpulist)s') %
- {"cpulist": _('CPU-LIST')}))
- print(fmt % ('-K, --no_kthreads',
- _('Operations will not affect kernel threads')))
- print(fmt % ('-L, --logging',
- _('Log application details to log file for given LOG-LEVEL')))
- print(fmt % ('-m, --move', _('Move selected entities to %(cpulist)s') %
- {"cpulist": _('CPU-LIST')}))
- print(fmt % ('-N, --nohz_full',
- _('CPUs in nohz_full= kernel command line will be affected by operations')))
+
+class HelpMessageParser(argparse.ArgumentParser):
+ def error(self, message):
+ sys.stderr.write('error: %s\n' % message)
+ self.print_help()
+ sys.exit(2)
+
+def gen_parser():
+
+
+ POS = {
+ "cpu_list": dict(metavar='CPU-LIST', type=tuna.cpustring_to_list, help="CPU-LIST affected by commands"),
+ "thread_list": dict(metavar='THREAD-LIST', type=threadstring_to_list, help="THREAD-LIST affected by commands"),
+ "filename": dict(metavar='FILENAME', type=str, help="Save kthreads sched tunables to this file"),
+ "profilename": dict(type=str, help="Apply changes described in this file"),
+ "run_command": dict(metavar='COMMAND', type=str, help="fork a new process and run the \"COMMAND\""),
+ "priority": dict(type=str, help="policy/priority help"),
+ }
+
+ MODS = {
+ "logging": dict(dest='loglevel', metavar='LOG-LEVEL', type=get_loglevel, help="Log application details to file for given LOG-LEVEL"),
+ "debug" : dict(action='store_true', dest='debug', help='Print DEBUG level logging details to console'),
+ "version": dict(action='version', version='0.18', help="show version"),
+ "threads": dict(dest='thread_list', default=[], metavar='THREAD-LIST', type=threadstring_to_list, help="THREAD-LIST affected by commands"),
+ "irqs": dict(dest='irq_list', default=[], metavar='IRQ-LIST', type=irqstring_to_list, help="IRQ-LIST affect by commands"),
+ "cpus": dict(dest='cpu_list', default=[], metavar='CPU-LIST', type=tuna.cpustring_to_list, help='CPU-LIST affected by commands'),
+ "sockets": dict(default=[], nargs='+', type=int, help="CPU-SOCKET-LIST affected by commands"),
+ "show_sockets": dict(action='store_true', help='Show network sockets in use by threads'),
+ "cgroups": dict(action='store_true', dest='cgroups', help='Display the processes with the type of cgroups they are in'),
+ "affect_children": dict(action='store_true', help="Operation will affect children threads"),
+ "nohz_full": dict(action='store_true', help="CPUs in nohz_full kernel command line will be affected by operations"),
+ "no_uthreads": dict(action='store_false', dest='uthreads', help="Operations will not affect user threads"),
+ "no_kthreads": dict(action='store_false', dest='kthreads', help="Operations will not affect kernel threads"),
+ "disable_perf": dict(action='store_true', help="Explicitly disable usage of perf in GUI for process view"),
+ "refresh": dict(default=2500, metavar='MSEC', type=int, help="Refresh the GUI every MSEC milliseconds"),
+ "priority": dict(default=(None, None), type=tuna.get_policy_and_rtprio, help="Set thread scheduler tunables: POLICY and RTPRIO"),
+ "background": dict(action='store_true', help="Run command as background task")
+ }
+
+ parser = HelpMessageParser(description="tuna - Application Tuning Program")
+
+ parser._positionals.title = "commands"
+ parser.add_argument('-v', '--version', **MODS['version'])
+ parser.add_argument('-L', '--logging', **MODS['logging'])
+ parser.add_argument('-D', '--debug', **MODS['debug'])
+
+ subparser = parser.add_subparsers(dest='command')
+
+ isolate = subparser.add_parser('isolate', description="Move all allowed threads and IRQs away from CPU-LIST",
+ help="Move all allowed threads and IRQs away from CPU-LIST")
+ include = subparser.add_parser('include', description="Allow all threads to run on CPU-LIST",
+ help="Allow all threads to run on CPU-LIST")
+ move = subparser.add_parser('move', description="Move selected entities to CPU-LIST",
+ help="Move selected entities to CPU-LIST")
+ spread = subparser.add_parser('spread', description="Move selected entities to CPU-LIST",
+ help="Spread selected entities over CPU-LIST")
+ priority = subparser.add_parser('priority', description="Set thread scheduler tunables: POLICY and RTPRIO",
+ help="Set thread scheduler tunables: POLICY and RTPRIO")
+ run = subparser.add_parser('run', description="Fork a new process and run the COMMAND",
+ help="Fork a new process and run the COMMAND")
+ save = subparser.add_parser('save', description="Save kthreads sched tunables to FILENAME",
+ help="Save kthreads sched tunables to FILENAME")
+ apply = subparser.add_parser('apply', description="Apply changes described in profile",
+ help="Apply changes described in profile")
+ show_threads = subparser.add_parser('show_threads', description='Show thread list', help='Show thread list')
+ show_irqs = subparser.add_parser('show_irqs', description='Show IRQ list', help='Show IRQ list')
+ show_configs = subparser.add_parser('show_configs', description='List preloaded profiles', help='List preloaded profiles')
+
+ what_is = subparser.add_parser('what_is', description='Provides help about selected entities', help='Provides help about selected entities')
+ gui = subparser.add_parser('gui', description="Start the GUI", help="Start the GUI")
+
+ isolate_group = isolate.add_mutually_exclusive_group(required=True)
+ isolate_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ isolate_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+
+ include_group = include.add_mutually_exclusive_group(required=True)
+ include_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ include_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+
+ move_group = move.add_mutually_exclusive_group(required=True)
+ move_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ move_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ move.add_argument('-t', '--threads', **MODS['threads'])
+ move.add_argument('-q', '--irqs', **MODS['irqs'])
+
+ spread_group = spread.add_mutually_exclusive_group(required=True)
+ spread_group.add_argument('-c', '--cpus', **MODS['cpus'])
+ spread_group.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ spread.add_argument('-t', '--threads', **MODS['threads'])
+ spread.add_argument('-q', '--irqs', **MODS['irqs'])
+
+ priority.add_argument('priority', **POS['priority'])
+ priority.add_argument('-t', '--threads', **MODS['threads'], required=True)
+ priority.add_argument('-C', '--affect_children', **MODS['affect_children'])
+
+ run.add_argument('run_command', **POS['run_command'])
+ run.add_argument('-c', '--cpus', **MODS['cpus'])
+ run.add_argument('-p', '--priority', **MODS['priority'])
+ run.add_argument('-b', '--background', **MODS['background'])
+
+ save.add_argument('filename', **POS['filename'])
+ save.add_argument('-c', '--cpus', **MODS['cpus'])
+ save.add_argument('-t', '--threads', **MODS['threads'])
+
+ apply.add_argument('profilename', **POS['profilename'])
+
+ show_threads_group1 = show_threads.add_mutually_exclusive_group(required=False)
+ show_threads_group1.add_argument('-c', '--cpus', **MODS['cpus'])
+ show_threads_group1.add_argument('-N', '--nohz_full', **MODS['nohz_full'])
+ show_threads_group2 = show_threads.add_mutually_exclusive_group(required=False)
+ show_threads_group2.add_argument('-t', '--threads', **MODS['threads'])
+ show_threads_group2.add_argument('-q', '--irqs', **MODS['irqs'])
+ show_threads.add_argument('-U', '--no_uthreads', **MODS['no_uthreads'])
+ show_threads.add_argument('-K', '--no_kthreads', **MODS['no_kthreads'])
+ show_threads.add_argument('-C', '--affect_children', **MODS['affect_children'])
+
if have_inet_diag:
- print(fmt % ('-n, --show_sockets',
- _('Show network sockets in use by threads')))
- print(fmt % ('-p, --priority=[' +
- _('POLICY') + ':]' +
- _('RTPRIO'), _('Set thread scheduler tunables: %(policy)s and %(rtprio)s') %
- {"policy": _('POLICY'), "rtprio": _('RTPRIO')}))
- print(fmt % ('-P, --show_threads', _('Show thread list')))
- print(fmt % ('-Q, --show_irqs', _('Show IRQ list')))
- print(fmt % ('-q, --irqs=' + _('IRQ-LIST'), _('%(irqlist)s affected by commands') %
- {"irqlist": _('IRQ-LIST')}))
- print(fmt % ('-r, --run=' + _('COMMAND'), _('fork a new process and run the %(command)s') %
- {"command": _('COMMAND')}))
- print(fmt % ('-R, --refresh=' + _('MSEC'), _('Refresh the GUI every MSEC milliseconds')))
- print(fmt % ('-s, --save=' + _('FILENAME'), _('Save kthreads sched tunables to %(filename)s') %
- {"filename": _('FILENAME')}))
- print(fmt % ('-S, --sockets=' +
- _('CPU-SOCKET-LIST'), _('%(cpusocketlist)s affected by commands') %
- {"cpusocketlist": _('CPU-SOCKET-LIST')}))
- print(fmt % ('-t, --threads=' +
- _('THREAD-LIST'), _('%(threadlist)s affected by commands') %
- {"threadlist": _('THREAD-LIST')}))
- print(fmt % ('-U, --no_uthreads',
- _('Operations will not affect user threads')))
- print(fmt % ('-v, --version', _('Show version')))
- print(fmt % ('-W, --what_is',
- _('Provides help about selected entities')))
- print(fmt % ('-x, --spread', _('Spread selected entities over %(cpulist)s') %
- {"cpulist": _('CPU-LIST')}))
+ show_threads.add_argument('-n', '--show_sockets', **MODS['show_sockets'])
+ show_threads.add_argument('-G', '--cgroups', **MODS['cgroups'])
+
+ show_irqs.add_argument('-c', '--cpus', **MODS['cpus'])
+ show_irqs.add_argument('-q', '--irqs', **MODS['irqs'])
+
+ what_is.add_argument('thread_list', **POS['thread_list'])
+
+ gui.add_argument('-d', '--disable_perf', **MODS['disable_perf'])
+ gui.add_argument('-R', '--refresh', **MODS['refresh'])
+ gui.add_argument('-c', '--cpus', **MODS['cpus'])
+ gui.add_argument('-U', '--no_uthreads', **MODS['no_uthreads'])
+ gui.add_argument('-K', '--no_kthreads', **MODS['no_kthreads'])
+
+ return parser
def get_nr_cpus():
@@ -447,39 +516,34 @@ def do_list_op(op, current_list, op_list):
return list(set(current_list) - set(op_list))
return list(set(op_list))
-
-def thread_mapper(s):
+def threadstring_to_list(threadstr):
global ps
- try:
- return [int(s), ]
- except:
- pass
-
- ps = procfs.pidstats()
-
- try:
- return ps.find_by_regex(re.compile(fnmatch.translate(s)))
- except:
- return ps.find_by_name(s)
-
+ thread_list = []
+ thread_strings = list(set(threadstr.split(',')))
+ print(thread_strings)
+ for s in thread_strings:
+ if s.isdigit():
+ thread_list.append(int(s))
+ else:
+ ps = procfs.pidstats()
+ try:
+ thread_list += ps.find_by_regex(re.compile(fnmatch.translate(s)))
+ except:
+ thread_list += ps.find_by_name(s)
+ return thread_list
-def irq_mapper(s):
- global irqs
- try:
- return [int(s), ]
- except:
- pass
- if not irqs:
- irqs = procfs.interrupts()
+def irqstring_to_list(irqstr):
- irq_list_str = irqs.find_by_user_regex(re.compile(fnmatch.translate(s)))
irq_list = []
- for i in irq_list_str:
- try:
- irq_list.append(int(i))
- except:
- pass
-
+ irq_strings = list(set(irqstr.split(',')))
+ print(irq_strings)
+ for s in irq_strings:
+ if s.isdigit():
+ irq_list.append(int(s))
+ else:
+ # find_by_user_regex returns a list of strings corresponding to irq number
+ irq_list_str = procfs.interrupts().find_by_user_regex(re.compile(fnmatch.translate(s)))
+ irq_list += [int(i) for i in irq_list_str if i.isdigit()]
return irq_list
@@ -531,298 +595,123 @@ def list_config():
print(value)
sys.exit(1)
+def nohz_full_to_cpu():
+
+ try:
+ return tuna.nohz_full_list()
+ except:
+ print("tuna: --nohz_full " +
+ _(" needs nohz_full=cpulist on the kernel command line"))
+ sys.exit(2)
def main():
global ps
i18n_init()
- try:
- short = "a:c:dDCfgGhiIKlmNp:PQq:r:R:s:S:t:UvWxL:"
- long = ["cpus=", "affect_children", "filter", "gui", "help",
- "isolate", "include", "no_kthreads", "move", "nohz_full",
- "show_sockets", "priority=", "show_threads",
- "show_irqs", "irqs=",
- "save=", "sockets=", "threads=", "no_uthreads",
- "version", "what_is", "spread", "cgroup", "config_file_apply=",
- "config_file_list", "run=", "refresh=", "disable_perf", "logging=", "debug"]
- if have_inet_diag:
- short += "n"
- long.append("show_sockets")
- opts, args = getopt.getopt(sys.argv[1:], short, long)
- except getopt.GetoptError as err:
- usage()
- print(str(err))
- sys.exit(2)
+ parser = gen_parser()
+ # Set all necessary defaults for gui subparser if no arguments provided
+ args = parser.parse_args() if len(sys.argv) > 1 else parser.parse_args(['gui'])
+
+ if args.debug:
+ my_logger = setup_logging("my_logger")
+ my_logger.addHandler(add_handler("DEBUG", tofile=False))
+ my_logger.info("Debug option set")
+
+ if args.loglevel:
+ if not args.debug:
+ my_logger = setup_logging("my_logger")
+ try:
+ my_logger.addHandler(add_handler(args.loglevel, tofile=True))
+ my_logger.info("Logging option set at log level {}".format(args.loglevel))
- run_gui = not opts
- kthreads = True
- uthreads = True
- cgroups = False
- cpu_list = None
- debug = False
- irq_list = None
- irq_list_str = None
- log = False
- rtprio = None
- policy = None
- thread_list = []
- thread_list_str = None
- filter = False
- affect_children = False
- show_sockets = False
- p_waiting_action = False
- gui_refresh = 2500
- disable_perf = False
-
- for o, a in opts:
- if o in ("-h", "--help"):
- usage()
- return
- if o in ("-D", "--debug"):
- if debug:
- my_logger.warning("Debugging already set")
- continue
- debug = True
- if not log:
- my_logger = setup_logging("my_logger")
- my_logger.addHandler(add_handler("DEBUG", tofile=False))
- my_logger.info("Debug option set")
- if o in ("-L", "--logging"):
- if log:
- my_logger.warning("Logging already set")
- continue
- log = True
- loglevel = get_loglevel(a)
- if not debug:
- my_logger = setup_logging("my_logger")
- try:
- my_logger.addHandler(add_handler(loglevel, tofile=True))
- except ValueError as e:
- print(e, "tuna: --logging requires valid logging level\n")
- print("Valid log levels: NOTSET, DEBUG, INFO, WARNING, ERROR")
- print("Log levels may be specified numerically (0-4)")
- my_logger.info("Logging option set")
- if o in ("-a", "--config_file_apply"):
- apply_config(a)
- elif o in ("-l", "--config_file_list"):
- list_config()
- elif o in ("-c", "--cpus"):
- (op, a) = pick_op(a)
- try:
- op_list = tuna.cpustring_to_list(a)
- except ValueError:
- usage()
- return
- cpu_list = do_list_op(op, cpu_list, op_list)
- elif o in ("-N", "--nohz_full"):
- try:
- cpu_list = tuna.nohz_full_list()
- except:
- print("tuna: --nohz_full " +
- _(" needs nohz_full=cpulist on the kernel command line"))
- sys.exit(2)
- elif o in ("-C", "--affect_children"):
- affect_children = True
- elif o in ("-G", "--cgroup"):
- cgroups = True
- elif o in ("-t", "--threads"):
- # The -t - will reset thread list
- if a == '-':
- thread_list = []
- thread_list_str = ''
- else:
- (op, a) = pick_op(a)
- op_list = reduce(lambda i, j: i + j,
- list(map(thread_mapper, a.split(","))))
- op_list = list(set(op_list))
- thread_list = do_list_op(op, thread_list, op_list)
- # Check if a process name was specified and no
- # threads was found, which would result in an empty
- # thread list, i.e. we would print all the threads
- # in the system when we should print nothing.
- if not op_list and isinstance(a, type('')):
- thread_list_str = do_list_op(op, thread_list_str,
- a.split(","))
- if not op:
- irq_list = None
- elif o in ("-f", "--filter"):
- filter = True
- elif o in ("-g", "--gui"):
- run_gui = True
- elif o in ("-R", "--refresh"):
- run_gui = True
- (op, a) = pick_op(a)
- try:
- gui_refresh=int(a)
- except Exception as err:
- print("tuna: --refresh %s" % err)
- sys.exit(2)
- elif o in ("-d", "--disable_perf"):
- run_gui = True
- disable_perf = True
- elif o in ("-i", "--isolate"):
- if not cpu_list:
- print("tuna: --isolate " + _("requires a cpu list!"))
- sys.exit(2)
- tuna.isolate_cpus(cpu_list, get_nr_cpus())
- elif o in ("-I", "--include"):
- if not cpu_list:
- print("tuna: --include " + _("requires a cpu list!"))
- sys.exit(2)
- tuna.include_cpus(cpu_list, get_nr_cpus())
- elif o in ("-p", "--priority"):
- # Save policy and rtprio for future Actions (e.g. --run).
- try:
- (policy, rtprio) = tuna.get_policy_and_rtprio(a)
- except ValueError:
- print("tuna: " + _("\"%s\" is an unsupported priority value!") % a)
- sys.exit(2)
- if not thread_list:
- # For backward compatibility
- p_waiting_action = True
- else:
- try:
- tuna.threads_set_priority(thread_list, a, affect_children)
- except OSError as err:
- print("tuna: %s" % err)
- sys.exit(2)
- elif o in ("-P", "--show_threads"):
- # If the user specified process names that weren't
- # resolved to pids, don't show all threads.
- if not thread_list and not irq_list:
- if thread_list_str or irq_list_str:
- continue
- do_ps(thread_list, cpu_list, irq_list, uthreads,
- kthreads, affect_children, show_sockets, cgroups)
- elif o in ("-Q", "--show_irqs"):
- # If the user specified IRQ names that weren't
- # resolved to IRQs, don't show all IRQs.
- if not irq_list and irq_list_str:
- continue
- show_irqs(irq_list, cpu_list)
- elif o in ("-n", "--show_sockets"):
- show_sockets = True
- elif o in ("-m", "--move", "-x", "--spread"):
- spread = o in ("-x", "--spread")
- if not cpu_list:
- print("tuna: %s " % ("--spread" if spread else "--move") + _("requires a cpu list!"))
- sys.exit(2)
- if not (thread_list or irq_list):
- print("tuna: %s " % ("--spread" if spread else "--move") + _("requires a list of threads/irqs!"))
- sys.exit(2)
-
- if thread_list:
- tuna.move_threads_to_cpu(cpu_list, thread_list, spread=spread)
-
- if irq_list:
- tuna.move_irqs_to_cpu(cpu_list, irq_list, spread=spread)
- elif o in ("-s", "--save"):
- save(cpu_list, thread_list, a)
- elif o in ("-S", "--sockets"):
- (op, a) = pick_op(a)
- sockets = list(a.split(','))
-
- if not cpu_list:
- cpu_list = []
-
- cpu_info = sysfs.cpus()
- op_list = []
- for socket in sockets:
- if socket not in cpu_info.sockets:
- print("tuna: %s" %
- (_("invalid socket %(socket)s sockets available: %(available)s") %
- {"socket": socket,
- "available": ",".join(list(cpu_info.sockets.keys()))}))
- sys.exit(2)
- op_list += [int(cpu.name[3:])
- for cpu in cpu_info.sockets[socket]]
- cpu_list = do_list_op(op, cpu_list, op_list)
- elif o in ("-K", "--no_kthreads"):
- kthreads = False
- elif o in ("-q", "--irqs"):
- (op, a) = pick_op(a)
- op_list = reduce(lambda i, j: i + j,
- list(map(irq_mapper, list(set(a.split(","))))))
- irq_list = do_list_op(op, irq_list, op_list)
- # See comment above about thread_list_str
- if not op_list and isinstance(a, type('')):
- irq_list_str = do_list_op(op, irq_list_str, a.split(","))
- if not op:
- thread_list = []
- if not ps:
- ps = procfs.pidstats()
- if tuna.has_threaded_irqs(ps):
- for irq in irq_list:
- irq_re = tuna.threaded_irq_re(irq)
- irq_threads = ps.find_by_regex(irq_re)
- if irq_threads:
- # Change the affinity of the thread too
- # as we can't rely on changing the irq
- # affinity changing the affinity of the
- # thread or vice versa. We need to change
- # both.
- thread_list += irq_threads
-
- elif o in ("-U", "--no_uthreads"):
- uthreads = False
- elif o in ("-v", "--version"):
- print(version)
- elif o in ("-W", "--what_is"):
- if not thread_list:
- print("tuna: --what_is " + _("requires a thread list!"))
- sys.exit(2)
- for tid in thread_list:
- thread_help(tid)
- elif o in ("-r", "--run"):
- # If -p is set, it will be consumed. So, no backward compatible
- # error handling action must be taken.
- p_waiting_action = False
-
- # pick_op() before run the command: to remove the prefix
- # + or - from command line.
- (op, a) = pick_op(a)
-
- # In order to include the new process, it must run
- # the command first, and then get the list of pids,
- tuna.run_command(a, policy, rtprio, cpu_list)
-
- op_list = reduce(lambda i, j: i + j,
- list(map(thread_mapper, a.split(","))))
- op_list = list(set(op_list))
- thread_list = do_list_op(op, thread_list, op_list)
-
- # Check if a process name was specified and no
- # threads was found, which would result in an empty
- # thread list, i.e. we would print all the threads
- # in the system when we should print nothing.
- if not op_list and isinstance(a, type('')):
- thread_list_str = do_list_op(op, thread_list_str, a.split(","))
- if not op:
- irq_list = None
-
- # For backward compatibility: when -p used to be only an Action, it
- # used to exit(2) if no action was taken (i.e. if no threads_list
- # was set).
- if p_waiting_action:
- print(("tuna: -p ") + _("requires a thread list!"))
- sys.exit(2)
+ except ValueError as e:
+ print(e, "tuna: --logging requires valid logging level\n")
+ print("Valid log levels: NOTSET, DEBUG, INFO, WARNING, ERROR")
+ print("Log levels may be specified numerically (0-4)\n")
+
+ if 'irq_list' in vars(args):
+ ps = procfs.pidstats()
+ if tuna.has_threaded_irqs(ps):
+ for irq in args.irq_list:
+ irq_re = tuna.threaded_irq_re(irq)
+ irq_threads = ps.find_by_regex(irq_re)
+ if irq_threads:
+ # Change the affinity of the thread too
+ # as we can't rely on changing the irq
+ # affinity changing the affinity of the
+ # thread or vice versa. We need to change
+ # both.
+ if 'thread_list' in vars(args):
+ args.thread_list += irq_threads
+
+ if 'nohz_full' in vars(args) and args.nohz_full:
+ args.cpu_list = nohz_full_to_cpu()
+
+ if args.command in ['apply', 'a']:
+ apply_config(args.profilename)
+
+ elif args.command in ['include', 'I']:
+ tuna.include_cpus(args.cpu_list, get_nr_cpus())
+
+ elif args.command in ['isolate', 'i']:
+ tuna.isolate_cpus(args.cpu_list, get_nr_cpus())
+
+ elif args.command in ['run', 'r']:
+
+ tuna.run_command(args.run_command, args.priority[0], args.priority[1], args.cpu_list, args.background)
+
+ elif args.command in ['priority', 'p']:
+
+ try:
+ tuna.threads_set_priority(args.thread_list, args.priority, args.affect_children)
+ except OSError as err:
+ print("tuna: %s" % err)
+ sys.exit(2)
+
+ elif args.command in ['show_configs']:
+ list_config()
+
+ elif args.command in ['show_threads']:
+ do_ps(args.thread_list, args.cpu_list, args.irq_list, args.uthreads,
+ args.kthreads, args.affect_children, args.show_sockets if "show_sockets" in args else None, args.cgroups)
+
+ elif args.command in ['show_irqs']:
+ show_irqs(args.irq_list, args.cpu_list)
+
+ elif args.command in ['move', 'm', 'spread', 'x']:
+ spread = args.command in ['spread', 'x']
+
+ if not (args.thread_list or args.irq_list):
+ parser.error("tuna: %s " % (args.command) + _("requires a thread/irq list!\n"))
+
+ if args.thread_list:
+ tuna.move_threads_to_cpu(args.cpu_list, args.thread_list, spread=spread)
+
+ if args.irq_list:
+ tuna.move_irqs_to_cpu(args.cpu_list, args.irq_list, spread=spread)
+
+ elif args.command in ['s', 'save']:
+ save(args.cpu_list, args.thread_list, args.filename)
+
+ elif args.command in ['W', 'what_is']:
+ for tid in args.thread_list:
+ thread_help(tid)
- if run_gui:
+ elif args.command in ['g', 'gui']:
try:
from tuna import tuna_gui
except ImportError:
# gui packages not installed
print(_('tuna: packages needed for the GUI missing.'))
print(_(' Make sure xauth, pygtk2-libglade are installed.'))
- usage()
+ parser.print_help()
return
except RuntimeError:
print("tuna: machine needs to be authorized via xhost or ssh -X?")
return
try:
- cpus_filtered = filter if cpu_list else []
- app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered, gui_refresh, disable_perf)
+ app = tuna_gui.main_gui(args.kthreads, args.uthreads, args.cpu_list, args.refresh, args.disable_perf)
app.run()
except KeyboardInterrupt:
pass
diff --git a/tuna/tuna.py b/tuna/tuna.py
index 31707c9cb69c..8650f11c81c3 100755
--- a/tuna/tuna.py
+++ b/tuna/tuna.py
@@ -618,7 +618,7 @@ def get_kthread_sched_tunings(proc=None):
return kthreads
-def run_command(cmd, policy, rtprio, cpu_list):
+def run_command(cmd, policy, rtprio, cpu_list, background):
newpid = os.fork()
if newpid == 0:
cmd_list = shlex.split(cmd)
@@ -642,7 +642,8 @@ def run_command(cmd, policy, rtprio, cpu_list):
print("tuna: %s" % err)
sys.exit(2)
else:
- os.waitpid(newpid, 0)
+ if not background:
+ os.waitpid(newpid, 0)
def generate_rtgroups(filename, kthreads, nr_cpus):
f = open(filename, "w")
--
2.31.1

View File

@ -1,372 +0,0 @@
From 0681906e75e1c8166126bbfc2f3055e7507bfcb5 Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Mon, 31 Oct 2022 13:04:28 -0400
Subject: [PATCH 2/2] tuna: Update manpages for argparse CLI changes
Due to the introduction of a new commandline interface,
update the tuna manpages.
Update with new command line options.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
- Slightly edited the description
- Changed "seperated" to "separated"
- Changed the "explains" to "describes" (not part of Leah's patch)
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/docs/tuna.8 b/docs/tuna.8
index 3a065562b00e..f50a8c2a0a16 100644
--- a/docs/tuna.8
+++ b/docs/tuna.8
@@ -9,100 +9,261 @@ This manual page explains the \fBtuna\fR program. The program can be used to cha
.PP
\fBtuna\fP can change scheduling policy, scheduler priority and processor affinity for processes and process threads. \fBtuna\fR can also change the processor affinity for interrupts.
When \fBtuna\fR is invoked without any options it starts up in its graphical interface mode. This manual page explains only the command\-line options for \fBtuna\fR
-.SH "OPTIONS"
-\fBtuna\fR has both \fIaction\fR options and \fImodifier\fR options. Modifier options must be specified on the command\-line before the actions they are intended to modify. Any modifier option applies to following actions on the same command-line until it is over-ridden.
-.IP \fIActions\fR
+.SH "GLOBAL OPTIONS"
.TP
\fB\-h\fR, \fB\-\-help\fR
Print a list of options. \fBtuna\fR will exit after this action, ignoring the remainder of the command-line.
.TP
-\fB\-g\fR, \fB\-\-gui\fR
-Start the GUI. Actions that follow this on the command-line will be processed without waiting for the GUI to complete.
+\fB\-v\fR, \fB\-\-version\fR
+Show version
.TP
-\fB\-a\fR, \fB\-\-config_file_apply=profilename\fR
-Apply changes described in profile
+\fB\-L\fR, \fB\-\-logging\fR=\fILOG-LEVEL\fR
+Log application details to file for given LOG-LEVEL
.TP
-\fB\-l\fR, \fB\-\-config_file_list\fR
-List preloaded profiles
+\fB\-D\fR, \fB\-\-debug\fR
+Print DEBUG level logging details to console
+.SH "COMMANDS"
.TP
-\fB\-i\fR, \fB\-\-isolate\fR
-Move all allowed threads and IRQs away from CPU\-LIST. Requires \fB\-c\fR or \fB-S\fR.
+\fBtuna isolate\fR
+usage: tuna-cmd.py isolate [-h] (-c CPU-LIST | -S CPU-SOCKET-LIST | -N)
+
+Move all allowed threads and IRQs away from CPU\-LIST. Requires \fB\-c\fR, \fB-S\fR, or \fB-N\fR.
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
.TP
-\fB\-I\fR, \fB\-\-include\fR
-Allow all allowed threads and IRQs to run on CPU\-LIST. Requires \fB\-c\fR or \fB-S\fR.
+\fBtuna include\fR
+usage: tuna-cmd.py include [-h] (-c CPU-LIST | -S CPU-SOCKET-LIST | -N)
+
+Allow all allowed threads and IRQs to run on CPU\-LIST. Requires \fB\-c\fR, \fB-S\fR, or \fB-N\fR.
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
.TP
-\fB\-m\fR, \fB\-\-move\fR
-Move selected entities to CPU\-LIST. Requires \fB\-c\fR and either \fB-t\fR or \fB-q\fR.
+\fBtuna move\fR
+usage: tuna-cmd.py move [-h] (-c CPU-LIST | -S CPU-SOCKET-LIST | -N)
+ [-t THREAD-LIST] [-q IRQ-LIST]
+
+Move selected entities to CPU\-LIST. Requires \fB\-c\fR, \fB-S\fR, or \fB-N\fR and \fB-t\fR or \fB-q\fR.
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -t THREAD-LIST, --threads THREAD-LIST
+ THREAD-LIST affected by commands
+ -q IRQ-LIST, --irqs IRQ-LIST
+ IRQ-LIST affect by commands
.TP
-\fB\-p\fR, \fB\-\-priority\fR=\fI[POLICY:]\fRRTPRIO
-Set thread scheduler tunables: POLICY and RTPRIO. POLICY is one of OTHER, FIFO, RR, or BATCH. If \fB\-t\fR is not set, \fB\-p\fR will act as a Modifier saving the sched tunables for future Actions, for example \fB\-r\fR.
+\fBtuna spread\fR
+usage: tuna-cmd.py spread [-h] (-c CPU-LIST | -S CPU-SOCKET-LIST | -N)
+ [-t THREAD-LIST] [-q IRQ-LIST]
+
+Spread selected entities over CPU-LIST. The specified threads and IRQs are each assigned to one cpu in CPU-LIST. Requires \fB\-c\fR, \fB-S\fR, or \fB-N\fR and \fB-t\fR or \fB-q\fR.
+
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -t THREAD-LIST, --threads THREAD-LIST
+ THREAD-LIST affected by commands
+ -q IRQ-LIST, --irqs IRQ-LIST
+ IRQ-LIST affect by commands
.TP
-\fB\-P\fR, \fB\-\-show_threads\fR
-Show thread list.
+
+\fBtuna priority\fR
+usage: tuna-cmd.py priority [-h] -t THREAD-LIST [-C] POLICY:RTPRIO
+
+Set thread scheduler tunables: POLICY and RTPRIO. POLICY is one of OTHER, FIFO, RR, or BATCH. Provide POLICY, RTPRIO, or POLICY:RTPRIO separated by ":". If only POLICY is set, the RT priority will default to 1 if the policy is RT, and 0 otherwise. If only RTPRIO is specified, policy will not be changed.
+
+positional arguments:
+ POLICY:RTPRIO Set thread scheduler tunables: POLICY and RTPRIO
+
+optional arguments:
+ -h, --help show this help message and exit
+ -t THREAD-LIST, --threads THREAD-LIST
+ THREAD-LIST affected by commands
+ -C, --affect_children
+ Operation will affect children threads
.TP
-\fB\-Q\fR, \fB\-\-show_irqs\fR
-Show IRQ list.
+\fBtuna run\fR
+usage: tuna-cmd.py run [-h] [-c CPU-LIST | -S CPU-SOCKET-LIST | -N]
+ [-p PRIORITY] [-b]
+ COMMAND
+
+Run the COMMAND. The entire command line must be provided inside "quotes". Modifiers \fB-c\fR, \fB-S\fR and \fB-p\fR can be used to set the affinity and scheduler tunables of the given COMMAND.
+
+positional arguments:
+ COMMAND fork a new process and run the "COMMAND"
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -p PRIORITY, --priority PRIORITY
+ Set thread scheduler tunables: POLICY and RTPRIO
+ -b, --background Run command as background task
+
.TP
-\fB\-r\fR, \fB\-\-run\fR=\fI"COMMAND"\fR
-Run the COMMAND. If arguments are passed, the entire command line must be provided inside "quotes". Modifiers \fB-c\fR and \fB-p\fR can be used to set the affinity and scheduler tunables of the given COMMAND. The arg[0] (i.e. the command) will be set in THREAD\-LIST. Likewise the \fB-t\fR, the COMMAND accepts the prefix \fB+\fR and \fB-\fR as wildcards in order to be appended or removed from THREAD\-LIST, respectively.
+\fBtuna save\fR
+usage: tuna-cmd.py save [-h] [-c CPU-LIST | -S CPU-SOCKET-LIST | -N]
+ [-t THREAD-LIST]
+ FILENAME
+
+Save kthreads sched tunables to FILENAME
+
+positional arguments:
+ FILENAME Save kthreads sched tunables to this file
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -t THREAD-LIST, --threads THREAD-LIST
+ THREAD-LIST affected by commands
.TP
-\fB\-R\fR, \fB\-\-refresh\fR=\fIMSEC\fR
-Refresh the GUI every MSEC milliseconds
+\fBtuna apply\fR
+usage: tuna-cmd.py apply [-h] profilename
+
+Apply changes described in profile
+
+positional arguments:
+ profilename Apply changes described in this file
+
+optional arguments:
+ -h, --help show this help message and exit
+
.TP
-\fB\-s\fR, \fB\-\-save\fR=\fIFILENAME\fR
-Save kthreads sched tunables to FILENAME.
+\fBtuna show_threads\fR
+usage: tuna-cmd.py show_threads [-h] [-c CPU-LIST | -N | -S CPU-SOCKET-LIST]
+ [-t THREAD-LIST | -q IRQ-LIST] [-U] [-K] [-C]
+ [-G]
+
+Show thread list
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -t THREAD-LIST, --threads THREAD-LIST
+ THREAD-LIST affected by commands
+ -q IRQ-LIST, --irqs IRQ-LIST
+ IRQ-LIST affect by commands
+ -U, --no_uthreads Operations will not affect user threads
+ -K, --no_kthreads Operations will not affect kernel threads
+ -C, --affect_children
+ Operation will affect children threads
+ -G, --cgroups Display the processes with the type of cgroups they
+ are in
+
.TP
-\fB\-v\fR, \fB\-\-version\fR
-Show version
+\fBtuna show_irqs\fR
+usage: tuna-cmd.py show_irqs [-h] [-c CPU-LIST | -N | -S CPU-SOCKET-LIST]
+ [-q IRQ-LIST]
+
+Show IRQ list
+
+optional arguments:
+ -h, --help show this help message and exit
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -q IRQ-LIST, --irqs IRQ-LIST
+ IRQ-LIST affect by commands
+
.TP
-\fB\-W\fR, \fB\-\-what_is\fR
-Provides help about selected entities. Requires \fB-t\fR.
+\fBtuna show_configs\fR
+usage: tuna-cmd.py show_configs [-h]
+
+List preloaded profiles
+
+optional arguments:
+ -h, --help show this help message and exit
+
.TP
-\fB\-x\fR, \fB\-\-spread\fR
-Spread selected entities over CPU\-LIST. Requires at least one of \fB-t\fR or \fB-q\fR. The specified threads and IRQs are each assigned to one cpu in CPU\-LIST.
+\fB tuna what_is\fR
+usage: tuna-cmd.py what_is [-h] THREAD-LIST
+
+Provides help about selected entities
+
+positional arguments:
+ THREAD-LIST THREAD-LIST affected by commands
+
+optional arguments:
+ -h, --help show this help message and exit
+.TP
+\fB tuna gui\fR
+usage: tuna-cmd.py gui [-h] [-d] [-R MSEC]
+ [-c CPU-LIST | -N | -S CPU-SOCKET-LIST] [-U] [-K]
+
+Start the GUI
+
+optional arguments:
+ -h, --help show this help message and exit
+ -d, --disable_perf Explicitly disable usage of perf in GUI for process
+ view
+ -R MSEC, --refresh MSEC
+ Refresh the GUI every MSEC milliseconds
+ -c CPU-LIST, --cpus CPU-LIST
+ CPU-LIST affected by commands
+ -N, --nohz_full CPUs in nohz_full kernel command line will be affected
+ by operations
+ -S CPU-SOCKET-LIST, --sockets CPU-SOCKET-LIST
+ CPU-SOCKET-LIST affected by commands
+ -U, --no_uthreads Operations will not affect user threads
+ -K, --no_kthreads Operations will not affect kernel threads
.IP \fIModifiers\fR
.TP
\fB\-c\fR, \fB\-\-cpus\fR=\fICPU\-LIST\fR
-CPU\-LIST affected by commands. Requires a CPU number or a comma-separated list of CPU numbers.
-.TP
-\fB\-C\fR, \fB\-\-affect_children\fR
-Operation will affect children threads.
-.TP
-\fB\-d\fR, \fB\-\-disable_perf\fR
-Explicitly disable usage of perf in GUI for process view
-.TP
-\fB\-D\fR, \fB\-\-debug\fR
-Print DEBUG level logging details to console.
-.TP
-\fB\-f\fR, \fB\-\-filter\fR
-Disable display of selected CPUs in \fB--gui\fR. Requires \fB-c\R.
-.TP
-\fB\-G\fR, \fB\-\-cgroup\fR
-Display the processes with the type of cgroups they are in. Requires \fB-P\R.
-.TP
-\fB\-K\fR, \fB\-\-no_kthreads\fR
-Operations will not affect kernel threads.
-.TP
-\fB\-L\fR, \fB\-\-logging\fR=\fILOG\-LEVEL\fR
-Log application details to log file for given LOG-LEVEL
-.TP
-\fB\-N\fR, \fB\-\-nohz_full\fR
-CPUs in nohz_full= kernel command line parameter will be affected by operations
-.TP
-\fB\-q\fR, \fB\-\-irqs\fR=\fIIRQ\-LIST\fR
-IRQ\-LIST affected by commands. Requires an IRQ number or a comma-separated list of IRQ numbers.
+CPU\-LIST affected by commands. Requires a CPU number, a range, or a comma-separated list of CPU numbers.
.TP
\fB\-S\fR, \fB\-\-sockets\fR=\fICPU\-SOCKET\-LIST\fR
CPU\-SOCKET\-LIST affected by commands. Requires a socket number or a comma-separated list of socket numbers.
.TP
\fB\-t\fR, \fB\-\-threads\fR=\fITHREAD\-LIST\fR
-THREAD\-LIST affected by commands. Requires a thread number or thread name, or a comma-separated list of thread numbers and/or names. Thread names may contain wildcards. Be sure to quote or escape any wildcard specifications. If only \fB-\fR is passed as argument, the THREAD\-LIST will be cleared.
+THREAD\-LIST affected by commands. Requires a thread number or thread name, or a comma-separated list of thread numbers and/or names. Thread names may contain wildcards. Be sure to quote or escape any wildcard specifications.
.TP
-\fB\-U\fR, \fB\-\-no_uthreads\fR
-Operations will not affect user threads.
.SH USAGE EXAMPLES
If for instance the Ethernet NICs have multiple queues for both receive and transmit, each with its own IRQ, the Ethernet IRQs can be associated with a CPU socket:
.TP
-.B tuna -S 2 -i -q 'eth*' -x
+.B tuna isolate -S 2
+.TP
+.B tuna spread -q 'eth*' -S 2
Move everything off the CPUs in socket 2, then spread the IRQs for the Ethernet devices across those same CPUs.
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 4ac01f4f4522..8be35f7fb4c4 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -101,7 +101,7 @@ def gen_parser():
"filename": dict(metavar='FILENAME', type=str, help="Save kthreads sched tunables to this file"),
"profilename": dict(type=str, help="Apply changes described in this file"),
"run_command": dict(metavar='COMMAND', type=str, help="fork a new process and run the \"COMMAND\""),
- "priority": dict(type=tuna.get_policy_and_rtprio, help="policy/priority help"),
+ "priority": dict(type=tuna.get_policy_and_rtprio, metavar="POLICY:RTPRIO", help="Set thread scheduler tunables: POLICY and RTPRIO"),
}
MODS = {
@@ -120,7 +120,7 @@ def gen_parser():
"no_kthreads": dict(action='store_false', dest='kthreads', help="Operations will not affect kernel threads"),
"disable_perf": dict(action='store_true', help="Explicitly disable usage of perf in GUI for process view"),
"refresh": dict(default=2500, metavar='MSEC', type=int, help="Refresh the GUI every MSEC milliseconds"),
- "priority": dict(default=(None, None), type=tuna.get_policy_and_rtprio, help="Set thread scheduler tunables: POLICY and RTPRIO"),
+ "priority": dict(default=(None, None), metavar="POLICY:RTPRIO", type=tuna.get_policy_and_rtprio, help="Set thread scheduler tunables: POLICY and RTPRIO"),
"background": dict(action='store_true', help="Run command as background task")
}
--
2.31.1

View File

@ -1,33 +0,0 @@
From bef2c2009ed5151cf7ae4bf258a908c9f577ca7d Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Wed, 2 Nov 2022 11:16:48 -0400
Subject: [PATCH 1/2] tuna: remove import and fix help message
Remove getopt import and fix help message for 'spread' command.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index 44d9faaf15fb..4ac01f4f4522 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -21,7 +21,6 @@ import os
import sys
import errno
import re
-import getopt
import fnmatch
import gettext
import locale
@@ -140,7 +139,7 @@ def gen_parser():
help="Allow all threads to run on CPU-LIST")
move = subparser.add_parser('move', description="Move selected entities to CPU-LIST",
help="Move selected entities to CPU-LIST")
- spread = subparser.add_parser('spread', description="Move selected entities to CPU-LIST",
+ spread = subparser.add_parser('spread', description="Spread selected entities to CPU-LIST",
help="Spread selected entities over CPU-LIST")
priority = subparser.add_parser('priority', description="Set thread scheduler tunables: POLICY and RTPRIO",
help="Set thread scheduler tunables: POLICY and RTPRIO")
--
2.31.1

View File

@ -1,75 +0,0 @@
From 1e2f6a3b64bce4ea335e97b1ab31ada3e082a6bc Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Tue, 1 Nov 2022 13:24:00 -0400
Subject: [PATCH 2/4] tuna: tuna-cmd.py use fstrings
Add fstrings where possible to improve readabilty
Due to the discussion regarding dropping the language feature, gettext
shorthand _() have been removed.
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna-cmd.py b/tuna-cmd.py
index c5bc65059da7..44d9faaf15fb 100755
--- a/tuna-cmd.py
+++ b/tuna-cmd.py
@@ -89,7 +89,7 @@ irqs = None
class HelpMessageParser(argparse.ArgumentParser):
def error(self, message):
- sys.stderr.write('error: %s\n' % message)
+ sys.stderr.write(f'error: {message}\n')
self.print_help()
sys.exit(2)
@@ -263,13 +263,16 @@ def thread_help(tid):
ps = procfs.pidstats()
if tid not in ps:
- print("tuna: " + _("thread %d doesn't exists!") % tid)
+ print(f"tuna: thread {tid} doesn't exist!")
return
pinfo = ps[tid]
cmdline = procfs.process_cmdline(pinfo)
help, title = tuna.kthread_help_plain_text(tid, cmdline)
- print("%s\n\n%s" % (title, _(help)))
+ print(title, "\n\n")
+ if help.isspace():
+ help = "No help description available."
+ print(help)
def save(cpu_list, thread_list, filename):
@@ -295,7 +298,7 @@ def ps_show_header(has_ctxt_switch_info, cgroups=False):
def ps_show_sockets(pid, ps, inodes, inode_re, indent=0):
header_printed = False
- dirname = "/proc/%s/fd" % pid
+ dirname = f"/proc/{pid}/fd"
try:
filenames = os.listdir(dirname)
except: # Process died
@@ -688,7 +691,7 @@ def main():
try:
tuna.threads_set_priority(args.thread_list, args.priority, args.affect_children)
except OSError as err:
- print("tuna: %s" % err)
+ print(f"tuna: {err}")
sys.exit(2)
elif args.command in ['show_configs']:
@@ -705,7 +708,7 @@ def main():
spread = args.command in ['spread', 'x']
if not (args.thread_list or args.irq_list):
- parser.error("tuna: %s " % (args.command) + _("requires a thread/irq list!\n"))
+ parser.error(f"tuna: {args.command} requires a thread/irq list!\n")
if args.thread_list:
tuna.move_threads_to_cpu(args.cpu_list, args.thread_list, spread=spread)
--
2.31.1

View File

@ -1,94 +0,0 @@
From efcc75a317b63227a8630ca17e9bcf153a6cc03e Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Mon, 31 Oct 2022 13:11:31 -0400
Subject: [PATCH 3/4] tuna: tuna.py use fstrings
Add fstrings where possible to improve readabilty
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna/tuna.py b/tuna/tuna.py
index 43adb84079e4..e527facb151c 100755
--- a/tuna/tuna.py
+++ b/tuna/tuna.py
@@ -58,7 +58,7 @@ def iskthread(pid):
# in this function, so that they know that the thread vanished and
# can act accordingly, removing entries from tree views, etc
try:
- f = open("/proc/%d/smaps" % pid)
+ f = open(f"/proc/{pid}/smaps")
except IOError:
# Thread has vanished
return True
@@ -88,7 +88,7 @@ def is_irq_thread(cmd):
return cmd[:4] in ("IRQ-", "irq/")
def threaded_irq_re(irq):
- return re.compile("(irq/%s-.+|IRQ-%s)" % (irq, irq))
+ return re.compile(f"(irq/{irq}-.+|IRQ-{irq})")
# FIXME: Move to python-linux-procfs
def has_threaded_irqs(ps):
@@ -96,10 +96,10 @@ def has_threaded_irqs(ps):
return len(ps.find_by_regex(irq_re)) > 0
def set_irq_affinity_filename(filename, bitmasklist):
- pathname = "/proc/irq/%s" % filename
+ pathname = f"/proc/irq/{filename}"
f = open(pathname, "w")
text = ",".join(["%x" % a for a in bitmasklist])
- f.write("%s\n" % text)
+ f.write(f"{text}\n")
try:
f.close()
except IOError:
@@ -225,7 +225,7 @@ def move_threads_to_cpu(cpus, pid_list, set_affinity_warning=None, spread=False)
if pid not in ps:
continue
- threads = procfs.pidstats("/proc/%d/task" % pid)
+ threads = procfs.pidstats(f"/proc/{pid}/task")
for tid in list(threads.keys()):
try:
curr_affinity = os.sched_getaffinity(tid)
@@ -320,11 +320,11 @@ def affinity_remove_cpus(affinity, cpus, nr_cpus):
# Should be moved to python_linux_procfs.interrupts, shared with interrupts.parse_affinity, etc.
def parse_irq_affinity_filename(filename, nr_cpus):
try:
- f = open("/proc/irq/%s" % filename)
+ f = open(f"/proc/irq/{filename}")
except IOError as err:
if procfs.is_s390():
print("This operation is not supported on s390", file=sys.stderr)
- print("tuna: %s" % err, file=sys.stderr)
+ print(f"tuna: {err}", file=sys.stderr)
sys.exit(2)
line = f.readline()
@@ -624,19 +624,19 @@ def run_command(cmd, policy, rtprio, cpu_list, background):
try:
thread_set_priority(pid, policy, rtprio)
except (SystemError, OSError) as err:
- print("tuna: %s" % err)
+ print(f"tuna: {err}")
sys.exit(2)
if cpu_list:
try:
os.sched_setaffinity(pid, cpu_list)
except (SystemError, OSError) as err:
- print("tuna: %s" % err)
+ print(f"tuna: {err}")
sys.exit(2)
try:
os.execvp(cmd_list[0], cmd_list)
except (SystemError, OSError) as err:
- print("tuna: %s" % err)
+ print(f"tuna: {err}")
sys.exit(2)
else:
if not background:
--
2.31.1

View File

@ -1,26 +0,0 @@
From 67c5a4dc31f7dd8a6204a1a636fcec4e8f17a86b Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
Date: Fri, 28 Oct 2022 12:52:46 -0400
Subject: [PATCH 1/4] tuna: tuna_gui.py use fstrings
Add fstrings where possible to improve readabilty
Signed-off-by: Leah Leshchinsky <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/tuna/tuna_gui.py b/tuna/tuna_gui.py
index f1f2caacbcba..459f90303ed5 100755
--- a/tuna/tuna_gui.py
+++ b/tuna/tuna_gui.py
@@ -33,7 +33,7 @@ class main_gui:
if self.check_root():
sys.exit(1)
for dir in tuna_glade_dirs:
- tuna_glade = "%s/tuna_gui.glade" % dir
+ tuna_glade = f"{dir}/tuna_gui.glade"
if os.access(tuna_glade, os.F_OK):
break
self.wtree = Gtk.Builder()
--
2.31.1

View File

@ -1,7 +1,7 @@
Name: tuna Name: tuna
Version: 0.18 Version: 0.19
Release: 12%{?dist} Release: 4%{?dist}
License: GPLv2 License: GPL-2.0-only AND LGPL-2.1-only
Summary: Application tuning GUI & command line utility Summary: Application tuning GUI & command line utility
URL: https://git.kernel.org/pub/scm/utils/tuna/tuna.git URL: https://git.kernel.org/pub/scm/utils/tuna/tuna.git
Source: https://www.kernel.org/pub/software/utils/%{name}/%{name}-%{version}.tar.xz Source: https://www.kernel.org/pub/software/utils/%{name}/%{name}-%{version}.tar.xz
@ -13,19 +13,9 @@ Requires: python3-linux-procfs >= 0.6
# Requires: python-inet_diag # Requires: python-inet_diag
# Patches # Patches
Patch1: tuna-Update-command-line-interface.patch Patch01: Add-SPDX-license-identifiers.patch
Patch2: tuna-Move-get_policy_and_rtprio-call-to-parser-level.patch Patch02: tuna-Remove-spec-file-from-git.patch
Patch3: tuna-Add-sockets-command-line-option.patch Patch03: tuna-Don-t-start-the-gui-if-a-display-is-not-availab.patch
Patch4: tuna-Replace-python_ethtool-with-builtin-funtionalit.patch
Patch5: tuna-Fix-matching-irqs-in-ps_show_thread.patch
Patch6: tuna-Remove-threads-print-statement.patch
Patch7: tuna-tuna_gui.py-use-fstrings.patch
Patch8: tuna-tuna-cmd.py-use-fstrings.patch
Patch9: tuna-tuna.py-use-fstrings.patch
Patch10: tuna-remove-import-and-fix-help-message.patch
Patch11: tuna-Update-manpages-for-argparse-CLI-changes.patch
Patch12: tuna-Adapt-show_threads-cgroup-output-to-terminal-si.patch
Patch13: tuna-Fix-show_threads-cgroups-run-without-a-term.patch
%description %description
Provides interface for changing scheduler and IRQ tunables, at whole CPU and at Provides interface for changing scheduler and IRQ tunables, at whole CPU and at
@ -79,6 +69,24 @@ done
%{_datadir}/polkit-1/actions/org.tuna.policy %{_datadir}/polkit-1/actions/org.tuna.policy
%changelog %changelog
* Wed Dec 13 2023 John Kacur <jkacur@redhat.com> - 0.19-4
- Add an rpminspect.yaml file
Resolves: RHEL-19396
* Wed Dec 13 2023 John Kacur <jkacur@redhat.com> - 0.19-3
- Don't start the gui if a display is not available
- Change to SPDX licence tag in the specfile
Resolves: RHEL-8859
* Thu Nov 02 2023 John Kacur <jkacur@redhat.com> - 0.19-2
- Add SPDX licenses
- Remove the git maintained spec file
Resolves: RHEL-7611
* Thu Nov 02 2023 John Kacur <jkacur@redhat.com> - 0.19-1
- Update to latest upstream version, tuna-0.19
Resolves: RHEL-7862
* Wed Nov 23 2022 Leah Leshchinsky <lleshchi@redhat.com> - 0.18-12 * Wed Nov 23 2022 Leah Leshchinsky <lleshchi@redhat.com> - 0.18-12
- Fix show_threads --cgroups run without term - Fix show_threads --cgroups run without term
Resolves: rhbz#2121517 Resolves: rhbz#2121517