basebuilder_pel7ppc64bebuilder0
7 years ago
7 changed files with 1103 additions and 0 deletions
@ -0,0 +1,313 @@
@@ -0,0 +1,313 @@
|
||||
From d7a7671477710eca0673a54475b47a58dbf44842 Mon Sep 17 00:00:00 2001 |
||||
From: Daniel Bristot de Oliveira <daniel@bristot.me> |
||||
Date: Thu, 25 Jun 2015 16:50:18 -0300 |
||||
Subject: [PATCH 1/2] CLI: start a process from tuna |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset=UTF-8 |
||||
Content-Transfer-Encoding: 8bit |
||||
|
||||
Currently it is possible to set the CPU affinity and sched tunables for |
||||
threads running on a system. However, tuna does not permit to start a |
||||
new application with these parameters set. |
||||
|
||||
This patch adds the ability to start a new process with its affinity |
||||
and sched tunable set before it starts to run. |
||||
|
||||
To do so, one parameter was added to tuna's command line. This |
||||
parameter is the Action -r, --run=: |
||||
|
||||
-r, --run="COMMAND" |
||||
Run the COMMAND. If arguments are passed, the entire com‐ |
||||
mand line must be provided inside "quotes". Modifiers -c |
||||
and -p can be used to set the affinity and scheduler tun‐ |
||||
ables of the given COMMAND. The arg[0] (i.e. the command) |
||||
will be set in THREAD-LIST. Likewise the -t, the COMMAND |
||||
accepts the prefix + and - as wildcards in order to be |
||||
appended or removed from THREAD-LIST, respectively. |
||||
|
||||
The option -r will fork a new process, set the sched tunables and |
||||
affinity, and execute the new application's binary. |
||||
|
||||
Tuna will wait for the new process to return, and then continue |
||||
its execution. That means that it is possible to execute many Actions |
||||
after the creation of a new process, including the start of many process |
||||
in a single command line. |
||||
|
||||
Example of use: |
||||
|
||||
[root@kiron tuna]# tuna -p fifo:1 -t bash -c 1,2 -r +httpd -P |
||||
thread ctxt_switches |
||||
pid SCHED_ rtpri affinity voluntary nonvoluntary cmd |
||||
10550 OTHER 0 0,1,2,3 300 81 bash |
||||
12898 OTHER 0 0,1,2,3 30 6 bash |
||||
12930 OTHER 0 0,1,2,3 246 27 bash |
||||
13022 FIFO 1 1,2 1 0 httpd |
||||
|
||||
In this example, the schedule policy:prio fifo:1 is saved for future |
||||
Actions, "bash" is set in Thread list, cpus 1,2 are set in the cpulist, |
||||
the command "httpd" is appended to the Thread list and is started. |
||||
Finally, the threads in Thread list are printed. |
||||
|
||||
Signed-off-by: Daniel Bristot de Oliveira <daniel@bristot.me> |
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
tuna-cmd.py | 98 ++++++++++++++++++++++++++++++++++++++++++++---------------- |
||||
tuna/tuna.py | 59 ++++++++++++++++++++++++++++-------- |
||||
2 files changed, 119 insertions(+), 38 deletions(-) |
||||
|
||||
diff --git a/tuna-cmd.py b/tuna-cmd.py |
||||
index 3c9bfaa50bb4..164fbfcfe5e0 100755 |
||||
--- a/tuna-cmd.py |
||||
+++ b/tuna-cmd.py |
||||
@@ -69,6 +69,8 @@ def usage(): |
||||
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 % ('-s, --save=' + _('FILENAME'), _('Save kthreads sched tunables to %(filename)s') % \ |
||||
{"filename": _('FILENAME')}) |
||||
print fmt % ('-S, --sockets=' + |
||||
@@ -377,8 +379,8 @@ def thread_mapper(s): |
||||
return [ int(s), ] |
||||
except: |
||||
pass |
||||
- if not ps: |
||||
- ps = procfs.pidstats() |
||||
+ |
||||
+ ps = procfs.pidstats() |
||||
|
||||
try: |
||||
return ps.find_by_regex(re.compile(fnmatch.translate(s))) |
||||
@@ -454,13 +456,14 @@ def main(): |
||||
|
||||
i18n_init() |
||||
try: |
||||
- short = "a:c:CfgGhiIKlmNp:PQq:s:S:t:UvWx" |
||||
+ short = "a:c:CfgGhiIKlmNp:PQq:r:s:S:t:UvWx" |
||||
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="] |
||||
+ "version", "what_is", "spread","cgroup","config_file_apply=","config_file_list=", |
||||
+ "run=" ] |
||||
if have_inet_diag: |
||||
short += "n" |
||||
long.append("show_sockets") |
||||
@@ -477,11 +480,14 @@ def main(): |
||||
cpu_list = None |
||||
irq_list = None |
||||
irq_list_str = None |
||||
+ rtprio = None |
||||
+ policy = None |
||||
thread_list = [] |
||||
thread_list_str = None |
||||
filter = False |
||||
affect_children = False |
||||
show_sockets = False |
||||
+ p_waiting_action = False |
||||
|
||||
for o, a in opts: |
||||
if o in ("-h", "--help"): |
||||
@@ -510,20 +516,25 @@ def main(): |
||||
elif o in ("-G", "--cgroup"): |
||||
cgroups = True |
||||
elif o in ("-t", "--threads"): |
||||
- (op, a) = pick_op(a) |
||||
- op_list = reduce(lambda i, j: i + j, |
||||
- 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 especified 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 type(a) == type(''): |
||||
- thread_list_str = do_list_op(op, thread_list_str, |
||||
- a.split(",")) |
||||
- if not op: |
||||
- irq_list = None |
||||
+ # 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, |
||||
+ 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 especified 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 type(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"): |
||||
@@ -539,14 +550,17 @@ def main(): |
||||
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). |
||||
+ (policy, rtprio) = tuna.get_policy_and_rtprio(a) |
||||
if not thread_list: |
||||
- print ("tuna: %s " % o) + _("requires a thread list!") |
||||
- sys.exit(2) |
||||
- try: |
||||
- tuna.threads_set_priority(thread_list, a, affect_children) |
||||
- except (SystemError, OSError) as err: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- print "tuna: %s" % err |
||||
- sys.exit(2) |
||||
+ # For backward compatibility |
||||
+ p_waiting_action = True |
||||
+ else: |
||||
+ try: |
||||
+ tuna.threads_set_priority(thread_list, a, affect_children) |
||||
+ except (SystemError, OSError) as err: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
+ 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. |
||||
@@ -637,6 +651,40 @@ def main(): |
||||
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, |
||||
+ 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 especified 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 type(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) |
||||
|
||||
if run_gui: |
||||
try: |
||||
diff --git a/tuna/tuna.py b/tuna/tuna.py |
||||
index 646b8dfa700f..9aab16a409d2 100755 |
||||
--- a/tuna/tuna.py |
||||
+++ b/tuna/tuna.py |
||||
@@ -1,7 +1,7 @@ |
||||
# -*- python -*- |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
-import copy, ethtool, os, procfs, re, schedutils |
||||
+import copy, ethtool, os, procfs, re, schedutils, sys, shlex |
||||
import help, fnmatch |
||||
from procfs import utilist |
||||
|
||||
@@ -498,6 +498,22 @@ def get_irq_affinity_text(irqs, irq): |
||||
# needs root prio to read /proc/irq/<NUM>/smp_affinity |
||||
return "" |
||||
|
||||
+def get_policy_and_rtprio(parm): |
||||
+ parms = parm.split(":") |
||||
+ rtprio = 0 |
||||
+ policy = None |
||||
+ if parms[0].upper() in ["OTHER", "BATCH", "IDLE", "FIFO", "RR"]: |
||||
+ policy = schedutils.schedfromstr("SCHED_%s" % parms[0].upper()) |
||||
+ if len(parms) > 1: |
||||
+ rtprio = int(parms[1]) |
||||
+ elif parms[0].upper() in ["FIFO", "RR"]: |
||||
+ rtprio = 1 |
||||
+ elif parms[0].isdigit(): |
||||
+ rtprio = int(parms[0]) |
||||
+ else: |
||||
+ raise ValueError |
||||
+ return (policy, rtprio) |
||||
+ |
||||
def thread_filtered(tid, cpus_filtered, show_kthreads, show_uthreads): |
||||
if cpus_filtered: |
||||
try: |
||||
@@ -532,18 +548,9 @@ def thread_set_priority(tid, policy, rtprio): |
||||
schedutils.set_scheduler(tid, policy, rtprio) |
||||
|
||||
def threads_set_priority(tids, parm, affect_children = False): |
||||
- parms = parm.split(":") |
||||
- rtprio = 0 |
||||
- policy = None |
||||
- if parms[0].upper() in ["OTHER", "BATCH", "IDLE", "FIFO", "RR"]: |
||||
- policy = schedutils.schedfromstr("SCHED_%s" % parms[0].upper()) |
||||
- if len(parms) > 1: |
||||
- rtprio = int(parms[1]) |
||||
- elif parms[0].upper() in ["FIFO", "RR"]: |
||||
- rtprio = 1 |
||||
- elif parms[0].isdigit(): |
||||
- rtprio = int(parms[0]) |
||||
- else: |
||||
+ try: |
||||
+ (policy, rtprio) = get_policy_and_rtprio(parm) |
||||
+ except ValueError: |
||||
print "tuna: " + _("\"%s\" is unsupported priority value!") % parms[0] |
||||
return |
||||
|
||||
@@ -602,6 +609,32 @@ def get_kthread_sched_tunings(proc = None): |
||||
|
||||
return kthreads |
||||
|
||||
+def run_command(cmd, policy, rtprio, cpu_list): |
||||
+ newpid = os.fork() |
||||
+ if newpid == 0: |
||||
+ cmd_list = shlex.split(cmd) |
||||
+ pid = os.getpid() |
||||
+ if rtprio: |
||||
+ try: |
||||
+ thread_set_priority(pid, policy, rtprio) |
||||
+ except (SystemError, OSError) as err: |
||||
+ print "tuna: %s" % err |
||||
+ sys.exit(2) |
||||
+ if cpu_list: |
||||
+ try: |
||||
+ schedutils.set_affinity(pid, cpu_list) |
||||
+ except (SystemError, OSError) as err: |
||||
+ print "tuna: %s" % err |
||||
+ sys.exit(2) |
||||
+ |
||||
+ try: |
||||
+ os.execvp(cmd_list[0], cmd_list) |
||||
+ except (SystemError, OSError) as err: |
||||
+ print "tuna: %s" % err |
||||
+ sys.exit(2) |
||||
+ else: |
||||
+ os.waitpid(newpid, 0); |
||||
+ |
||||
def generate_rtgroups(filename, kthreads, nr_cpus): |
||||
f = file(filename, "w") |
||||
f.write('''# Generated by tuna |
||||
-- |
||||
2.4.11 |
||||
|
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
From e9a4bc14e15115e3493781fe8487fb4bd575ae9e Mon Sep 17 00:00:00 2001 |
||||
From: John Kacur <jkacur@redhat.com> |
||||
Date: Mon, 30 May 2016 20:31:37 +0200 |
||||
Subject: [PATCH] tuna: tuna-cmd: Display usage instead of traceback -c missing |
||||
args |
||||
|
||||
Display a usage messaage instead of a python traceback when a required |
||||
argument to the -c or --cpus is missing, or when the argument doesn't |
||||
make sense. (Such as passing a nonsense string, instead of a comma separated list of numbers) |
||||
|
||||
- In function pick_op, handle the unusual but possible case where an |
||||
empty string is passed as an argument. |
||||
- Display a usage message upon ValueError when caling cpustring_to_list |
||||
when processing the -c option |
||||
|
||||
This fixes various erroneous or missing input to -c, such as the |
||||
following |
||||
|
||||
./tuna-cmd.py -c -P |
||||
Traceback (most recent call last): |
||||
File "./tuna-cmd.py", line 656, in <module> |
||||
main() |
||||
File "./tuna-cmd.py", line 494, in main |
||||
op_list = tuna.cpustring_to_list(a) |
||||
File "/home/jkacur/source/tuna/tuna/tuna.py", line 124, in |
||||
cpustring_to_list |
||||
ends = [ int(a, 0) for a in field.split("-") ] |
||||
ValueError: invalid literal for int() with base 0: 'P' |
||||
|
||||
./tuna-cmd.py -c "" -P |
||||
Traceback (most recent call last): |
||||
File "./tuna-cmd.py", line 656, in <module> |
||||
main() |
||||
File "./tuna-cmd.py", line 493, in main |
||||
(op, a) = pick_op(a) |
||||
File "./tuna-cmd.py", line 408, in pick_op |
||||
if argument[0] in ('+', '-'): |
||||
IndexError: string index out of range |
||||
|
||||
./tuna-cmd.py -c "nonesense" -P |
||||
Traceback (most recent call last): |
||||
File "./tuna-cmd.py", line 656, in <module> |
||||
main() |
||||
File "./tuna-cmd.py", line 494, in main |
||||
op_list = tuna.cpustring_to_list(a) |
||||
File "/home/jkacur/source/tuna/tuna/tuna.py", line 124, in |
||||
cpustring_to_list |
||||
ends = [ int(a, 0) for a in field.split("-") ] |
||||
ValueError: invalid literal for int() with base 0: 'nonesense' |
||||
|
||||
This fixes bugzilla 1268287 |
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
tuna-cmd.py | 8 +++++++- |
||||
1 file changed, 7 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/tuna-cmd.py b/tuna-cmd.py |
||||
index ae4f78ab7d56..3c9bfaa50bb4 100755 |
||||
--- a/tuna-cmd.py |
||||
+++ b/tuna-cmd.py |
||||
@@ -405,6 +405,8 @@ def irq_mapper(s): |
||||
return irq_list |
||||
|
||||
def pick_op(argument): |
||||
+ if argument == "": |
||||
+ return (None, argument) |
||||
if argument[0] in ('+', '-'): |
||||
return (argument[0], argument[1:]) |
||||
return (None, argument) |
||||
@@ -491,7 +493,11 @@ def main(): |
||||
list_config() |
||||
elif o in ("-c", "--cpus"): |
||||
(op, a) = pick_op(a) |
||||
- op_list = tuna.cpustring_to_list(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: |
||||
-- |
||||
2.4.11 |
||||
|
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
From 3a07bae7e8539955bc3a0f4bafe82a8ff0e25fa9 Mon Sep 17 00:00:00 2001 |
||||
From: Daniel Bristot de Oliveira <daniel@bristot.me> |
||||
Date: Thu, 25 Jun 2015 16:51:59 -0300 |
||||
Subject: [PATCH 2/2] docs: upgrade tuna.8 man page with option -r |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset=UTF-8 |
||||
Content-Transfer-Encoding: 8bit |
||||
|
||||
Update tuna.8 man page with the descriptions of the new command line |
||||
options: |
||||
-r, --run="COMMAND" |
||||
Run the COMMAND. If arguments are passed, the entire com‐ |
||||
mand line must be provided inside "quotes". Modifiers -c |
||||
and -p can be used to set the affinity and scheduler tun‐ |
||||
ables of the given COMMAND. The arg[0] (i.e. the command) |
||||
will be set in THREAD-LIST. Likewise the -t, the COMMAND |
||||
accepts the prefix + and - as wildcards in order to be |
||||
appended or removed from THREAD-LIST, respectively. |
||||
|
||||
And the modifications of -p behavior: |
||||
-p, --priority=[POLICY:]RTPRIO |
||||
Set thread scheduler tunables: POLICY and RTPRIO. POLICY |
||||
is one of OTHER, FIFO, RR, or BATCH. If -t is not set, -p |
||||
will act as a Modifier, saving the sched tunables for |
||||
future Actions, for example -r. |
||||
|
||||
And -t behavior: |
||||
-t, --threads=THREAD-LIST |
||||
THREAD-LIST affected by commands. Requires a thread num‐ |
||||
ber 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 - is passed as argument, the THREAD-LIST will be |
||||
cleared. |
||||
|
||||
Signed-off-by: Daniel Bristot de Oliveira <daniel@bristot.me> |
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
docs/tuna.8 | 7 +++++-- |
||||
1 file changed, 5 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/docs/tuna.8 b/docs/tuna.8 |
||||
index a0a504cb13b9..81a42dd114a5 100644 |
||||
--- a/docs/tuna.8 |
||||
+++ b/docs/tuna.8 |
||||
@@ -35,7 +35,7 @@ Allow all threads to run on CPU\-LIST. Requires \fB\-c\fR or \fB-S\fR. |
||||
Move selected entities to CPU\-LIST. Requires \fB\-c\fR and either \fB-t\fR or \fB-q\fR. |
||||
.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. Requires \fB\-t\fR. |
||||
+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. |
||||
.TP |
||||
\fB\-P\fR, \fB\-\-show_threads\fR |
||||
Show thread list. |
||||
@@ -43,6 +43,9 @@ Show thread list. |
||||
\fB\-s\fR, \fB\-\-save\fR=\fIFILENAME\fR |
||||
Save kthreads sched tunables to FILENAME. |
||||
.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. |
||||
+.TP |
||||
\fB\-v\fR, \fB\-\-version\fR |
||||
Show version |
||||
.TP |
||||
@@ -75,7 +78,7 @@ IRQ\-LIST affected by commands. Requires an IRQ number or a comma-separated list |
||||
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. |
||||
+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. |
||||
.TP |
||||
\fB\-U\fR, \fB\-\-no_uthreads\fR |
||||
Operations will not affect user threads. |
||||
-- |
||||
2.4.11 |
||||
|
@ -0,0 +1,279 @@
@@ -0,0 +1,279 @@
|
||||
From 876beba81c6b213e0fe4755409142cddb78e344d Mon Sep 17 00:00:00 2001 |
||||
From: John Kacur <jkacur@redhat.com> |
||||
Date: Tue, 12 Sep 2017 23:35:39 +0100 |
||||
Subject: [PATCH 1/2] tuna: Use errno codes instead of numbers |
||||
|
||||
Use errno codes instead of numbers since they |
||||
are self documenting. |
||||
|
||||
Simplify the comments as a result |
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
tuna-cmd.py | 12 +++++----- |
||||
tuna/tuna.py | 78 ++++++++++++++++++++++++++++++------------------------------ |
||||
2 files changed, 45 insertions(+), 45 deletions(-) |
||||
|
||||
diff --git a/tuna-cmd.py b/tuna-cmd.py |
||||
index 39666c7c77f1..f0c5c0662ebd 100755 |
||||
--- a/tuna-cmd.py |
||||
+++ b/tuna-cmd.py |
||||
@@ -14,7 +14,7 @@ |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
# General Public License for more details. |
||||
|
||||
-import getopt, ethtool, fnmatch, os, procfs, re, schedutils, sys |
||||
+import getopt, ethtool, fnmatch, errno, os, procfs, re, schedutils, sys |
||||
from tuna import tuna, sysfs |
||||
|
||||
import gettext |
||||
@@ -180,8 +180,8 @@ def ps_show_thread(pid, affect_children, ps, |
||||
global irqs |
||||
try: |
||||
affinity = format_affinity(schedutils.get_affinity(pid)) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
return |
||||
raise e |
||||
|
||||
@@ -262,8 +262,8 @@ def ps_show(ps, affect_children, thread_list, cpu_list, |
||||
continue |
||||
try: |
||||
affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if cpu_list and not set(cpu_list).intersection(set(affinity)): |
||||
@@ -558,7 +558,7 @@ def main(): |
||||
else: |
||||
try: |
||||
tuna.threads_set_priority(thread_list, a, affect_children) |
||||
- except (SystemError, OSError) as err: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
+ except (SystemError, OSError) as err: # old python-schedutils incorrectly raised SystemError |
||||
print "tuna: %s" % err |
||||
sys.exit(2) |
||||
elif o in ("-P", "--show_threads"): |
||||
diff --git a/tuna/tuna.py b/tuna/tuna.py |
||||
index 9aab16a409d2..562c7fcf92d9 100755 |
||||
--- a/tuna/tuna.py |
||||
+++ b/tuna/tuna.py |
||||
@@ -1,7 +1,7 @@ |
||||
# -*- python -*- |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
-import copy, ethtool, os, procfs, re, schedutils, sys, shlex |
||||
+import copy, ethtool, errno, os, procfs, re, schedutils, sys, shlex |
||||
import help, fnmatch |
||||
from procfs import utilist |
||||
|
||||
@@ -209,8 +209,8 @@ def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, |
||||
try: |
||||
try: |
||||
curr_affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: # 'No such process' |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
curr_affinity = None |
||||
raise e |
||||
@@ -218,8 +218,8 @@ def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, |
||||
try: |
||||
schedutils.set_affinity(pid, new_affinity) |
||||
curr_affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: # 'No such process' |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
curr_affinity == None |
||||
raise e |
||||
@@ -247,16 +247,16 @@ def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, |
||||
for tid in threads.keys(): |
||||
try: |
||||
curr_affinity = schedutils.get_affinity(tid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(curr_affinity) != set(new_affinity): |
||||
try: |
||||
schedutils.set_affinity(tid, new_affinity) |
||||
curr_affinity = schedutils.get_affinity(tid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(curr_affinity) == set(new_affinity): |
||||
@@ -267,12 +267,12 @@ def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, |
||||
print "move_threads_to_cpu: %s " % \ |
||||
(_("could not change %(pid)d affinity to %(new_affinity)s") % \ |
||||
{'pid':pid, 'new_affinity':new_affinity}) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
# process died |
||||
continue |
||||
- elif e[0] == 22: # (22, EINVAL - unmovable thread) |
||||
- print "thread %(pid)d cannot be moved as requested" %{'pid':pid} |
||||
+ elif e[0] == errno.EINVAL: # unmovable thread) |
||||
+ print >> stderr, "thread %(pid)d cannot be moved as requested" %{'pid':pid} |
||||
continue |
||||
raise e |
||||
return changed |
||||
@@ -317,8 +317,8 @@ def move_irqs_to_cpu(cpus, irq_list, spread = False): |
||||
pid = int(pid[0]) |
||||
try: |
||||
schedutils.set_affinity(pid, new_affinity) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
unprocessed.append(i) |
||||
changed -= 1 |
||||
continue |
||||
@@ -351,8 +351,8 @@ def isolate_cpus(cpus, nr_cpus): |
||||
continue |
||||
try: |
||||
affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)): |
||||
@@ -360,8 +360,8 @@ def isolate_cpus(cpus, nr_cpus): |
||||
affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) |
||||
try: |
||||
schedutils.set_affinity(pid, affinity) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
|
||||
@@ -373,8 +373,8 @@ def isolate_cpus(cpus, nr_cpus): |
||||
continue |
||||
try: |
||||
affinity = schedutils.get_affinity(tid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)): |
||||
@@ -382,8 +382,8 @@ def isolate_cpus(cpus, nr_cpus): |
||||
affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) |
||||
try: |
||||
schedutils.set_affinity(tid, affinity) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
|
||||
@@ -419,8 +419,8 @@ def include_cpus(cpus, nr_cpus): |
||||
continue |
||||
try: |
||||
affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)) != set(cpus): |
||||
@@ -428,8 +428,8 @@ def include_cpus(cpus, nr_cpus): |
||||
affinity = list(set(affinity + cpus)) |
||||
try: |
||||
schedutils.set_affinity(pid, affinity) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
|
||||
@@ -441,8 +441,8 @@ def include_cpus(cpus, nr_cpus): |
||||
continue |
||||
try: |
||||
affinity = schedutils.get_affinity(tid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)) != set(cpus): |
||||
@@ -450,8 +450,8 @@ def include_cpus(cpus, nr_cpus): |
||||
affinity = list(set(affinity + cpus)) |
||||
try: |
||||
schedutils.set_affinity(tid, affinity) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
|
||||
@@ -518,8 +518,8 @@ def thread_filtered(tid, cpus_filtered, show_kthreads, show_uthreads): |
||||
if cpus_filtered: |
||||
try: |
||||
affinity = schedutils.get_affinity(tid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
return False |
||||
raise e |
||||
|
||||
@@ -557,8 +557,8 @@ def threads_set_priority(tids, parm, affect_children = False): |
||||
for tid in tids: |
||||
try: |
||||
thread_set_priority(tid, policy, rtprio) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
if affect_children: |
||||
@@ -566,8 +566,8 @@ def threads_set_priority(tids, parm, affect_children = False): |
||||
if child != tid: |
||||
try: |
||||
thread_set_priority(child, policy, rtprio) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
|
||||
@@ -597,8 +597,8 @@ def get_kthread_sched_tunings(proc = None): |
||||
try: |
||||
policy = schedutils.get_scheduler(pid) |
||||
affinity = schedutils.get_affinity(pid) |
||||
- except (SystemError, OSError) as e: # (3, 'No such process') old python-schedutils incorrectly raised SystemError |
||||
- if e[0] == 3: |
||||
+ except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
+ if e[0] == errno.ESRCH: |
||||
continue |
||||
raise e |
||||
percpu = iskthread(pid) and \ |
||||
-- |
||||
2.9.5 |
||||
|
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
From 6e19631d5e5e27b28e02d0a3f612b95c56e9ba4c Mon Sep 17 00:00:00 2001 |
||||
From: John Kacur <jkacur@redhat.com> |
||||
Date: Mon, 30 May 2016 12:57:44 +0200 |
||||
Subject: [PATCH] tuna: cpuview.py: Omit offline cpus in socket_ids list |
||||
|
||||
sysfy.py inserts None for offline cpus in class cpus, method reload, via |
||||
class cpu method reload. |
||||
|
||||
This is potentially useful, so we don't want to change these classes. |
||||
However in cpuview.py - class cpuview, we don't want to display these |
||||
offline cpus, so we only need to recognize that the type None can be |
||||
returned and then skip over it. |
||||
|
||||
This fixes Bugzilla 1036156 |
||||
First detected on some ppc |
||||
|
||||
./tuna-cmd.py |
||||
Traceback (most recent call last): |
||||
File "./tuna-cmd.py", line 656, in <module> |
||||
main() |
||||
File "./tuna-cmd.py", line 650, in main |
||||
app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered) |
||||
File "/home/jkacur/tuna/tuna/tuna_gui.py", line 49, in __init__ |
||||
self.procview, self.irqview, cpus_filtered) |
||||
File "/home/jkacur/tuna/tuna/gui/cpuview.py", line 253, in __init__ |
||||
socket_ids = [ int(id) for id in self.cpus.sockets.keys() ] |
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
tuna/gui/cpuview.py | 7 ++++++- |
||||
1 file changed, 6 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/tuna/gui/cpuview.py b/tuna/gui/cpuview.py |
||||
index 41a3d9bbbfc3..c84ecd739c70 100755 |
||||
--- a/tuna/gui/cpuview.py |
||||
+++ b/tuna/gui/cpuview.py |
||||
@@ -250,7 +250,12 @@ class cpuview: |
||||
self.irqview = irqview |
||||
|
||||
vbox = window.get_child().get_child() |
||||
- socket_ids = [ int(id) for id in self.cpus.sockets.keys() ] |
||||
+ socket_ids = [] |
||||
+ for id in self.cpus.sockets.keys(): |
||||
+ try: |
||||
+ socket_ids.append(int(id)) |
||||
+ except TypeError: # Skip over offline cpus - type None |
||||
+ continue |
||||
socket_ids.sort() |
||||
|
||||
self.nr_sockets = len(socket_ids) |
||||
-- |
||||
2.4.11 |
||||
|
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
From 048250c4e0469f5ab3b6230092e1ce40b6b148c6 Mon Sep 17 00:00:00 2001 |
||||
From: John Kacur <jkacur@redhat.com> |
||||
Date: Wed, 13 Sep 2017 00:39:08 +0100 |
||||
Subject: [PATCH 2/2] tuna: isolate_cpus - exit with a message instead of a |
||||
traceback |
||||
|
||||
isolate_cpus can create a traceback if passed an illegal cpuset |
||||
If this happens, exit with a message instead of a traceback |
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com> |
||||
--- |
||||
tuna/tuna.py | 13 +++++++++++++ |
||||
1 file changed, 13 insertions(+) |
||||
|
||||
diff --git a/tuna/tuna.py b/tuna/tuna.py |
||||
index 13b3743e8d06..1ed21353ab48 100755 |
||||
--- a/tuna/tuna.py |
||||
+++ b/tuna/tuna.py |
||||
@@ -343,6 +343,7 @@ def parse_irq_affinity_filename(filename, nr_cpus): |
||||
|
||||
|
||||
def isolate_cpus(cpus, nr_cpus): |
||||
+ fname = sys._getframe( ).f_code.co_name # Function name |
||||
ps = procfs.pidstats() |
||||
ps.reload_threads() |
||||
previous_pid_affinities = {} |
||||
@@ -354,6 +355,9 @@ def isolate_cpus(cpus, nr_cpus): |
||||
except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
if e[0] == errno.ESRCH: |
||||
continue |
||||
+ elif e[0] == errno.EINVAL: |
||||
+ print >> sys.stderr, "Function:", fname, ",", e.strerror |
||||
+ sys.exit(2) |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)): |
||||
previous_pid_affinities[pid] = copy.copy(affinity) |
||||
@@ -363,6 +367,9 @@ def isolate_cpus(cpus, nr_cpus): |
||||
except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
if e[0] == errno.ESRCH: |
||||
continue |
||||
+ elif e[0] == errno.EINVAL: |
||||
+ print >> sys.stderr, "Function:", fname, ",", e.strerror |
||||
+ sys.exit(2) |
||||
raise e |
||||
|
||||
if not ps[pid].has_key("threads"): |
||||
@@ -376,6 +383,9 @@ def isolate_cpus(cpus, nr_cpus): |
||||
except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
if e[0] == errno.ESRCH: |
||||
continue |
||||
+ elif e[0] == errno.EINVAL: |
||||
+ print >> sys.stderr, "Function:", fname, ",", e.strerror |
||||
+ sys.exit(2) |
||||
raise e |
||||
if set(affinity).intersection(set(cpus)): |
||||
previous_pid_affinities[tid] = copy.copy(affinity) |
||||
@@ -385,6 +395,9 @@ def isolate_cpus(cpus, nr_cpus): |
||||
except (SystemError, OSError) as e: # old python-schedutils incorrectly raised SystemError |
||||
if e[0] == errno.ESRCH: |
||||
continue |
||||
+ elif e[0] == errno.EINVAL: |
||||
+ print >> sys.stderr, "Function:", fname, ",", e.strerror |
||||
+ sys.exit(2) |
||||
raise e |
||||
|
||||
del ps |
||||
-- |
||||
2.9.5 |
||||
|
@ -0,0 +1,227 @@
@@ -0,0 +1,227 @@
|
||||
%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} |
||||
%{!?python_ver: %define python_ver %(%{__python} -c "import sys ; print sys.version[:3]")} |
||||
|
||||
Name: tuna |
||||
Version: 0.13 |
||||
Release: 6%{?dist} |
||||
License: GPLv2 |
||||
Summary: Application tuning GUI & command line utility |
||||
Group: Applications/System |
||||
Source: https://www.kernel.org/pub/software/utils/tuna/%{name}-%{version}.tar.xz |
||||
|
||||
Patch1: tuna-cpuview.py-Omit-offline-cpus-in-socket_ids-list.patch |
||||
Patch2: display-usage-instead-of-traceback-when-c-missing-args.patch |
||||
Patch3: CLI-start-a-process-from-tuna.patch |
||||
Patch4: docs-upgrade-tuna.8-man-page-with-option-r.patch |
||||
Patch5: tuna-Use-errno-codes-instead-of-numbers.patch |
||||
Patch6: tuna-isolate_cpus-exit-with-a-message.patch |
||||
|
||||
URL: https://git.kernel.org/pub/scm/utils/tuna/tuna.git |
||||
BuildArch: noarch |
||||
BuildRequires: python-devel, gettext, desktop-file-utils |
||||
Requires: python-ethtool |
||||
Requires: python-linux-procfs >= 0.4.5 |
||||
Requires: python-schedutils >= 0.2 |
||||
# 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 |
||||
%patch1 -p1 |
||||
%patch2 -p1 |
||||
%patch3 -p1 |
||||
%patch4 -p1 |
||||
%patch5 -p1 |
||||
%patch6 -p1 |
||||
|
||||
%build |
||||
%{__python} setup.py build |
||||
|
||||
%install |
||||
rm -rf %{buildroot} |
||||
%{__python} 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" |
||||
%{python_sitelib}/*.egg-info |
||||
%endif |
||||
%{_bindir}/tuna |
||||
%{_datadir}/tuna/ |
||||
%{python_sitelib}/tuna/ |
||||
%{_mandir}/man8/tuna.8* |
||||
%config(noreplace) %{_sysconfdir}/tuna.conf |
||||
%config %{_sysconfdir}/tuna/example.conf |
||||
%{_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 |
||||
* Wed Sep 13 2017 John Kacur - 0.13-6 |
||||
- Use errno codes instead of plain numbers |
||||
- Exit with a message instead of a traceback in isolate_cpus |
||||
Resolves: rhbz#1472840 |
||||
|
||||
* Mon Jun 13 2016 John Kacur - 0.13-5 |
||||
- Rebuild to document |
||||
tuna thows an exception instead of an error message when sched_setaffinity returns EINVAL |
||||
This was actually fixed in v0.13-1 |
||||
Resolves: rhbz#1290445 |
||||
|
||||
* Mon May 30 2016 John Kacur - 0.13-4 |
||||
- CLI-start-a-process-from-tuna |
||||
- docs: upgrade tuna.8 man page with option -r |
||||
Resolves: rhbz#1235829 |
||||
|
||||
* Mon May 30 2016 John Kacur - 0.13-3 |
||||
- Display usage instead of traceback when -c missing args or args is incorrect |
||||
Resolves: rhbz#1268287 |
||||
|
||||
* Mon May 30 2016 John Kacur - 0.13-2 |
||||
- tuna: cpuview.py: Omit offline cpus in socket_ids list |
||||
Resolves: rhbz#1036156 |
||||
|
||||
* Tue May 24 2016 John Kacur - 0.13-1 |
||||
- Upgrade to v0.13 |
||||
- Remove patches that are included in 0.13 |
||||
Resolves: rhbz#1235828 |
||||
|
||||
* Mon Dec 21 2015 John Kacur - 0.11.1-11 |
||||
- tuna-fix-the-check-of-PF_NO_SETAFFINITY-flag-for-thr.patch |
||||
Resolves: rhbz#1286221 |
||||
|
||||
* Thu Jun 25 2015 John Kacur <jkacur@redhat.com> - 0.11.1-10 |
||||
- dropped the git housekeeping patch, not relevant here |
||||
- docs-Remove-stray-a.patch |
||||
- CLI-Introduce-nohz_full-N-entity.patch |
||||
- tuna-config-Fix-pygtk-import.patch |
||||
- tuna-Make-isolate-include-operations-affect-proc-irq.patch |
||||
- tuna-Decide-whether-to-isolate-a-thread-based-on-PF_.patch |
||||
- tuna-Fix-race-in-is_hardirq_handler.patch |
||||
- CLI-Do-not-show-column-headers-when-not-outputting-t.patch |
||||
- Correct-a-typo-in-the-net.ipv4.ipfrag_time-help-stri.patch |
||||
Resolves: rhbz#1234963 |
||||
|
||||
* Wed May 27 2015 John Kacur <jkacur@redhat.com> - 0.11.1-9 |
||||
- Fix-behavior-for-dot-inside-proc-sys-path.patch |
||||
Resolves: rhbz#1178917 |
||||
|
||||
* Mon Oct 20 2014 John Kacur <jkacur@redhat.com> - 0.11.1-8 |
||||
- CLI-fix-traceback-due-unavailable-display.patch |
||||
Resolves: rhbz#1035853 |
||||
|
||||
* Fri Sep 12 2014 John Kacur <jkacur@redhat.com> - 0.11.1-7 |
||||
- Add a tuna.desktop file |
||||
Resolves: rhbz#996954 |
||||
|
||||
* Tue Mar 11 2014 John Kacur <jkacur@redhat.com> - 0.11.1-6 |
||||
- tuna-modified-sysctl-settings-in-example.conf (1031582) |
||||
- CLI-fix-traceback-where-enter-p-policy-without-prio (1035794) |
||||
Resolves: rhbz#1035794 |
||||
|
||||
* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 0.11.1-5 |
||||
- Mass rebuild 2013-12-27 |
||||
|
||||
* Thu Nov 07 2013 John Kacur <jkacxur@redhat.com> - 0.11.1-4 |
||||
- tuna: Do polkit auth for GUI BZ:919212,974027 (996885) |
||||
- tuna: Auto Correction for config file errors (1015062) |
||||
- Rebased to 0.11.1 upstream |
||||
Resolves: rhbz#996885 |
||||
Resolves: rhbz#1015062 |
||||
|
||||
* Thu Aug 22 2013 John Kacur <jkacur@redhat.com> - 0.11-3 |
||||
- spec: Mark configuration files with %config (998984) |
||||
- spec: Document the real location of the source in a comment (998987) |
||||
- CLI: fix ps_show_thread call with bad args count (1000025) |
||||
|
||||
* Tue Jun 11 2013 Jiri Kastner <jkastner@redhat.com> - 0.11-2 |
||||
- changed dependencies from python-numeric to numpy |
||||
- merged spec changes from upstream |
||||
|
||||
* Thu Jun 6 2013 Jiri Kastner <jkastner@redhat.com> - 0.11-1 |
||||
- New upstream release |
||||
|
||||
* Fri Feb 15 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.9.1-6 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild |
||||
|
||||
* Sun Jul 22 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.9.1-5 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild |
||||
|
||||
* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.9.1-4 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild |
||||
|
||||
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.9.1-3 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild |
||||
|
||||
* Sun Aug 01 2010 Orcan Ogetbil <oget[dot]fedora[at]gmail[dot]com> - 0.9.1-2 |
||||
- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild |
||||
|
||||
* 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 |
Loading…
Reference in new issue