c44d09811b
rte_fbarray is a simple indexed array stored in shared memory via mapping files into memory. Rationale for its existence is the following: since we are going to map memory page-by-page, there could be quite a lot of memory segments to keep track of (for smaller page sizes, page count can easily reach thousands). We can't really make page lists truly dynamic and infinitely expandable, because that involves reallocating memory (which is a big no-no in multiprocess). What we can do instead is have a maximum capacity as something really, really large, and decide at allocation time how big the array is going to be. We map the entire file into memory, which makes it possible to use fbarray as shared memory, provided the structure itself is allocated in shared memory. Per-fbarray locking is also used to avoid index data races (but not contents data races - that is up to user application to synchronize). In addition, in understanding that we will frequently need to scan this array for free space and iterating over array linearly can become slow, rte_fbarray provides facilities to index array's usage. The following use cases are covered: - find next free/used slot (useful either for adding new elements to fbarray, or walking the list) - find starting index for next N free/used slots (useful for when we want to allocate chunk of VA-contiguous memory composed of several pages) - find how many contiguous free/used slots there are, starting from specified index (useful for when we want to figure out how many pages we have until next hole in allocated memory, to speed up some bulk operations where we would otherwise have to walk the array and add pages one by one) This is accomplished by storing a usage mask in-memory, right after the data section of the array, and using some bit-level magic to figure out the info we need. Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com> Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com> Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2018 Intel Corporation
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* Stores functions and path defines for files and directories
|
|
* on the filesystem for Linux, that are used by the Linux EAL.
|
|
*/
|
|
|
|
#ifndef EAL_FILESYSTEM_H
|
|
#define EAL_FILESYSTEM_H
|
|
|
|
/** Path of rte config file. */
|
|
#define RUNTIME_CONFIG_FMT "%s/.%s_config"
|
|
#define FBARRAY_FMT "%s/%s_%s"
|
|
|
|
#include <stdint.h>
|
|
#include <limits.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <rte_string_fns.h>
|
|
#include "eal_internal_cfg.h"
|
|
|
|
static const char *default_config_dir = "/var/run";
|
|
|
|
static inline const char *
|
|
eal_runtime_config_path(void)
|
|
{
|
|
static char buffer[PATH_MAX]; /* static so auto-zeroed */
|
|
const char *directory = default_config_dir;
|
|
const char *home_dir = getenv("HOME");
|
|
|
|
if (getuid() != 0 && home_dir != NULL)
|
|
directory = home_dir;
|
|
snprintf(buffer, sizeof(buffer) - 1, RUNTIME_CONFIG_FMT, directory,
|
|
internal_config.hugefile_prefix);
|
|
return buffer;
|
|
}
|
|
|
|
/** Path of primary/secondary communication unix socket file. */
|
|
#define MP_SOCKET_PATH_FMT "%s/.%s_unix"
|
|
static inline const char *
|
|
eal_mp_socket_path(void)
|
|
{
|
|
static char buffer[PATH_MAX]; /* static so auto-zeroed */
|
|
const char *directory = default_config_dir;
|
|
const char *home_dir = getenv("HOME");
|
|
|
|
if (getuid() != 0 && home_dir != NULL)
|
|
directory = home_dir;
|
|
snprintf(buffer, sizeof(buffer) - 1, MP_SOCKET_PATH_FMT,
|
|
directory, internal_config.hugefile_prefix);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
static inline const char *
|
|
eal_get_fbarray_path(char *buffer, size_t buflen, const char *name) {
|
|
const char *directory = "/tmp";
|
|
const char *home_dir = getenv("HOME");
|
|
|
|
if (getuid() != 0 && home_dir != NULL)
|
|
directory = home_dir;
|
|
snprintf(buffer, buflen - 1, FBARRAY_FMT, directory,
|
|
internal_config.hugefile_prefix, name);
|
|
return buffer;
|
|
}
|
|
|
|
/** Path of hugepage info file. */
|
|
#define HUGEPAGE_INFO_FMT "%s/.%s_hugepage_info"
|
|
|
|
static inline const char *
|
|
eal_hugepage_info_path(void)
|
|
{
|
|
static char buffer[PATH_MAX]; /* static so auto-zeroed */
|
|
const char *directory = default_config_dir;
|
|
const char *home_dir = getenv("HOME");
|
|
|
|
if (getuid() != 0 && home_dir != NULL)
|
|
directory = home_dir;
|
|
snprintf(buffer, sizeof(buffer) - 1, HUGEPAGE_INFO_FMT, directory,
|
|
internal_config.hugefile_prefix);
|
|
return buffer;
|
|
}
|
|
|
|
/** String format for hugepage map files. */
|
|
#define HUGEFILE_FMT "%s/%smap_%d"
|
|
#define TEMP_HUGEFILE_FMT "%s/%smap_temp_%d"
|
|
|
|
static inline const char *
|
|
eal_get_hugefile_path(char *buffer, size_t buflen, const char *hugedir, int f_id)
|
|
{
|
|
snprintf(buffer, buflen, HUGEFILE_FMT, hugedir,
|
|
internal_config.hugefile_prefix, f_id);
|
|
buffer[buflen - 1] = '\0';
|
|
return buffer;
|
|
}
|
|
|
|
/** define the default filename prefix for the %s values above */
|
|
#define HUGEFILE_PREFIX_DEFAULT "rte"
|
|
|
|
/** Function to read a single numeric value from a file on the filesystem.
|
|
* Used to read information from files on /sys */
|
|
int eal_parse_sysfs_value(const char *filename, unsigned long *val);
|
|
|
|
#endif /* EAL_FILESYSTEM_H */
|