66d9f61de0
Currently, we use strdup in a few places to store command-line parameter values for certain internal config values. There are several issues with that. First of all, they're never freed, so memory ends up leaking either after EAL exit, or when these command-line options are supplied multiple times. Second of all, they're defined as `const char *`, so they *cannot* be freed even if we wanted to. Finally, strdup may return NULL, which will be stored in the config. For most fields, NULL is a valid value, but for the default prefix, the value is always expected to be valid. To fix all of this, three things are done. First, we change the definitions of these values to `char *` as opposed to `const char *`. This does not break the ABI, and previous code assumes constness (which is more restrictive), so it's safe to do so. Then, fix all usages of strdup to check return value, and add a cleanup function that will free the memory occupied by these strings, as well as freeing them before assigning a new value to prevent leaks when parameter is specified multiple times. And finally, add an internal API to query hugefile prefix, so that, absent of a valid value, a default value will be returned, and also fix up all usages of hugefile prefix to use this API instead of accessing hugefile prefix directly. Bugzilla ID: 108 Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
84 lines
3.3 KiB
C
84 lines
3.3 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* Holds the structures for the eal internal configuration
|
|
*/
|
|
|
|
#ifndef EAL_INTERNAL_CFG_H
|
|
#define EAL_INTERNAL_CFG_H
|
|
|
|
#include <rte_eal.h>
|
|
#include <rte_pci_dev_feature_defs.h>
|
|
|
|
#define MAX_HUGEPAGE_SIZES 3 /**< support up to 3 page sizes */
|
|
|
|
/*
|
|
* internal configuration structure for the number, size and
|
|
* mount points of hugepages
|
|
*/
|
|
struct hugepage_info {
|
|
uint64_t hugepage_sz; /**< size of a huge page */
|
|
char hugedir[PATH_MAX]; /**< dir where hugetlbfs is mounted */
|
|
uint32_t num_pages[RTE_MAX_NUMA_NODES];
|
|
/**< number of hugepages of that size on each socket */
|
|
int lock_descriptor; /**< file descriptor for hugepage dir */
|
|
};
|
|
|
|
/**
|
|
* internal configuration
|
|
*/
|
|
struct internal_config {
|
|
volatile size_t memory; /**< amount of asked memory */
|
|
volatile unsigned force_nchannel; /**< force number of channels */
|
|
volatile unsigned force_nrank; /**< force number of ranks */
|
|
volatile unsigned no_hugetlbfs; /**< true to disable hugetlbfs */
|
|
unsigned hugepage_unlink; /**< true to unlink backing files */
|
|
volatile unsigned no_pci; /**< true to disable PCI */
|
|
volatile unsigned no_hpet; /**< true to disable HPET */
|
|
volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
|
|
* instead of native TSC */
|
|
volatile unsigned no_shconf; /**< true if there is no shared config */
|
|
volatile unsigned in_memory;
|
|
/**< true if DPDK should operate entirely in-memory and not create any
|
|
* shared files or runtime data.
|
|
*/
|
|
volatile unsigned create_uio_dev; /**< true to create /dev/uioX devices */
|
|
volatile enum rte_proc_type_t process_type; /**< multi-process proc type */
|
|
/** true to try allocating memory on specific sockets */
|
|
volatile unsigned force_sockets;
|
|
volatile uint64_t socket_mem[RTE_MAX_NUMA_NODES]; /**< amount of memory per socket */
|
|
volatile unsigned force_socket_limits;
|
|
volatile uint64_t socket_limit[RTE_MAX_NUMA_NODES]; /**< limit amount of memory per socket */
|
|
uintptr_t base_virtaddr; /**< base address to try and reserve memory from */
|
|
volatile unsigned legacy_mem;
|
|
/**< true to enable legacy memory behavior (no dynamic allocation,
|
|
* IOVA-contiguous segments).
|
|
*/
|
|
volatile unsigned match_allocations;
|
|
/**< true to free hugepages exactly as allocated */
|
|
volatile unsigned single_file_segments;
|
|
/**< true if storing all pages within single files (per-page-size,
|
|
* per-node) non-legacy mode only.
|
|
*/
|
|
volatile int syslog_facility; /**< facility passed to openlog() */
|
|
/** default interrupt mode for VFIO */
|
|
volatile enum rte_intr_mode vfio_intr_mode;
|
|
char *hugefile_prefix; /**< the base filename of hugetlbfs files */
|
|
char *hugepage_dir; /**< specific hugetlbfs directory to use */
|
|
char *user_mbuf_pool_ops_name;
|
|
/**< user defined mbuf pool ops name */
|
|
unsigned num_hugepage_sizes; /**< how many sizes on this system */
|
|
struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
|
|
enum rte_iova_mode iova_mode ; /**< Set IOVA mode on this system */
|
|
volatile unsigned int init_complete;
|
|
/**< indicates whether EAL has completed initialization */
|
|
};
|
|
extern struct internal_config internal_config; /**< Global EAL configuration. */
|
|
|
|
void eal_reset_internal_config(struct internal_config *internal_cfg);
|
|
|
|
#endif /* EAL_INTERNAL_CFG_H */
|