nproc: prepare for arbitrarily large CPU masks

function                                             old     new   delta
get_malloc_cpu_affinity                                -      76     +76
nproc_main                                           216     206     -10
process_pid_str                                      250     206     -44
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/2 up/down: 76/-54)             Total: 22 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2024-05-31 11:56:40 +02:00
parent fd47f05676
commit 5a68a246e7
5 changed files with 38 additions and 27 deletions

View file

@ -56,7 +56,6 @@
* -a/--all-tasks (affect all threads)
* needs to get TIDs from /proc/PID/task/ and use _them_ as "pid" in sched_setaffinity(pid)
*/
#include <sched.h>
#include "libbb.h"
@ -96,27 +95,6 @@ static unsigned long from_mask(ul *mask, unsigned sz_in_bytes UNUSED_PARAM)
}
#endif
static unsigned long *get_aff(int pid, unsigned *sz)
{
int r;
unsigned long *mask = NULL;
unsigned sz_in_bytes = *sz;
for (;;) {
mask = xrealloc(mask, sz_in_bytes);
r = sched_getaffinity(pid, sz_in_bytes, (void*)mask);
if (r == 0)
break;
sz_in_bytes *= 2;
if (errno == EINVAL && (int)sz_in_bytes > 0)
continue;
bb_perror_msg_and_die("can't %cet pid %d's affinity", 'g', pid);
}
//bb_error_msg("get mask[0]:%lx sz_in_bytes:%d", mask[0], sz_in_bytes);
*sz = sz_in_bytes;
return mask;
}
#if ENABLE_FEATURE_TASKSET_CPULIST
/*
* Parse the CPU list and set the mask accordingly.
@ -222,7 +200,7 @@ static int process_pid_str(const char *pid_str, unsigned opts, char *aff)
mask_size_in_bytes = SZOF_UL;
current_new = "current";
print_aff:
mask = get_aff(pid, &mask_size_in_bytes);
mask = get_malloc_cpu_affinity(pid, &mask_size_in_bytes);
if (opts & OPT_p) {
#if ENABLE_FEATURE_TASKSET_CPULIST
if (opts & OPT_c) {