6 # From http://git.kernel.org/?p=utils/util-linux-ng/util-linux-ng.git;a=blob;
7 # f=configure.ac;h=770eb45ae85d32757fc3cff1d70a7808a627f9f7;hb=HEAD#l363
8 IOPRIO_GET_ARCH_SYSCALL
= [
19 def find_ioprio_get_syscall_number():
22 for candidate_arch
, syscall_nr
in IOPRIO_GET_ARCH_SYSCALL
:
23 if fnmatch
.fnmatch(arch
, candidate_arch
):
27 __NR_ioprio_get
= find_ioprio_get_syscall_number()
28 ctypes_handle
= ctypes
.CDLL(None)
29 syscall
= ctypes_handle
.syscall
31 PRIORITY_CLASSES
= (None, 'rt', 'be', 'idle')
34 IOPRIO_CLASS_SHIFT
= 13
35 IOPRIO_PRIO_MASK
= (1 << IOPRIO_CLASS_SHIFT
) - 1
37 def ioprio_class(ioprio
):
38 return PRIORITY_CLASSES
[ioprio
>> IOPRIO_CLASS_SHIFT
]
40 def ioprio_data(ioprio
):
41 return ioprio
& IOPRIO_PRIO_MASK
43 sched_getscheduler
= ctypes_handle
.sched_getscheduler
44 SCHED_OTHER
, SCHED_FIFO
, SCHED_RR
, SCHED_BATCH
, SCHED_ISO
, SCHED_IDLE
= range(6)
46 def get_ioprio_from_sched(pid
):
47 scheduler
= sched_getscheduler(pid
)
48 nice
= int(open('/proc/%d/stat' % pid
).read().split()[18])
49 ioprio_nice
= (nice
+ 20) / 5
51 if scheduler
in (SCHED_FIFO
, SCHED_RR
):
52 return 'rt/%d' % ioprio_nice
53 elif scheduler
== SCHED_IDLE
:
56 return 'be/%d' % ioprio_nice
59 if __NR_ioprio_get
is None:
62 ioprio
= syscall(__NR_ioprio_get
, WHO_PROCESS
, pid
)
66 prio_class
= ioprio_class(ioprio
)
68 return get_ioprio_from_sched(pid
)
69 if prio_class
== 'idle':
71 return '%s/%d' % (prio_class
, ioprio_data(ioprio
))
78 if key
.startswith('rt/'):
80 elif key
.startswith('be/'):
82 prio
= int(key
.split('/')[1])
87 return (1 << (shift
* IOPRIO_CLASS_SHIFT
)) + prio
89 if __name__
== '__main__':
91 if len(sys
.argv
) == 2:
92 pid
= int(sys
.argv
[1])
96 print 'ioprio:', get(pid
)