From: Karel Zak Date: Thu, 11 Aug 2022 08:59:40 +0000 (+0200) Subject: taskset: warn if affinity is not settable X-Git-Tag: v2.39-rc1~556 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=adc72421f4db93bc9cd932bac2b0be8197a1d64f;p=thirdparty%2Futil-linux.git taskset: warn if affinity is not settable Let's read /proc/#/stat to get process flags and print warning if the affinity is not settable. Based on patch from Carsten. Tested-by: Carsten Emde Signed-off-by: Karel Zak --- diff --git a/schedutils/taskset.c b/schedutils/taskset.c index 0ab7d12e20..0872aa273a 100644 --- a/schedutils/taskset.c +++ b/schedutils/taskset.c @@ -35,6 +35,10 @@ #include "c.h" #include "closestream.h" +#ifndef PF_NO_SETAFFINITY +# define PF_NO_SETAFFINITY 0x04000000 +#endif + struct taskset { pid_t pid; /* task PID */ cpu_set_t *set; /* task CPU mask */ @@ -112,6 +116,7 @@ static void __attribute__((__noreturn__)) err_affinity(pid_t pid, int set) err(EXIT_FAILURE, msg, pid ? pid : getpid()); } + static void do_taskset(struct taskset *ts, size_t setsize, cpu_set_t *set) { /* read the current mask */ @@ -125,8 +130,22 @@ static void do_taskset(struct taskset *ts, size_t setsize, cpu_set_t *set) return; /* set new mask */ - if (sched_setaffinity(ts->pid, setsize, set) < 0) + if (sched_setaffinity(ts->pid, setsize, set) < 0) { + uintmax_t flags = 0; + struct path_cxt *pc; + int errsv = errno; + + if (errno != EPERM + && (pc = ul_new_procfs_path(ts->pid, NULL)) + && procfs_process_get_stat_nth(pc, 9, &flags) == 0 + && (flags & PF_NO_SETAFFINITY)) { + warnx(_("affinity cannot be set due to PF_NO_SETAFFINITY flag set")); + errno = EINVAL; + } else + errno = errsv; + err_affinity(ts->pid, 1); + } /* re-read the current mask */ if (ts->pid) {