diff options
Diffstat (limited to 'src/basic/cpu-set-util.c')
-rw-r--r-- | src/basic/cpu-set-util.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/basic/cpu-set-util.c b/src/basic/cpu-set-util.c index 36cb017ae7..51752ad1a6 100644 --- a/src/basic/cpu-set-util.c +++ b/src/basic/cpu-set-util.c @@ -86,6 +86,51 @@ char *cpu_set_to_range_string(const CPUSet *set) { return TAKE_PTR(str) ?: strdup(""); } +/* XXX(msekleta): this is the workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1819152, remove in 8.3 */ +char *cpu_set_to_range_string_kernel(const CPUSet *set) { + unsigned range_start = 0, range_end; + _cleanup_free_ char *str = NULL; + size_t allocated = 0, len = 0; + bool in_range = false; + int r; + + for (unsigned i = 0; i < set->allocated * 8; i++) + if (CPU_ISSET_S(i, set->allocated, set->set)) { + if (in_range) + range_end++; + else { + range_start = range_end = i; + in_range = true; + } + } else if (in_range) { + in_range = false; + + if (!GREEDY_REALLOC(str, allocated, len + 2 + 2 * DECIMAL_STR_MAX(unsigned))) + return NULL; + + if (range_end > range_start) + r = sprintf(str + len, len > 0 ? ",%d-%d" : "%d-%d", range_start, range_end); + else + r = sprintf(str + len, len > 0 ? ",%d" : "%d", range_start); + assert_se(r > 0); + len += r; + } + + if (in_range) { + if (!GREEDY_REALLOC(str, allocated, len + 2 + 2 * DECIMAL_STR_MAX(int))) + return NULL; + + if (range_end > range_start) + r = sprintf(str + len, len > 0 ? ",%d-%d" : "%d-%d", range_start, range_end); + else + r = sprintf(str + len, len > 0 ? ",%d" : "%d", range_start); + assert_se(r > 0); + } + + return TAKE_PTR(str) ?: strdup(""); +} + + int cpu_set_realloc(CPUSet *cpu_set, unsigned ncpus) { size_t need; |