numam-dpdk/lib/eal/freebsd/eal_hugepage_info.c
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

165 lines
4.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2014 Intel Corporation
*/
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/mman.h>
#include <string.h>
#include <rte_log.h>
#include <fcntl.h>
#include "eal_private.h"
#include "eal_hugepages.h"
#include "eal_internal_cfg.h"
#include "eal_filesystem.h"
#define CONTIGMEM_DEV "/dev/contigmem"
/*
* Uses mmap to create a shared memory area for storage of data
* Used in this file to store the hugepage file map on disk
*/
static void *
map_shared_memory(const char *filename, const size_t mem_size, int flags)
{
void *retval;
int fd = open(filename, flags, 0600);
if (fd < 0)
return NULL;
if (ftruncate(fd, mem_size) < 0) {
close(fd);
return NULL;
}
retval = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
return retval;
}
static void *
open_shared_memory(const char *filename, const size_t mem_size)
{
return map_shared_memory(filename, mem_size, O_RDWR);
}
static void *
create_shared_memory(const char *filename, const size_t mem_size)
{
return map_shared_memory(filename, mem_size, O_RDWR | O_CREAT);
}
/*
* No hugepage support on freebsd, but we dummy it, using contigmem driver
*/
int
eal_hugepage_info_init(void)
{
size_t sysctl_size;
int num_buffers, fd, error;
int64_t buffer_size;
struct internal_config *internal_conf =
eal_get_internal_configuration();
/* re-use the linux "internal config" structure for our memory data */
struct hugepage_info *hpi = &internal_conf->hugepage_info[0];
struct hugepage_info *tmp_hpi;
unsigned int i;
internal_conf->num_hugepage_sizes = 1;
sysctl_size = sizeof(num_buffers);
error = sysctlbyname("hw.contigmem.num_buffers", &num_buffers,
&sysctl_size, NULL, 0);
if (error != 0) {
RTE_LOG(ERR, EAL, "could not read sysctl hw.contigmem.num_buffers\n");
return -1;
}
sysctl_size = sizeof(buffer_size);
error = sysctlbyname("hw.contigmem.buffer_size", &buffer_size,
&sysctl_size, NULL, 0);
if (error != 0) {
RTE_LOG(ERR, EAL, "could not read sysctl hw.contigmem.buffer_size\n");
return -1;
}
fd = open(CONTIGMEM_DEV, O_RDWR);
if (fd < 0) {
RTE_LOG(ERR, EAL, "could not open "CONTIGMEM_DEV"\n");
return -1;
}
if (buffer_size >= 1<<30)
RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of size %dGB\n",
num_buffers, (int)(buffer_size>>30));
else if (buffer_size >= 1<<20)
RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of size %dMB\n",
num_buffers, (int)(buffer_size>>20));
else
RTE_LOG(INFO, EAL, "Contigmem driver has %d buffers, each of size %dKB\n",
num_buffers, (int)(buffer_size>>10));
strlcpy(hpi->hugedir, CONTIGMEM_DEV, sizeof(hpi->hugedir));
hpi->hugepage_sz = buffer_size;
hpi->num_pages[0] = num_buffers;
hpi->lock_descriptor = fd;
/* for no shared files mode, do not create shared memory config */
if (internal_conf->no_shconf)
return 0;
tmp_hpi = create_shared_memory(eal_hugepage_info_path(),
sizeof(internal_conf->hugepage_info));
if (tmp_hpi == NULL ) {
RTE_LOG(ERR, EAL, "Failed to create shared memory!\n");
return -1;
}
memcpy(tmp_hpi, hpi, sizeof(internal_conf->hugepage_info));
/* we've copied file descriptors along with everything else, but they
* will be invalid in secondary process, so overwrite them
*/
for (i = 0; i < RTE_DIM(internal_conf->hugepage_info); i++) {
struct hugepage_info *tmp = &tmp_hpi[i];
tmp->lock_descriptor = -1;
}
if (munmap(tmp_hpi, sizeof(internal_conf->hugepage_info)) < 0) {
RTE_LOG(ERR, EAL, "Failed to unmap shared memory!\n");
return -1;
}
return 0;
}
/* copy stuff from shared info into internal config */
int
eal_hugepage_info_read(void)
{
struct internal_config *internal_conf =
eal_get_internal_configuration();
struct hugepage_info *hpi = &internal_conf->hugepage_info[0];
struct hugepage_info *tmp_hpi;
internal_conf->num_hugepage_sizes = 1;
tmp_hpi = open_shared_memory(eal_hugepage_info_path(),
sizeof(internal_conf->hugepage_info));
if (tmp_hpi == NULL) {
RTE_LOG(ERR, EAL, "Failed to open shared memory!\n");
return -1;
}
memcpy(hpi, tmp_hpi, sizeof(internal_conf->hugepage_info));
if (munmap(tmp_hpi, sizeof(internal_conf->hugepage_info)) < 0) {
RTE_LOG(ERR, EAL, "Failed to unmap shared memory!\n");
return -1;
}
return 0;
}