99a968fac0
Add in the '-l' command line parameter (also --core-list) So the user can now pass --corelist=4,6,8-10 and it will expand out to 4,6,8,9,10 using the parse function provided in parse.c (parse_set). This list of cores is then used to enable out-of-band monitoring to scale up and down these cores based on the ratio of branch hits versus branch misses. The ratio will be low when a poll loop is spinning with no packets being received, so the frequency will be scaled down. Also , as part of this change, we introduce a core_info struct which keeps information on each core in the system, and whether we're doing out of band monitoring on them. Signed-off-by: David Hunt <david.hunt@intel.com> Acked-by: Radu Nicolau <radu.nicolau@intel.com>
82 lines
1.7 KiB
C
82 lines
1.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation.
|
|
* Copyright(c) 2014 6WIND S.A.
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <rte_log.h>
|
|
#include "parse.h"
|
|
|
|
/*
|
|
* Parse elem, the elem could be single number/range or group
|
|
* 1) A single number elem, it's just a simple digit. e.g. 9
|
|
* 2) A single range elem, two digits with a '-' between. e.g. 2-6
|
|
* 3) A group elem, combines multiple 1) or 2) e.g 0,2-4,6
|
|
* Within group, '-' used for a range separator;
|
|
* ',' used for a single number.
|
|
*/
|
|
int
|
|
parse_set(const char *input, uint16_t set[], unsigned int num)
|
|
{
|
|
unsigned int idx;
|
|
const char *str = input;
|
|
char *end = NULL;
|
|
unsigned int min, max;
|
|
|
|
memset(set, 0, num * sizeof(uint16_t));
|
|
|
|
while (isblank(*str))
|
|
str++;
|
|
|
|
/* only digit or left bracket is qualify for start point */
|
|
if (!isdigit(*str) || *str == '\0')
|
|
return -1;
|
|
|
|
while (isblank(*str))
|
|
str++;
|
|
if (*str == '\0')
|
|
return -1;
|
|
|
|
min = num;
|
|
do {
|
|
|
|
/* go ahead to the first digit */
|
|
while (isblank(*str))
|
|
str++;
|
|
if (!isdigit(*str))
|
|
return -1;
|
|
|
|
/* get the digit value */
|
|
errno = 0;
|
|
idx = strtoul(str, &end, 10);
|
|
if (errno || end == NULL || idx >= num)
|
|
return -1;
|
|
|
|
/* go ahead to separator '-' and ',' */
|
|
while (isblank(*end))
|
|
end++;
|
|
if (*end == '-') {
|
|
if (min == num)
|
|
min = idx;
|
|
else /* avoid continuous '-' */
|
|
return -1;
|
|
} else if ((*end == ',') || (*end == '\0')) {
|
|
max = idx;
|
|
|
|
if (min == num)
|
|
min = idx;
|
|
|
|
for (idx = RTE_MIN(min, max);
|
|
idx <= RTE_MAX(min, max); idx++) {
|
|
set[idx] = 1;
|
|
}
|
|
min = num;
|
|
} else
|
|
return -1;
|
|
|
|
str = end + 1;
|
|
} while (*end != '\0');
|
|
|
|
return str - input;
|
|
}
|