diff --git a/SOURCES/Add-a-tuna.desktop-file.patch b/SOURCES/Add-a-tuna.desktop-file.patch index e4142ac..42024b7 100644 --- a/SOURCES/Add-a-tuna.desktop-file.patch +++ b/SOURCES/Add-a-tuna.desktop-file.patch @@ -1,13 +1,7 @@ -From 2cb0d5619a907cac929568afefda347bedfdfd16 Mon Sep 17 00:00:00 2001 +From 14024e0845ffdfec688f8d0cde0ee2876c1a81cd Mon Sep 17 00:00:00 2001 From: Guy Streeter Date: Wed, 5 Feb 2014 15:40:36 -0600 -Subject: [PATCH] Add a tuna.desktop file - -Add a tuna.desktop file - -commit 2cb0d5619a907cac929568afefda347bedfdfd16 upstream - -Bugzilla: 996954 +Subject: [PATCH 07/16] Add a tuna.desktop file change the desktop icon @@ -16,6 +10,7 @@ Tested-by: Jiri Kastner Signed-off-by: Jiri Kastner Signed-off-by: John Kacur --- + rpm/SPECS/tuna.spec | 2 ++ tuna.desktop | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tuna.desktop @@ -36,5 +31,5 @@ index 000000000000..603011f79467 +Icon=gtk-preferences +Categories=System;Settings; -- -1.8.1.4 +1.8.3.1 diff --git a/SOURCES/CLI-Do-not-show-column-headers-when-not-outputting-t.patch b/SOURCES/CLI-Do-not-show-column-headers-when-not-outputting-t.patch new file mode 100644 index 0000000..25fb04f --- /dev/null +++ b/SOURCES/CLI-Do-not-show-column-headers-when-not-outputting-t.patch @@ -0,0 +1,74 @@ +From 47ea4e06b7f042fa7d8512fa8e95d513bf82c741 Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 9 Jun 2015 16:27:30 -0300 +Subject: [PATCH 13/15] CLI: Do not show column headers when not outputting to + a tty: + +[root@felicio ~]# tuna -q en* -Q + # users affinity + 54 enp1s0f0-TxRx-0 0,1,2 ixgbe + 55 enp1s0f0-TxRx-1 0,1,2 ixgbe + 56 enp1s0f0-TxRx-2 0,1,2 ixgbe + 57 enp1s0f0-TxRx-3 0,1,2 ixgbe + 58 enp1s0f0 0,1,2 ixgbe + 59 enp1s0f1-TxRx-0 0,1,2 ixgbe + 60 enp1s0f1-TxRx-1 0,1,2 ixgbe + 61 enp1s0f1-TxRx-2 0,1,2 ixgbe + 62 enp1s0f1-TxRx-3 0,1,2 ixgbe + 63 enp1s0f1 0,1,2 ixgbe + 66 enp7s0 0,1,2 atl1c +[root@felicio ~]# tuna -q en* -Q | head -4 + 54 enp1s0f0-TxRx-0 0,1,2 ixgbe + 55 enp1s0f0-TxRx-1 0,1,2 ixgbe + 56 enp1s0f0-TxRx-2 0,1,2 ixgbe + 57 enp1s0f0-TxRx-3 0,1,2 ixgbe +[root@felicio ~]# + +[root@felicio ~]# tuna -t xfs-d* -P + thread ctxt_switches + pid SCHED_ rtpri affinity voluntary nonvoluntary cmd + 459 OTHER 0 0,1,2,3 2 1 xfs-data/dm-1 + 654 OTHER 0 0,1,2,3 2 0 xfs-data/sda1 + 669 OTHER 0 0,1,2,3 2 0 xfs-data/dm-2 +[root@felicio ~]# tuna -t xfs-d* -P | head + 459 OTHER 0 0,1,2,3 2 1 xfs-data/dm-1 + 654 OTHER 0 0,1,2,3 2 0 xfs-data/sda1 + 669 OTHER 0 0,1,2,3 2 0 xfs-data/dm-2 +[root@felicio ~]# + +Useful, for instance, when using wc to count how many IRQs or threadas match +some filters. + +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna-cmd.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/tuna-cmd.py b/tuna-cmd.py +index 9edf7de6c286..ba40ec8246ba 100755 +--- a/tuna-cmd.py ++++ b/tuna-cmd.py +@@ -305,7 +305,8 @@ def do_ps(thread_list, cpu_list, irq_list, show_uthreads, + + has_ctxt_switch_info = ps[1]["status"].has_key("voluntary_ctxt_switches") + try: +- ps_show_header(has_ctxt_switch_info, cgroups) ++ if sys.stdout.isatty(): ++ 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) +@@ -334,7 +335,8 @@ def show_irqs(irq_list, cpu_list): + if not irqs: + irqs = procfs.interrupts() + +- print "%4s %-16s %8s" % ("#", _("users"), _("affinity"),) ++ if sys.stdout.isatty(): ++ print "%4s %-16s %8s" % ("#", _("users"), _("affinity"),) + sorted_irqs = [] + for k in irqs.keys(): + try: +-- +1.8.3.1 + diff --git a/SOURCES/CLI-Introduce-nohz_full-N-entity.patch b/SOURCES/CLI-Introduce-nohz_full-N-entity.patch new file mode 100644 index 0000000..17f181f --- /dev/null +++ b/SOURCES/CLI-Introduce-nohz_full-N-entity.patch @@ -0,0 +1,69 @@ +From ab9221d8a494194886cdf2ebabeeb8c74d888f2e Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 21 Oct 2014 22:47:42 -0300 +Subject: [PATCH 08/15] CLI: Introduce --nohz_full/-N entity + +This will set as the cpu list what was configured on the nohz_full= +kernel command line argument, allowing isolating these CPUs and then +moving to it some important app, i.e. all the other operations one +can do in tuna can apply to that cpu list. + +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna-cmd.py | 11 +++++++++-- + tuna/tuna.py | 4 ++++ + 2 files changed, 13 insertions(+), 2 deletions(-) + +diff --git a/tuna-cmd.py b/tuna-cmd.py +index 5dcc18167d17..9edf7de6c286 100755 +--- a/tuna-cmd.py ++++ b/tuna-cmd.py +@@ -58,6 +58,7 @@ def usage(): + print fmt % ('-K, --no_kthreads', _('Operations will not affect kernel threads')) + 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')) + if have_inet_diag: + print fmt % ('-n, --show_sockets', _('Show network sockets in use by threads')) + print fmt % ('-p, --priority=[' + +@@ -449,9 +450,9 @@ def main(): + + i18n_init() + try: +- short = "a:c:CfgGhiIKlmp:PQq:s:S:t:UvWx" ++ short = "a:c:CfgGhiIKlmNp:PQq:s:S:t:UvWx" + long = ["cpus=", "affect_children", "filter", "gui", "help", +- "isolate", "include", "no_kthreads", "move", ++ "isolate", "include", "no_kthreads", "move", "nohz_full", + "show_sockets", "priority=", "show_threads", + "show_irqs", "irqs=", + "save=", "sockets=", "threads=", "no_uthreads", +@@ -490,6 +491,12 @@ def main(): + (op, a) = pick_op(a) + op_list = tuna.cpustring_to_list(a) + 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"): +diff --git a/tuna/tuna.py b/tuna/tuna.py +index 49c9eabdf499..7b839f1e2d96 100755 +--- a/tuna/tuna.py ++++ b/tuna/tuna.py +@@ -622,3 +622,7 @@ def generate_rtgroups(filename, kthreads, nr_cpus): + schedutils.schedstr(kt.policy)[6].lower(), + kt.rtprio, mask, regex)) + f.close() ++ ++ ++def nohz_full_list(): ++ return [ int(cpu) for cpu in procfs.cmdline().options["nohz_full"].split(",") ] +-- +1.8.3.1 + diff --git a/SOURCES/CLI-fix-ps_show_thread-call-with-bad-args-count.patch b/SOURCES/CLI-fix-ps_show_thread-call-with-bad-args-count.patch index 10d0081..bf52e4f 100644 --- a/SOURCES/CLI-fix-ps_show_thread-call-with-bad-args-count.patch +++ b/SOURCES/CLI-fix-ps_show_thread-call-with-bad-args-count.patch @@ -1,18 +1,18 @@ -From aac51fce90d9007b4ff9c9b5bb3c3969cdb2b01b Mon Sep 17 00:00:00 2001 +From 3a54bb485a3a73023314e21b417fbaeb13aa4bd5 Mon Sep 17 00:00:00 2001 From: Petr Oros Date: Thu, 15 Aug 2013 11:15:45 +0200 -Subject: [PATCH 3/4] CLI: fix ps_show_thread call with bad args count +Subject: [PATCH 02/15] CLI: fix ps_show_thread call with bad args count +Tested-By: Jiri Kastner Signed-off-by: Petr Oros -(cherry picked from commit a97f70eb407f3ec2972740ca5ab976f5f06ce0bb) - +Signed-off-by: Jiri Kastner Signed-off-by: John Kacur --- tuna-cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tuna-cmd.py b/tuna-cmd.py -index 64e3ad1..5dcc181 100755 +index 64e3ad109d54..5dcc18167d17 100755 --- a/tuna-cmd.py +++ b/tuna-cmd.py @@ -227,7 +227,7 @@ def ps_show_thread(pid, affect_children, ps, @@ -25,5 +25,5 @@ index 64e3ad1..5dcc181 100755 def ps_show(ps, affect_children, thread_list, cpu_list, -- -1.8.1.4 +1.8.3.1 diff --git a/SOURCES/CLI-fix-traceback-due-unavailable-display.patch b/SOURCES/CLI-fix-traceback-due-unavailable-display.patch index 6b4a372..5407318 100644 --- a/SOURCES/CLI-fix-traceback-due-unavailable-display.patch +++ b/SOURCES/CLI-fix-traceback-due-unavailable-display.patch @@ -1,11 +1,7 @@ -From f5d8f1c71b51017eabb53247def4572e6ff7214b Mon Sep 17 00:00:00 2001 +From 2db07dded58386fed39a094d60966d741430ab3d Mon Sep 17 00:00:00 2001 From: Petr Oros Date: Wed, 4 Dec 2013 07:29:35 +0000 -Subject: [PATCH] CLI: fix traceback due unavailable display - -commit 5d555e0eb046a0df201f0e3aaabb03296944151b upstream - -Bugzilla: 1035853 +Subject: [PATCH 04/15] CLI: fix traceback due unavailable display Tuna showing traceback when user haven't set DISPLAY variable and using CLI with param -l. This is caused by gtk library which try create "window", but in CLI mode is not neccesary. diff --git a/SOURCES/CLI-fix-traceback-when-p-is-used-with-unsupported-va.patch b/SOURCES/CLI-fix-traceback-when-p-is-used-with-unsupported-va.patch new file mode 100644 index 0000000..809843e --- /dev/null +++ b/SOURCES/CLI-fix-traceback-when-p-is-used-with-unsupported-va.patch @@ -0,0 +1,45 @@ +From c10e375b7832d2179ef9e43f3f4fadf468ffe503 Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Tue, 4 Feb 2014 07:09:28 +0100 +Subject: [PATCH 06/15] CLI: fix traceback when -p is used with unsupported + value + +CLI: fix traceback when -p is used with unsupported value +$ tuna -t 4364 -p fif +Traceback (most recent call last): + File "/usr/bin/tuna", line 647, in + main() + File "/usr/bin/tuna", line 531, in main + tuna.threads_set_priority(thread_list, a, affect_children) + File "/usr/lib/python2.7/site-packages/tuna/tuna.py", line 502, in threads_set_priority + rtprio = int(parms[0]) +ValueError: invalid literal for int() with base 10: 'fif' + +Signed-off-by: Petr Oros +Tested-by: Jiri Kastner +Signed-off-by: Jiri Kastner +Signed-off-by: John Kacur +--- + tuna/tuna.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/tuna/tuna.py b/tuna/tuna.py +index 0feb521fc5eb..49c9eabdf499 100755 +--- a/tuna/tuna.py ++++ b/tuna/tuna.py +@@ -498,8 +498,11 @@ def threads_set_priority(tids, parm, affect_children = False): + rtprio = int(parms[1]) + elif parms[0].upper() in ["FIFO", "RR"]: + rtprio = 1 +- else: ++ elif parms[0].isdigit(): + rtprio = int(parms[0]) ++ else: ++ print "tuna: " + _("\"%s\" is unsupported priority value!") % parms[0] ++ return + + for tid in tids: + try: +-- +1.8.3.1 + diff --git a/SOURCES/CLI-fix-traceback-where-enter-p-policy-without-prio.patch b/SOURCES/CLI-fix-traceback-where-enter-p-policy-without-prio.patch index fe8ce0c..0a5e100 100644 --- a/SOURCES/CLI-fix-traceback-where-enter-p-policy-without-prio.patch +++ b/SOURCES/CLI-fix-traceback-where-enter-p-policy-without-prio.patch @@ -1,10 +1,7 @@ -From 9ac6c7acac23cf8d2311f1f066d2e17b808a1101 Mon Sep 17 00:00:00 2001 +From 4a71b9fe168279bb66e8497e3c32021fc8a8c419 Mon Sep 17 00:00:00 2001 From: Petr Oros Date: Wed, 4 Dec 2013 08:27:15 +0000 -Subject: [PATCH] CLI: fix traceback where enter -p policy without prio - -commit 443234bd24c794068a752d567bb7f4d903fbbaac upstream -Bugzilla: 1035794 +Subject: [PATCH 03/15] CLI: fix traceback where enter -p policy without prio Tuna throwing value error when not specified priority. Example: tuna -t PID_OF_SOME_PROCESS -p OTHER @@ -22,7 +19,7 @@ Signed-off-by: John Kacur 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tuna/tuna.py b/tuna/tuna.py -index 6dfe740..0feb521 100755 +index 6dfe7408ae8a..0feb521fc5eb 100755 --- a/tuna/tuna.py +++ b/tuna/tuna.py @@ -490,10 +490,14 @@ def thread_set_priority(tid, policy, rtprio): @@ -43,5 +40,5 @@ index 6dfe740..0feb521 100755 rtprio = int(parms[0]) -- -1.8.1.4 +1.8.3.1 diff --git a/SOURCES/Correct-a-typo-in-the-net.ipv4.ipfrag_time-help-stri.patch b/SOURCES/Correct-a-typo-in-the-net.ipv4.ipfrag_time-help-stri.patch new file mode 100644 index 0000000..ec4c729 --- /dev/null +++ b/SOURCES/Correct-a-typo-in-the-net.ipv4.ipfrag_time-help-stri.patch @@ -0,0 +1,30 @@ +From e8999259d8935220e9343f95aab5a1d77b2db0f3 Mon Sep 17 00:00:00 2001 +From: Guy Streeter +Date: Thu, 28 Aug 2014 14:03:32 -0500 +Subject: [PATCH 15/15] Correct a typo in the net.ipv4.ipfrag_time help string + +What should be "\n" is just "\" + +Signed-off-by: Guy Streeter +Signed-off-by: Jiri Kastner +Signed-off-by: John Kacur +--- + tuna/help.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tuna/help.py b/tuna/help.py +index 44d4fe38cd70..fa47ae835962 100644 +--- a/tuna/help.py ++++ b/tuna/help.py +@@ -75,7 +75,7 @@ PROC_SYS_HELP = { + 'net.ipv4.ipfrag_low_thresh':N_('Minimum memory used to reassemble IP fragments. When ipfrag_high_thresh bytes of memory is allocated for this purpose, the fragment handler will toss packets until ipfrag_low_thresh is reached.'), + 'net.ipv4.ipfrag_max_dist':N_('Ipfrag_max_dist is a non-negative integer value which defines the maximum "disorder" which is allowed among fragments which share a common IP source address. Note that reordering of packets is not unusual, but if a large number of fragments arrive from a source IP address while a particular fragment queue remains incomplete, it probably indicates that one or more fragments belonging to that queue have been lost. When ipfrag_max_dist is positive, an additional check is done on fragments before they are added to a reassembly queue - if ipfrag_max_dist (or more) fragments have arrived from a particular IP address between additions to any IP fragment queue using that source address, it\'s presumed that one or more fragments in the queue are lost. The existing fragment queue will be dropped, and a new one started. An ipfrag_max_dist value of zero disables this check.\n\nUsing a very small value, e.g. 1 or 2, for ipfrag_max_dist can result in unnecessarily dropping fragment queues when normal reordering of packets occurs, which could lead to poor application performance. Using a very large value, e.g. 50000, increases the likelihood of incorrectly reassembling IP fragments that originate from different IP datagrams, which could result in data corruption.\nDefault: 64'), + 'net.ipv4.ipfrag_secret_interval':N_('Regeneration interval of the hash secret (or lifetime for the hash secret) for IP fragments.\nDefault: 600\nUnit: second'), +- 'net.ipv4.ipfrag_time':N_('Time to keep an IP fragment in memory.\Unit: second'), ++ 'net.ipv4.ipfrag_time':N_('Time to keep an IP fragment in memory.\nUnit: second'), + 'net.ipv4.ip_local_port_range':N_('Defines the local port range that is used by TCP and UDP to choose the local port. The first number is the first, the second the last local port number.\nDefault value depends on amount of memory available on the system:\n - > 128Mb 32768-61000\n - < 128Mb 1024-4999 or even less.\nThis number defines number of active connections, which this system can issue simultaneously to systems not supporting TCP extensions (timestamps). With tcp_tw_recycle enabled (i.e. by default) range 1024-4999 is enough to issue up to 2000 connections per second to systems supporting timestamps.'), + 'net.ipv4.ip_local_reserved_ports':N_('Specify the ports which are reserved for known third-party applications. These ports will not be used by automatic port assignments (e.g. when calling connect() or bind() with port number 0). Explicit port allocation behavior is unchanged.\nThe format used for both input and output is a comma separated list of ranges (e.g. "1,2-4,10-10" for ports 1, 2, 3, 4 and 10). Writing to the file will clear all previously reserved ports and update the current list with the one given in the input.\nDefault: Empty'), + 'net.ipv4.ip_nonlocal_bind':N_('If set, allows processes to bind() to non-local IP addresses, which can be quite useful - but may break some applications.\nDefault: 0'), +-- +1.8.3.1 + diff --git a/SOURCES/Fix-behavior-for-dot-inside-proc-sys-path.patch b/SOURCES/Fix-behavior-for-dot-inside-proc-sys-path.patch new file mode 100644 index 0000000..b83959b --- /dev/null +++ b/SOURCES/Fix-behavior-for-dot-inside-proc-sys-path.patch @@ -0,0 +1,121 @@ +From dca3278e7875dd2df07f409abaedcb9cd1d77047 Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Mon, 18 May 2015 12:30:50 +0200 +Subject: [PATCH 14/15] Fix behavior for dot inside /proc/sys/ path + + When /proc/sys/ path contain dot (for example netif name) and config + file using * for filename tuna fail with traceback: + + Invalid item! file: /proc/sys/net/ipv6/conf/tuna/1/forwarding + Traceback (most recent call last): + File "/usr/bin/tuna", line 647, in + main() + File "/usr/bin/tuna", line 641, in main + app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered) + File "/usr/lib/python2.7/site-packages/tuna/tuna_gui.py", line 64, in __init__ + self.profileview.init_default_file() + File "/usr/lib/python2.7/site-packages/tuna/gui/profileview.py", line 146, in init_default_file + self.commonview.updateCommonView() + File "/usr/lib/python2.7/site-packages/tuna/gui/commonview.py", line 13, in updateCommonView + self.setup() + File "/usr/lib/python2.7/site-packages/tuna/gui/commonview.py", line 80, in setup + frameContent[catCntr]['texts'][contentCntr].set_value(int(self.config.ctlParams[catCntr][val])) + ValueError: invalid literal for int() with base 10: '' + + This patch add support for escaping "." character. + +Signed-off-by: Petr Oros +Reported-by: Arnaldo Carvalho de Melo +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1178917 +Signed-off-by: John Kacur +--- + tuna/config.py | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +diff --git a/tuna/config.py b/tuna/config.py +index 7e19a28f967f..e82a4200c6ff 100644 +--- a/tuna/config.py ++++ b/tuna/config.py +@@ -30,6 +30,12 @@ class Config: + self.config[option] = value + self.cacheFileName = '' + ++ def FileNameToConfigPath(self, filename): ++ return filename.replace(".", "\\.").replace("/", ".") ++ ++ def ConfigPathToFileName(self, configpath): ++ return configpath.replace(".", "/").replace("\\/", ".") ++ + def updateDefault(self, filename): + if filename.replace("", "temp-direct-load.conf") != filename: + self.temp = ConfigParser.RawConfigParser() +@@ -154,9 +160,9 @@ class Config: + tempCfg = [] + for index in range(len(oldTempCfg)): + if self.isFnString(oldTempCfg[index][0]): +- expanded = self.getFilesByFN("/proc/sys", oldTempCfg[index][0].replace(".", "/")) ++ expanded = self.getFilesByFN("/proc/sys", self.ConfigPathToFileName(oldTempCfg[index][0])) + for index2 in range(len(expanded)): +- expandedData = (expanded[index2].replace("/", "."), oldTempCfg[index][1]) ++ expandedData = (self.FileNameToConfigPath(expanded[index2]), oldTempCfg[index][1]) + tempCfg.append(expandedData) + else: + tempCfg.append(oldTempCfg[index]) +@@ -241,9 +247,9 @@ class Config: + def getSystemValue(self, filename): + filename = self.aliasToOriginal(filename) + try: +- buffer = open("/proc/sys/" + filename.replace(".", "/"), 'r').read() ++ buffer = open("/proc/sys/" + self.ConfigPathToFileName(filename), 'r').read() + except IOError: +- print _("Invalid item! file: /proc/sys/%s" %(filename.replace(".", "/"))) ++ print _("Invalid item! file: /proc/sys/%s" %(self.ConfigPathToFileName(filename))) + return "" + return buffer.strip() + +@@ -253,10 +259,10 @@ class Config: + if value == "" or old == value: + return 0 + try: +- fp = open("/proc/sys/" + filename.replace(".", "/"), 'w') ++ fp = open("/proc/sys/" + self.ConfigPathToFileName(filename), 'w') + fp.write(value) + except IOError: +- print "%s%s %s %s" % (_("Cant write to file! path: /proc/sys/"), filename.replace(".","/"), _("value:"), value) ++ print "%s%s %s %s" % (_("Cant write to file! path: /proc/sys/"), self.ConfigPathToFileName(filename), _("value:"), value) + return -1 + return 0 + +@@ -302,9 +308,9 @@ class Config: + snapcont = [] + for index in range(len(snapcontPacked)): + if self.isFnString(snapcontPacked[index][0]): +- expanded = self.getFilesByFN("/proc/sys",snapcontPacked[index][0].replace(".","/")) ++ expanded = self.getFilesByFN("/proc/sys",self.ConfigPathToFileName(snapcontPacked[index][0])) + for index2 in range(len(expanded)): +- expandedData = (expanded[index2].replace("/","."),snapcontPacked[index][1]) ++ expandedData = (self.FileNameToConfigPath(expanded[index2]),snapcontPacked[index][1]) + snapcont.append(expandedData) + else: + snapcont.append(snapcontPacked[index]) +@@ -348,7 +354,7 @@ class Config: + return msgStack + current = self.checkParser.items(option) + for opt,val in current: +- if not os.path.exists("/proc/sys/" + opt.replace(".","/")) and len(self.getFilesByFN("/proc/sys/",opt.replace(".","/"))) == 0: ++ if not os.path.exists("/proc/sys/" + self.ConfigPathToFileName(opt)) and len(self.getFilesByFN("/proc/sys/", self.ConfigPathToFileName(opt))) == 0: + msgStack = "%s%s%s\n" % (msgStack, _("Warning: File not found: /proc/sys/"), opt) + self.empty = False + if self.empty: +@@ -367,7 +373,7 @@ class Config: + self.checkParser.set('categories', '#' + option, value) + current = self.checkParser.items(option) + for opt,val in current: +- if not os.path.exists("/proc/sys/" + opt.replace(".", "/")) and len(self.getFilesByFN("/proc/sys/", opt.replace(".", "/"))) == 0: ++ if not os.path.exists("/proc/sys/" + self.ConfigPathToFileName(opt)) and len(self.getFilesByFN("/proc/sys/", self.ConfigPathToFileName(opt))) == 0: + self.checkParser.remove_option(option, opt) + self.checkParser.set(option, '#' + opt, val) + except (ConfigParser.Error, IOError) as e: +-- +1.8.3.1 + diff --git a/SOURCES/docs-Remove-stray-a.patch b/SOURCES/docs-Remove-stray-a.patch new file mode 100644 index 0000000..33470a1 --- /dev/null +++ b/SOURCES/docs-Remove-stray-a.patch @@ -0,0 +1,32 @@ +From da8e1f93194ca8c8e781131c008e7e1a216514b6 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 25 Nov 2013 15:54:27 +0100 +Subject: [PATCH 01/15] docs: Remove stray + +Remove a stray without a paired . This was probably left over from +an early edit. It doesn't cause any harm for html parsers that ignore it, +but can cause complaints by tools that look for problems in xml. + +Signed-off-by: John Kacur +Signed-off-by: Jiri Kastner +Signed-off-by: John Kacur +--- + docs/oscilloscope+tuna.html | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/docs/oscilloscope+tuna.html b/docs/oscilloscope+tuna.html +index 9bba9ae43898..de3b4d7f7ae6 100644 +--- a/docs/oscilloscope+tuna.html ++++ b/docs/oscilloscope+tuna.html +@@ -103,7 +103,7 @@ OSADL - The Open Source Automation Development Lab + +

By: Carsten Emde (Used by permission)

+

New versatile tools are helping us to manage real-time challenges under Linux (but you still can't tuna fish).

+-

The "CyclictestoSCOPE" in action

++

The "CyclictestoSCOPE" in action

+

Do you wish you had a built-in oscilloscope that continuously displays the latency of your system? Here is one - thanks to Arnaldo Carvalho de Melo who not only wrote the oscilloscope but also the graphical process inspection and modification tool tuna that is part of the same tool package. In addition, these tools are not only very versatile tools that help us to manage real-time challenges - they also are excellent examples of the power and the beauty of the Python script language and its libraries.

+

However, before we can install and run these tools, we must learn a little bit about cyclictest and its command line arguments, since this is where oscilloscope gets its data from.

+
Cyclictest
+-- +1.8.3.1 + diff --git a/SOURCES/git-housekeeping-Add-the-.gitattributes-file.patch b/SOURCES/git-housekeeping-Add-the-.gitattributes-file.patch deleted file mode 100644 index 92e639d..0000000 --- a/SOURCES/git-housekeeping-Add-the-.gitattributes-file.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 79f3e0b116dcb1bc0c1d10b370275e14733bcd47 Mon Sep 17 00:00:00 2001 -From: John Kacur -Date: Fri, 17 May 2013 14:24:47 +0200 -Subject: [PATCH 2/4] git-housekeeping: Add the .gitattributes file - -By adding the .gitattributes file, git-archive can be informed not to -include files such as .gitignore and ironically .gitattributes -when creating an archive. - -Signed-off-by: John Kacur ---- - .gitattributes | 2 ++ - 1 file changed, 2 insertions(+) - create mode 100644 .gitattributes - -diff --git a/.gitattributes b/.gitattributes -new file mode 100644 -index 0000000..5966153 ---- /dev/null -+++ b/.gitattributes -@@ -0,0 +1,2 @@ -+.gitattributes export-ignore -+.gitignore export-ignore --- -1.8.1.4 - diff --git a/SOURCES/tuna-Decide-whether-to-isolate-a-thread-based-on-PF_.patch b/SOURCES/tuna-Decide-whether-to-isolate-a-thread-based-on-PF_.patch new file mode 100644 index 0000000..10e7c37 --- /dev/null +++ b/SOURCES/tuna-Decide-whether-to-isolate-a-thread-based-on-PF_.patch @@ -0,0 +1,81 @@ +From 6f0a2ef512aeb2e4a16a561673c95568a8780713 Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 9 Jun 2015 16:08:44 -0300 +Subject: [PATCH 11/15] tuna: Decide whether to isolate a thread based on + PF_NO_SETAFFINITY + +We were avoiding moving kernel threads, for isolation purposes it is better +to check /perf/PID/stat's 'flag' big mask for PF_NO_SETAFFINITY instead. + +Requested-by: Luiz Capitulino +Cc: Clark Williams +Cc: Guy Streeter +Cc: Jeremy Eder +Cc: Jiri Kastner +Cc: John Kacur +Cc: Marcelo Tosatti +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna/tuna.py | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +diff --git a/tuna/tuna.py b/tuna/tuna.py +index 0efa84fdf314..6cd6bddd2137 100755 +--- a/tuna/tuna.py ++++ b/tuna/tuna.py +@@ -171,6 +171,15 @@ def is_hardirq_handler(self, pid): + return int(self.processes[pid]["stat"]["flags"]) & \ + PF_HARDIRQ and True or False + ++# FIXME: move to python-linux-procfs ++def cannot_set_affinity(self, pid): ++ PF_NO_SETAFFINITY = 0x04000000 ++ try: ++ return int(self.processes[pid]["stat"]["flags"]) & \ ++ PF_NO_SETAFFINITY and True or False ++ except: ++ return True ++ + def move_threads_to_cpu(cpus, pid_list, set_affinity_warning = None, + spread = False): + changed = False +@@ -325,7 +334,7 @@ def isolate_cpus(cpus, nr_cpus): + ps.reload_threads() + previous_pid_affinities = {} + for pid in ps.keys(): +- if iskthread(pid): ++ if cannot_set_affinity(ps, pid): + continue + try: + affinity = schedutils.get_affinity(pid) +@@ -347,7 +356,7 @@ def isolate_cpus(cpus, nr_cpus): + continue + threads = ps[pid]["threads"] + for tid in threads.keys(): +- if iskthread(tid): ++ if cannot_set_affinity(ps, tid): + continue + try: + affinity = schedutils.get_affinity(tid) +@@ -393,7 +402,7 @@ def include_cpus(cpus, nr_cpus): + ps.reload_threads() + previous_pid_affinities = {} + for pid in ps.keys(): +- if iskthread(pid): ++ if cannot_set_affinity(ps, pid): + continue + try: + affinity = schedutils.get_affinity(pid) +@@ -415,7 +424,7 @@ def include_cpus(cpus, nr_cpus): + continue + threads = ps[pid]["threads"] + for tid in threads.keys(): +- if iskthread(tid): ++ if cannot_set_affinity(ps, tid): + continue + try: + affinity = schedutils.get_affinity(tid) +-- +1.8.3.1 + diff --git a/SOURCES/tuna-Fix-race-in-is_hardirq_handler.patch b/SOURCES/tuna-Fix-race-in-is_hardirq_handler.patch new file mode 100644 index 0000000..1d10399 --- /dev/null +++ b/SOURCES/tuna-Fix-race-in-is_hardirq_handler.patch @@ -0,0 +1,38 @@ +From a4fdd27814ed7b4f2f6f609a72364b581ec19bc0 Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 9 Jun 2015 16:15:42 -0300 +Subject: [PATCH 12/15] tuna: Fix race in is_hardirq_handler + +It is better to try accessing the fields catching exceptions, as just +checking if we have that key is not enough for, right after, that thread +having gone away and the populating of that dict entry not finding the +file on /proc/PID/. + +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna/tuna.py | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/tuna/tuna.py b/tuna/tuna.py +index 6cd6bddd2137..3c30f03ea134 100755 +--- a/tuna/tuna.py ++++ b/tuna/tuna.py +@@ -166,10 +166,11 @@ def list_to_cpustring(l): + # FIXME: move to python-linux-procfs + def is_hardirq_handler(self, pid): + PF_HARDIRQ = 0x08000000 +- if not self.processes.has_key(pid): ++ try: ++ return int(self.processes[pid]["stat"]["flags"]) & \ ++ PF_HARDIRQ and True or False ++ except: + return False +- return int(self.processes[pid]["stat"]["flags"]) & \ +- PF_HARDIRQ and True or False + + # FIXME: move to python-linux-procfs + def cannot_set_affinity(self, pid): +-- +1.8.3.1 + diff --git a/SOURCES/tuna-Make-isolate-include-operations-affect-proc-irq.patch b/SOURCES/tuna-Make-isolate-include-operations-affect-proc-irq.patch new file mode 100644 index 0000000..ffb6165 --- /dev/null +++ b/SOURCES/tuna-Make-isolate-include-operations-affect-proc-irq.patch @@ -0,0 +1,143 @@ +From af7e63a63258c5151c0be3596ff184c35cd9fff9 Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Tue, 9 Jun 2015 13:23:27 -0300 +Subject: [PATCH 10/15] tuna: Make --isolate/--include operations affect + /proc/irq/default_smp_affinity + +When isolating CPUs we affect the IRQ smp_affinity masks, but that will not +affect new devices, to make the isolation operation to stick for that case too we +need to remove the isolated CPUs from the /proc/irq/default_smp_affinity file, +that is what is used to set the initial affinity mask for new device IRQs. + +E.g.: + +[root@emilia git]# tuna -q enp21s0f0-* -Q + # users affinity + 66 enp21s0f0-TxRx-0 0xff ixgbe + 67 enp21s0f0-TxRx-1 0xff ixgbe + 68 enp21s0f0-TxRx-2 0xff ixgbe + 69 enp21s0f0-TxRx-3 0xff ixgbe +[root@emilia git]# cat /proc/irq/default_smp_affinity +ff +[root@emilia git]# tuna -S1 --isolate +[root@emilia git]# tuna -q enp21s0f0-* -Q + # users affinity + 66 enp21s0f0-TxRx-0 0,2,4,6 ixgbe + 67 enp21s0f0-TxRx-1 0,2,4,6 ixgbe + 68 enp21s0f0-TxRx-2 0,2,4,6 ixgbe + 69 enp21s0f0-TxRx-3 0,2,4,6 ixgbe +[root@emilia git]# cat /proc/irq/default_smp_affinity +55 +>>> hex((1 << 0) | (1 << 2) | (1 << 4) | (1 << 6)) +'0x55' +[root@emilia git]# tuna --cpu 6 --isolate +[root@emilia git]# tuna -q enp21s0f0-* -Q + # users affinity + 66 enp21s0f0-TxRx-0 0,2,4 ixgbe + 67 enp21s0f0-TxRx-1 0,2,4 ixgbe + 68 enp21s0f0-TxRx-2 0,2,4 ixgbe + 69 enp21s0f0-TxRx-3 0,2,4 ixgbe +[root@emilia git]# cat /proc/irq/default_smp_affinity +15 +>>> hex((1 << 0) | (1 << 2) | (1 << 4)) +'0x15' +[root@emilia git]# tuna --cpu 1 --include +[root@emilia git]# tuna -q enp21s0f0-* -Q + # users affinity + 66 enp21s0f0-TxRx-0 0,1,2,4 ixgbe + 67 enp21s0f0-TxRx-1 0,1,2,4 ixgbe + 68 enp21s0f0-TxRx-2 0,1,2,4 ixgbe + 69 enp21s0f0-TxRx-3 0,1,2,4 ixgbe +[root@emilia git]# cat /proc/irq/default_smp_affinity +17 +>>> hex((1 << 0) | (1 << 1) | (1 << 2) | (1 << 4)) +'0x17' + +Requested-by: Luiz Capitulino +Cc: Clark Williams +Cc: Guy Streeter +Cc: Jeremy Eder +Cc: Jiri Kastner +Cc: John Kacur +Cc: Marcelo Tosatti +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna/tuna.py | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +diff --git a/tuna/tuna.py b/tuna/tuna.py +index 7b839f1e2d96..0efa84fdf314 100755 +--- a/tuna/tuna.py ++++ b/tuna/tuna.py +@@ -3,6 +3,7 @@ + + import copy, ethtool, os, procfs, re, schedutils + import help, fnmatch ++from procfs import utilist + + try: + set +@@ -92,9 +93,10 @@ def has_threaded_irqs(ps): + irq_re = re.compile("(irq/[0-9]+-.+|IRQ-[0-9]+)") + return len(ps.find_by_regex(irq_re)) > 0 + +-def set_irq_affinity(irq, bitmasklist): ++def set_irq_affinity_filename(filename, bitmasklist): ++ pathname="/proc/irq/%s" % filename ++ f = file(pathname, "w") + text = ",".join(map(lambda a: "%x" % a, bitmasklist)) +- f = file("/proc/irq/%d/smp_affinity" % irq, "w") + f.write("%s\n" % text) + try: + f.close() +@@ -103,6 +105,9 @@ def set_irq_affinity(irq, bitmasklist): + return False + return True + ++def set_irq_affinity(irq, bitmasklist): ++ return set_irq_affinity_filename("%d/smp_affinity" % irq, bitmasklist) ++ + def cpustring_to_list(cpustr): + """Convert a string of numbers to an integer list. + +@@ -307,6 +312,14 @@ def affinity_remove_cpus(affinity, cpus, nr_cpus): + affinity = list(set(affinity) - set(cpus)) + return affinity + ++# Shound be moved to python_linux_procfs.interrupts, shared with interrupts.parse_affinity, etc. ++def parse_irq_affinity_filename(filename, nr_cpus): ++ f = file("/proc/irq/%s" % filename) ++ line = f.readline() ++ f.close() ++ return utilist.bitmasklist(line, nr_cpus) ++ ++ + def isolate_cpus(cpus, nr_cpus): + ps = procfs.pidstats() + ps.reload_threads() +@@ -369,6 +382,10 @@ def isolate_cpus(cpus, nr_cpus): + procfs.hexbitmask(affinity, + nr_cpus)) + ++ affinity = parse_irq_affinity_filename("default_smp_affinity", nr_cpus) ++ affinity = affinity_remove_cpus(affinity, cpus, nr_cpus) ++ set_irq_affinity_filename("default_smp_affinity", procfs.hexbitmask(affinity, nr_cpus)) ++ + return (previous_pid_affinities, previous_irq_affinities) + + def include_cpus(cpus, nr_cpus): +@@ -432,6 +449,10 @@ def include_cpus(cpus, nr_cpus): + set_irq_affinity(int(irq), + procfs.hexbitmask(affinity, nr_cpus)) + ++ affinity = parse_irq_affinity_filename("default_smp_affinity", nr_cpus) ++ affinity = list(set(affinity + cpus)) ++ set_irq_affinity_filename("default_smp_affinity", procfs.hexbitmask(affinity, nr_cpus)) ++ + return (previous_pid_affinities, previous_irq_affinities) + + def get_irq_users(irqs, irq, nics = None): +-- +1.8.3.1 + diff --git a/SOURCES/tuna-config-Fix-pygtk-import.patch b/SOURCES/tuna-config-Fix-pygtk-import.patch new file mode 100644 index 0000000..4cabb01 --- /dev/null +++ b/SOURCES/tuna-config-Fix-pygtk-import.patch @@ -0,0 +1,46 @@ +From f1d14ac0012745a7ef6079f4fee03636d539487b Mon Sep 17 00:00:00 2001 +From: Arnaldo Carvalho de Melo +Date: Wed, 29 Apr 2015 11:26:45 -0300 +Subject: [PATCH 09/15] tuna config: Fix pygtk import + +We should 'import gtk', not 'import pygtk', fixes bugs when the error +paths try to use gtk.messageDialog(): + +[root@ssdandy tuna]# tuna +Traceback (most recent call last): + File "/home/acme/git/tuna/tuna-cmd.py", line 654, in + main() + File "/home/acme/git/tuna/tuna-cmd.py", line 648, in main + app = tuna_gui.main_gui(kthreads, uthreads, cpus_filtered) + File "/home/acme/git/tuna/tuna/tuna_gui.py", line 64, in __init__ + self.profileview.init_default_file() + File "/home/acme/git/tuna/tuna/gui/profileview.py", line 141, in +init_default_file + not self.config.load(self.config.config['lastfile']): + File "/home/acme/git/tuna/tuna/config.py", line 48, in load + if(self.tuned2Tuna(profileName) < 0): + File "/home/acme/git/tuna/tuna/config.py", line 66, in tuned2Tuna + dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR,\ +NameError: global name 'gtk' is not defined +[root@ssdandy tuna]# + +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: John Kacur +--- + tuna/config.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tuna/config.py b/tuna/config.py +index 77cc4d800c03..7e19a28f967f 100644 +--- a/tuna/config.py ++++ b/tuna/config.py +@@ -1,5 +1,5 @@ + import io, os, re, fnmatch +-import sys, pygtk ++import sys, gtk + import codecs, ConfigParser + from time import localtime, strftime + from subprocess import Popen, PIPE, STDOUT, call +-- +1.8.3.1 + diff --git a/SOURCES/tuna-modified-sysctl-settings-in-example.conf.patch b/SOURCES/tuna-modified-sysctl-settings-in-example.conf.patch index bfa5894..dcbf150 100644 --- a/SOURCES/tuna-modified-sysctl-settings-in-example.conf.patch +++ b/SOURCES/tuna-modified-sysctl-settings-in-example.conf.patch @@ -1,20 +1,20 @@ -From 9c9f25a7a6c2541ca4a0719d27900409b9fa7282 Mon Sep 17 00:00:00 2001 +From 40d6203ec11daf500bc24b30b962565e4551c372 Mon Sep 17 00:00:00 2001 From: Petr Oros Date: Tue, 4 Feb 2014 08:51:07 +0100 -Subject: [PATCH] tuna: modified sysctl settings in example.conf +Subject: [PATCH 05/15] tuna: modified sysctl settings in example.conf Signed-off-by: Petr Oros Signed-off-by: Jiri Kastner Signed-off-by: John Kacur --- - etc/tuna/example.conf | 72 +++++++++++++++++++++++++++------------------------ - 1 file changed, 38 insertions(+), 34 deletions(-) + etc/tuna/example.conf | 75 +++++++++++++++++++++++++++------------------------ + 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/etc/tuna/example.conf b/etc/tuna/example.conf -index 7448a4e..96e3a00 100644 +index 7448a4ecd2af..7bb293e3d2ed 100644 --- a/etc/tuna/example.conf +++ b/etc/tuna/example.conf -@@ -1,54 +1,58 @@ +@@ -1,54 +1,59 @@ #List of enabled categories [categories] -kernel=Kernel scheduler @@ -36,6 +36,7 @@ index 7448a4e..96e3a00 100644 -kernel.sched_rt_runtime_us= 1000,2000000, -kernel.sched_tunable_scaling=0,10, -kernel.sched_wakeup_granularity_ns=1000,10000000, +-kernel.core_pattern = +kernel.sched_latency_ns = 1000,50000000, +kernel.sched_min_granularity_ns = ,, +kernel.sched_nr_migrate = 0,128, @@ -45,8 +46,8 @@ index 7448a4e..96e3a00 100644 +kernel.sched_wakeup_granularity_ns = 1000,20000000, +kernel.sched_migration_cost_ns = ,, +kernel.sched_autogroup_enabled = 0,1, - kernel.core_pattern = -+kernel.sem = ++kernel.core_pattern = ++kernel.sem = [vm] -vm.dirty_ratio=0,100, @@ -84,10 +85,10 @@ index 7448a4e..96e3a00 100644 -net.ipv4.tcp_window_scaling=0,1, +net.ipv4.tcp_window_scaling = 0,1, +net.ipv4.conf.all.forwarding = 0,1, -+net.ipv4.conf.all.rp_filter = -+net.ipv4.tcp_congestion_control = -+net.ipv4.tcp_max_syn_backlog = -+net.ipv4.tcp_mem = ++net.ipv4.conf.all.rp_filter = ++net.ipv4.tcp_congestion_control = ++net.ipv4.tcp_max_syn_backlog = ++net.ipv4.tcp_mem = +net.ipv4.tcp_slow_start_after_idle = 0,1, [ipv6] @@ -107,6 +108,7 @@ index 7448a4e..96e3a00 100644 [fileDescription] -text=This file contain some features for tunning kernel params.Mainly this is example file for demonstrate tuna new features. Params are set as default or most uses value +text = This file contain some features for tunning kernel params.Mainly this is example file for demonstrate tuna new features. Params are set as default or most uses value ++ -- -1.8.1.4 +1.8.3.1 diff --git a/SPECS/tuna.spec b/SPECS/tuna.spec index dd7f326..6968af6 100644 --- a/SPECS/tuna.spec +++ b/SPECS/tuna.spec @@ -3,20 +3,29 @@ Name: tuna Version: 0.11.1 -Release: 8%{?dist} +Release: 10%{?dist} License: GPLv2 Summary: Application tuning GUI & command line utility Group: Applications/System Source: http://userweb.kernel.org/~acme/tuna/%{name}-%{version}.tar.bz2 Patch1: spec-Mark-configuration-files-with-config.patch -Patch2: git-housekeeping-Add-the-.gitattributes-file.patch +Patch2: docs-Remove-stray-a.patch Patch3: CLI-fix-ps_show_thread-call-with-bad-args-count.patch -Patch4: spec-Show-where-the-original-source-comes-from-in-co.patch -Patch5: tuna-modified-sysctl-settings-in-example.conf.patch -Patch6: CLI-fix-traceback-where-enter-p-policy-without-prio.patch -Patch7: Add-a-tuna.desktop-file.patch -Patch8: CLI-fix-traceback-due-unavailable-display.patch +Patch4: CLI-fix-traceback-where-enter-p-policy-without-prio.patch +Patch5: CLI-fix-traceback-due-unavailable-display.patch +Patch6: tuna-modified-sysctl-settings-in-example.conf.patch +Patch7: CLI-fix-traceback-when-p-is-used-with-unsupported-va.patch +Patch8: Add-a-tuna.desktop-file.patch +Patch9: CLI-Introduce-nohz_full-N-entity.patch +Patch10: tuna-config-Fix-pygtk-import.patch +Patch11: tuna-Make-isolate-include-operations-affect-proc-irq.patch +Patch12: tuna-Decide-whether-to-isolate-a-thread-based-on-PF_.patch +Patch13: tuna-Fix-race-in-is_hardirq_handler.patch +Patch14: CLI-Do-not-show-column-headers-when-not-outputting-t.patch +Patch15: Fix-behavior-for-dot-inside-proc-sys-path.patch +Patch16: Correct-a-typo-in-the-net.ipv4.ipfrag_time-help-stri.patch +Patch17: spec-Show-where-the-original-source-comes-from-in-co.patch URL: http://userweb.kernel.org/~acme/tuna/ # Real source is now at git://git.kernel.org/pub/scm/utils/tuna/tuna @@ -64,6 +73,16 @@ priority is changed, be it using tuna or plain chrt & taskset. %patch6 -p1 %patch7 -p1 %patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 + %build %{__python} setup.py build @@ -118,6 +137,22 @@ rm -rf %{buildroot} %doc docs/oscilloscope+tuna.pdf %changelog +* Thu Jun 25 2015 John Kacur - 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 - 0.11.1-9 +- Fix-behavior-for-dot-inside-proc-sys-path.patch +Resolves: rhbz#1178917 + * Mon Oct 20 2014 John Kacur - 0.11.1-8 - CLI-fix-traceback-due-unavailable-display.patch Resolves: rhbz#1035853