187 lines
4.9 KiB
Diff
187 lines
4.9 KiB
Diff
From ab23196a30701353f626b099fc9c957bcd5bf2a0 Mon Sep 17 00:00:00 2001
|
|
From: wuchangsheng <wuchangsheng2@huawei.com>
|
|
Date: Tue, 30 Mar 2021 16:29:00 +0800
|
|
Subject: [PATCH] dpdk-support-gazelle-05-fbarray-hugepageinfo
|
|
|
|
---
|
|
lib/librte_eal/common/eal_common_fbarray.c | 106 ++++++++++++++++---
|
|
lib/librte_eal/linux/eal/eal_hugepage_info.c | 2 +-
|
|
2 files changed, 95 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/lib/librte_eal/common/eal_common_fbarray.c b/lib/librte_eal/common/eal_common_fbarray.c
|
|
index 1312f93..b611ffa 100644
|
|
--- a/lib/librte_eal/common/eal_common_fbarray.c
|
|
+++ b/lib/librte_eal/common/eal_common_fbarray.c
|
|
@@ -833,8 +833,9 @@ fail:
|
|
return -1;
|
|
}
|
|
|
|
-int
|
|
-rte_fbarray_attach(struct rte_fbarray *arr)
|
|
+static int
|
|
+__rte_fbarray_attach(struct rte_fbarray *arr, const char *runtime_dir,
|
|
+ const struct internal_config *internal_cfg)
|
|
{
|
|
struct mem_area *ma = NULL, *tmp = NULL;
|
|
size_t page_sz, mmap_len;
|
|
@@ -870,13 +871,15 @@ rte_fbarray_attach(struct rte_fbarray *arr)
|
|
|
|
mmap_len = calc_data_size(page_sz, arr->elt_sz, arr->len);
|
|
|
|
- /* check the tailq - maybe user has already mapped this address space */
|
|
- rte_spinlock_lock(&mem_area_lock);
|
|
+ if (!internal_cfg->pri_and_sec) {
|
|
+ /* check the tailq - maybe user has already mapped this address space */
|
|
+ rte_spinlock_lock(&mem_area_lock);
|
|
|
|
- TAILQ_FOREACH(tmp, &mem_area_tailq, next) {
|
|
- if (overlap(tmp, arr->data, mmap_len)) {
|
|
- rte_errno = EEXIST;
|
|
- goto fail;
|
|
+ TAILQ_FOREACH(tmp, &mem_area_tailq, next) {
|
|
+ if (overlap(tmp, arr->data, mmap_len)) {
|
|
+ rte_errno = EEXIST;
|
|
+ goto fail;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -886,7 +889,7 @@ rte_fbarray_attach(struct rte_fbarray *arr)
|
|
if (data == NULL)
|
|
goto fail;
|
|
|
|
- eal_get_fbarray_path(path, sizeof(path), arr->name);
|
|
+ eal_sec_get_fbarray_path(path, sizeof(path), arr->name, runtime_dir);
|
|
|
|
fd = open(path, O_RDWR);
|
|
if (fd < 0) {
|
|
@@ -903,16 +906,27 @@ rte_fbarray_attach(struct rte_fbarray *arr)
|
|
if (resize_and_map(fd, data, mmap_len))
|
|
goto fail;
|
|
|
|
+ if (internal_cfg->pri_and_sec) {
|
|
+ if (flock(fd, LOCK_UN)) {
|
|
+ rte_errno = errno;
|
|
+ goto fail;
|
|
+ }
|
|
+ close(fd);
|
|
+ fd = -1;
|
|
+ }
|
|
+
|
|
/* store our new memory area */
|
|
ma->addr = data;
|
|
ma->fd = fd; /* keep fd until detach/destroy */
|
|
ma->len = mmap_len;
|
|
|
|
- TAILQ_INSERT_TAIL(&mem_area_tailq, ma, next);
|
|
+ if (!internal_cfg->pri_and_sec) {
|
|
+ TAILQ_INSERT_TAIL(&mem_area_tailq, ma, next);
|
|
|
|
- /* we're done */
|
|
+ /* we're done */
|
|
|
|
- rte_spinlock_unlock(&mem_area_lock);
|
|
+ rte_spinlock_unlock(&mem_area_lock);
|
|
+ }
|
|
return 0;
|
|
fail:
|
|
if (data)
|
|
@@ -924,6 +938,30 @@ fail:
|
|
return -1;
|
|
}
|
|
|
|
+int
|
|
+rte_fbarray_attach(struct rte_fbarray *arr)
|
|
+{
|
|
+ return __rte_fbarray_attach(arr, rte_eal_get_runtime_dir(), &internal_config);
|
|
+}
|
|
+
|
|
+int
|
|
+rte_sec_fbarray_attach(struct rte_fbarray *arr,
|
|
+ const int switch_pri_and_sec, const int sec_idx)
|
|
+{
|
|
+ struct internal_config *internal_cfg = NULL;
|
|
+ char *runtime_dir = NULL;
|
|
+
|
|
+ if (!switch_pri_and_sec) {
|
|
+ runtime_dir = rte_eal_get_runtime_dir();
|
|
+ internal_cfg = &internal_config;
|
|
+ } else {
|
|
+ runtime_dir = rte_eal_sec_get_runtime_dir(sec_idx);
|
|
+ internal_cfg = rte_eal_sec_get_internal_config(sec_idx);
|
|
+ }
|
|
+
|
|
+ return __rte_fbarray_attach(arr, runtime_dir, internal_cfg);
|
|
+}
|
|
+
|
|
int
|
|
rte_fbarray_detach(struct rte_fbarray *arr)
|
|
{
|
|
@@ -1063,6 +1101,50 @@ out:
|
|
return ret;
|
|
}
|
|
|
|
+int
|
|
+rte_sec_fbarray_destroy(struct rte_fbarray *arr,
|
|
+ const int sec_idx)
|
|
+{
|
|
+ int fd, ret;
|
|
+ size_t mmap_len;
|
|
+ char path[PATH_MAX];
|
|
+
|
|
+ if (arr == NULL) {
|
|
+ rte_errno = EINVAL;
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ size_t page_sz = sysconf(_SC_PAGESIZE);
|
|
+
|
|
+ if (page_sz == (size_t)-1)
|
|
+ return -1;
|
|
+
|
|
+ mmap_len = calc_data_size(page_sz, arr->elt_sz, arr->len);
|
|
+ munmap(arr->data, mmap_len);
|
|
+
|
|
+ /* try deleting the file */
|
|
+ eal_sec_get_fbarray_path(path, sizeof(path), arr->name, rte_eal_sec_get_runtime_dir(sec_idx));
|
|
+
|
|
+ fd = open(path, O_RDONLY);
|
|
+ if (fd < 0) {
|
|
+ RTE_LOG(ERR, EAL, "Could not open fbarray file: %s\n",
|
|
+ strerror(errno));
|
|
+ return -1;
|
|
+ }
|
|
+ if (flock(fd, LOCK_EX | LOCK_NB)) {
|
|
+ RTE_LOG(DEBUG, EAL, "Cannot destroy fbarray - another process is using it\n");
|
|
+ rte_errno = EBUSY;
|
|
+ ret = -1;
|
|
+ } else {
|
|
+ ret = 0;
|
|
+ unlink(path);
|
|
+ memset(arr, 0, sizeof(*arr));
|
|
+ }
|
|
+ close(fd);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
void *
|
|
rte_fbarray_get(const struct rte_fbarray *arr, unsigned int idx)
|
|
{
|
|
diff --git a/lib/librte_eal/linux/eal/eal_hugepage_info.c b/lib/librte_eal/linux/eal/eal_hugepage_info.c
|
|
index 91a4fed..911acec 100644
|
|
--- a/lib/librte_eal/linux/eal/eal_hugepage_info.c
|
|
+++ b/lib/librte_eal/linux/eal/eal_hugepage_info.c
|
|
@@ -350,7 +350,7 @@ calc_num_pages(struct hugepage_info *hpi, struct dirent *dirent)
|
|
*/
|
|
total_pages = 0;
|
|
/* we also don't want to do this for legacy init */
|
|
- if (!internal_config.legacy_mem)
|
|
+ if (!internal_config.legacy_mem || internal_config.map_perfect)
|
|
for (i = 0; i < rte_socket_count(); i++) {
|
|
int socket = rte_socket_id_by_idx(i);
|
|
unsigned int num_pages =
|
|
--
|
|
2.23.0
|
|
|