Em Fri, Nov 27, 2015 at 04:36:54PM -0200, Daniel Bristot de Oliveira escreveu:
Tuna checks if PF_NO_SETAFFINITY is set on /proc/PID/stat's
'flag'
field to verify if it is possible to migrate a process/thread.
This is working fine for process, but not for threads.
For threads, the file /proc/TID/stat is being checked, but this file
does not exist as the stat file of a thread is at /proc/PID/task/TID/stat.
Hence, the check was failing and threads were not being migrated.
This patch adds a function to check thread's stat file, and this
function is called to verify the PF_NO_SETAFFINITY flag for
threads.
From visual inspection:
Acked-by: Arnaldo Carvalho de Melo <acme(a)redhat.com>
I'll add this upstream and push.
Thanks!
- Arnaldo
> Cc: Luiz Capitulino <lcapitulino(a)redhat.com>
> Cc: Jiri Kastner <jkastner(a)redhat.com>
> Cc: John Kacur <jkacur(a)redhat.com>
> Signed-off-by: Daniel Bristot de Oliveira <bristot(a)redhat.com>
> ---
> tuna/tuna.py | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/tuna/tuna.py b/tuna/tuna.py
> index 3c30f03..1de63b0 100755
> --- a/tuna/tuna.py
> +++ b/tuna/tuna.py
> @@ -181,6 +181,15 @@ def cannot_set_affinity(self, pid):
> except:
> return True
>
> +# FIXME: move to python-linux-procfs
> +def cannot_set_thread_affinity(self, pid, tid):
> + PF_NO_SETAFFINITY = 0x04000000
> + try:
> + return int(self.processes[pid].threads[tid]["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
> @@ -357,7 +366,7 @@ def isolate_cpus(cpus, nr_cpus):
> continue
> threads = ps[pid]["threads"]
> for tid in threads.keys():
> - if cannot_set_affinity(ps, tid):
> + if cannot_set_thread_affinity(ps, pid, tid):
> continue
> try:
> affinity = schedutils.get_affinity(tid)
> @@ -425,7 +434,7 @@ def include_cpus(cpus, nr_cpus):
> continue
> threads = ps[pid]["threads"]
> for tid in threads.keys():
> - if cannot_set_affinity(ps, tid):
> + if cannot_set_thread_affinity(ps, pid, tid):
> continue
> try:
> affinity = schedutils.get_affinity(tid)
> --
> 2.5.0