[PATCH 1/1] app/mldev: add internal function for file read

Stephen Hemminger stephen at networkplumber.org
Tue Mar 28 17:52:29 CEST 2023


On Thu, 23 Mar 2023 08:28:01 -0700
Srikanth Yalavarthi <syalavarthi at marvell.com> wrote:

> +	if (fseek(fp, 0, SEEK_END) == 0) {
> +		file_size = ftell(fp);
> +		if (file_size == -1) {
> +			ret = -EIO;
> +			goto error;
> +		}
> +
> +		file_buffer = rte_malloc(NULL, file_size, RTE_CACHE_LINE_SIZE);
> +		if (file_buffer == NULL) {
> +			ml_err("Failed to allocate memory: %s\n", file);
> +			ret = -ENOMEM;
> +			goto error;
> +		}
> +
> +		if (fseek(fp, 0, SEEK_SET) != 0) {
> +			ret = -EIO;
> +			goto error;
> +		}
> +
> +		if (fread(file_buffer, sizeof(char), file_size, fp) != (unsigned long)file_size) {
> +			ml_err("Failed to read file : %s\n", file);
> +			ret = -EIO;
> +			goto error;
> +		}
> +		fclose(fp);
> +	} else {
> +		ret = -EIO;
> +		goto error;
> +	}
> +
> +	*buffer = file_buffer;
> +	*size = file_size;
> +
> +	return 0;

Granted this only test code, but is the slowest way to do this.
Stdio is buffered (in 4K chunks). And using rte_malloc comes from hugepages.

Three levels of improvement are possible:
  1. don't use rte_malloc() use malloc() instead.
  2. use direct system call for I/O
  3. use mmap() to directly map in the file instead read



More information about the dev mailing list