File iotop-kernel-task-delayacct.patch of Package iotop.38532

commit ab35334d374e588bec12d201fb8869c536f0545d
Author: Paul Wise <pabs3@bonedaddy.net>
Date:   Sat Oct 2 12:13:16 2021 +0800

    Detect the kernel.task_delayacct sysctl value
    
    If you have ever turned on the kernel.task_delayacct sysctl for the current
    Linux boot, then the heuristic that iotop uses to find out if swapin/io are
    available, gives a false negative, so the sysctl has to be checked too now.
    
    Fixes: https://github.com/Tomas-M/iotop/issues/21
    Reported-by: @ManuLinares
    Forwarded-by: Boian Bonev <bbonev@ipacct.com>

Index: iotop-0.6/iotop/data.py
===================================================================
--- iotop-0.6.orig/iotop/data.py
+++ iotop-0.6/iotop/data.py
@@ -459,3 +459,11 @@ class ProcessList(DumpableObject):
 
     def clear(self):
         self.processes = {}
+
+
+def sysctl_task_delayacct():
+    try:
+        with open('/proc/sys/kernel/task_delayacct') as f:
+            return bool(int(f.read().strip()))
+    except FileNotFoundError:
+        return None
Index: iotop-0.6/iotop/ui.py
===================================================================
--- iotop-0.6.orig/iotop/ui.py
+++ iotop-0.6/iotop/ui.py
@@ -30,7 +30,7 @@ import signal
 import sys
 import time
 
-from iotop.data import find_uids, TaskStatsNetlink, ProcessList, Stats
+from iotop.data import find_uids, TaskStatsNetlink, ProcessList, Stats, sysctl_task_delayacct
 from iotop.data import ThreadInfo
 from iotop.version import VERSION
 from iotop import ioprio
@@ -377,7 +377,7 @@ class IOTopUI(object):
         def format(p):
             stats = format_stats(self.options, p, self.process_list.duration)
             io_delay, swapin_delay, read_bytes, write_bytes = stats
-            if Stats.has_blkio_delay_total:
+            if self.has_swapin_io:
                 delay_stats = '%7s %7s ' % (swapin_delay, io_delay)
             else:
                 delay_stats = ' ?unavailable?  '
@@ -431,6 +431,14 @@ class IOTopUI(object):
             pid += 'TID'
         titles = [pid, '  PRIO', '  USER', '     DISK READ', '  DISK WRITE',
                   '  SWAPIN', '      IO', '    COMMAND']
+        self.has_swapin_io = Stats.has_blkio_delay_total
+        if self.has_swapin_io:
+            # Linux kernels without the sysctl return None and
+            # iotop just uses the heuristic for those versions.
+            # Linux kernels with the sysctl return True or False
+            # and iotop then uses the sysctl value instead.
+            if sysctl_task_delayacct() == False:
+                self.has_swapin_io = False
         lines = self.get_data()
         if self.options.time:
             titles = ['    TIME'] + titles
@@ -464,7 +472,7 @@ class IOTopUI(object):
                 title = title[:remaining_cols]
                 remaining_cols -= len(title)
                 self.win.addstr(title, attr)
-            if Stats.has_blkio_delay_total:
+            if self.has_swapin_io:
                 status_msg = None
             else:
                 status_msg = ('CONFIG_TASK_DELAY_ACCT not enabled in kernel, '
openSUSE Build Service is sponsored by