[PATCH v2 6/6] eal/memory: add page size VA limits EAL parameter

Burakov, Anatoly anatoly.burakov at intel.com
Mon Jun 1 11:14:45 CEST 2026


On 5/26/2026 6:16 PM, Bruce Richardson wrote:
> On Fri, Mar 13, 2026 at 04:06:37PM +0000, Anatoly Burakov wrote:
>> Currently, the VA space limits placed on DPDK memory are only informed by
>> the default configuration coming from `rte_config.h` file. Add an EAL flag
>> to specify per-page size memory limits explicitly, thereby overriding the
>> default VA space reservations.
>>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
>> ---
> Acked-by: Bruce Richardson <bruce.richardson at intel.com>
> 

Hi Bruce,

>> +static int
>> +eal_parse_pagesz_mem(char *strval, struct internal_config *internal_cfg)
>> +{
>> +	char strval_cpy[1024];
>> +	char *fields[3];
>> +	char *pagesz_str, *mem_str;
>> +	int arg_num;
>> +	int len;
>> +	unsigned int i;
>> +	uint64_t pagesz, mem_limit;
>> +	struct pagesz_mem_override *pmo;
>> +
>> +	len = strnlen(strval, 1024);
>> +	if (len >= 1024) {
>> +		EAL_LOG(ERR, "--pagesz-mem parameter is too long");
>> +		return -1;
>> +	}
>> +
>> +	rte_strlcpy(strval_cpy, strval, sizeof(strval_cpy));
>> +
>> +	/* parse exactly one pagesz:mem pair per --pagesz-mem option */
>> +	arg_num = rte_strsplit(strval_cpy, len, fields, RTE_DIM(fields), ':');
>> +	if (arg_num != 2 || fields[0][0] == '\0' || fields[1][0] == '\0') {
>> +		EAL_LOG(ERR, "--pagesz-mem parameter format is invalid, expected <pagesz>:<limit>");
>> +		return -1;
>> +	}
>> +	pagesz_str = fields[0];
>> +	mem_str = fields[1];
>> +
>> +	/* reject accidental multiple pairs in one option */
>> +	if (strchr(mem_str, ',') != NULL) {
>> +		EAL_LOG(ERR, "--pagesz-mem accepts one <pagesz>:<limit> pair per option");
>> +		return -1;
>> +	}
> 
> If multiple options are given, then the rte_strsplit should return >2 when
> splitting on ":". I'd suggest checking for the comma first, before even
> doing the strlcpy.
> 
>> +
>> +	/* parse page size */
>> +	errno = 0;
>> +	pagesz = rte_str_to_size(pagesz_str);
>> +	if (pagesz == 0 || errno != 0) {
>> +		EAL_LOG(ERR, "invalid page size in --pagesz-mem: '%s'", pagesz_str);
>> +		return -1;
>> +	}
>> +	if (!rte_is_power_of_2(pagesz)) {
>> +		EAL_LOG(ERR, "invalid page size in --pagesz-mem: '%s' (must be a power of two)",
>> +			pagesz_str);
>> +		return -1;
>> +	}
>> +
>> +	/* parse memory limit (0 is valid: disables allocation for this page size) */
>> +	errno = 0;
>> +	mem_limit = rte_str_to_size(mem_str);
>> +	if (errno != 0) {
>> +		EAL_LOG(ERR, "invalid memory limit in --pagesz-mem: '%s'", mem_str);
>> +		return -1;
>> +	}
>> +
>> +	/* validate alignment: memory limit must be divisible by page size */
>> +	if (mem_limit % pagesz != 0) {
>> +		EAL_LOG(ERR, "--pagesz-mem memory limit must be aligned to page size");
>> +		return -1;
>> +	}
>> +
>> +	for (i = 0; i < internal_cfg->num_pagesz_mem_overrides; i++) {
>> +		pmo = &internal_cfg->pagesz_mem_overrides[i];
>> +		if (pmo->pagesz != pagesz)
>> +			continue;
>> +
>> +		EAL_LOG(WARNING,
>> +			"--pagesz-mem specified multiple times for page size '%s'; later limit '%s' will be used",
>> +			pagesz_str, mem_str);
>> +		pmo->limit = mem_limit;
>> +		return 0;
> 
> Rather than just warning, I'd make this a hard error and say you can't
> duplicate the hugepage limits on commandline. Saves confusion when
> examining a commandline, having to check if a value is overridden later.
> 
Apologies, missed these comments in v3, will resubmit a v4.

-- 
Thanks,
Anatoly


More information about the dev mailing list