You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/12 18:20:21 UTC
[nuttx] 03/03: mm/shm: Switch to use process' common virtual memory region allocator
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit a2a10c87e30dcc3b0fee0f9796dc42d52444bdd4
Author: Jukka Laitinen <ju...@ssrc.tii.ae>
AuthorDate: Wed Jan 11 12:26:40 2023 +0400
mm/shm: Switch to use process' common virtual memory region allocator
- Also remove the nuttx private shm.h file nuttx/mm/shm.h, which became redundant
- Also remove the gran allocator initialization/release in binfmt since common
vpage allocator is initialized in group_create/group_leave
Signed-off-by: Jukka Laitinen <ju...@ssrc.tii.ae>
---
binfmt/binfmt_execmodule.c | 12 ----
include/nuttx/mm/shm.h | 168 ---------------------------------------------
include/nuttx/sched.h | 7 --
mm/shm/Make.defs | 1 -
mm/shm/shm.h | 26 +++++++
mm/shm/shm_alloc.c | 109 -----------------------------
mm/shm/shm_initialize.c | 116 -------------------------------
mm/shm/shmat.c | 12 ++--
mm/shm/shmctl.c | 1 -
mm/shm/shmdt.c | 1 -
mm/shm/shmget.c | 12 +++-
sched/group/group_leave.c | 6 --
12 files changed, 44 insertions(+), 427 deletions(-)
diff --git a/binfmt/binfmt_execmodule.c b/binfmt/binfmt_execmodule.c
index e1f5cda385..df24121c79 100644
--- a/binfmt/binfmt_execmodule.c
+++ b/binfmt/binfmt_execmodule.c
@@ -34,7 +34,6 @@
#include <nuttx/arch.h>
#include <nuttx/kmalloc.h>
#include <nuttx/sched.h>
-#include <nuttx/mm/shm.h>
#include <nuttx/binfmt/binfmt.h>
#include "binfmt.h"
@@ -227,17 +226,6 @@ int exec_module(FAR const struct binary_s *binp,
}
#endif
-#ifdef CONFIG_MM_SHM
- /* Initialize the shared memory virtual page allocator */
-
- ret = shm_group_initialize(tcb->cmn.group);
- if (ret < 0)
- {
- berr("ERROR: shm_group_initialize() failed: %d\n", ret);
- goto errout_with_tcbinit;
- }
-#endif
-
#ifdef CONFIG_PIC
/* Add the D-Space address as the PIC base address. By convention, this
* must be the first allocated address space.
diff --git a/include/nuttx/mm/shm.h b/include/nuttx/mm/shm.h
deleted file mode 100644
index eaa181a9da..0000000000
--- a/include/nuttx/mm/shm.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/****************************************************************************
- * include/nuttx/mm/shm.h
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __INCLUDE_NUTTX_MM_SHM_H
-#define __INCLUDE_NUTTX_MM_SHM_H
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <nuttx/mm/gran.h>
-
-#ifdef CONFIG_MM_SHM
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Configuration ************************************************************/
-
-#ifndef CONFIG_ARCH_ADDRENV
-# error CONFIG_ARCH_ADDRENV must be selected with CONFIG_MM_SHM
-#endif
-
-#ifndef CONFIG_BUILD_KERNEL
-# error CONFIG_BUILD_KERNEL must be selected with CONFIG_MM_SHM
-#endif
-
-#ifndef CONFIG_GRAN
-# error CONFIG_GRAN must be selected with CONFIG_MM_SHM
-#endif
-
-#ifndef CONFIG_MM_PGALLOC
-# error CONFIG_MM_PGALLOC must be selected with CONFIG_MM_SHM
-#endif
-
-/* Debug */
-
-#ifdef CONFIG_DEBUG_SHM
-# define shmerr _err
-# define shminfo _info
-#else
-# define shmerr merr
-# define shminfo minfo
-#endif
-
-/****************************************************************************
- * Public Type Definitions
- ****************************************************************************/
-
-struct task_group_s; /* Forward declaration */
-
-/****************************************************************************
- * Public Types
- ****************************************************************************/
-
-/* This structure describes the virtual page allocator that is use to manage
- * the mapping of shared memory into the group/process address space.
- */
-
-struct group_shm_s
-{
- /* Handle returned by gran_initialize() when the virtual page allocator
- * was created.
- */
-
- GRAN_HANDLE gs_handle;
-};
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Name: shm_group_initialize
- *
- * Description:
- * Initialize the group shared memory data structures when a new task
- * group is initialized.
- *
- * Input Parameters:
- * group - A reference to the new group structure to be initialized.
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-int shm_group_initialize(FAR struct task_group_s *group);
-
-/****************************************************************************
- * Name: shm_group_release
- *
- * Description:
- * Release resources used by the group shared memory logic. This function
- * is called at the time at the group is destroyed.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-void shm_group_release(FAR struct task_group_s *group);
-
-/****************************************************************************
- * Name: shm_alloc
- *
- * Description:
- * Allocate virtual memory region from the shared memory pool.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- * vaddr - Virtual start address where the allocation starts, if NULL, will
- * seek and return an address that satisfies the 'size' parameter
- * size - Size of the area to allocate
- *
- * Returned Value:
- * Pointer to reserved vaddr, or NULL if out-of-memory
- *
- ****************************************************************************/
-
-FAR void *shm_alloc(FAR struct task_group_s *group, FAR void *vaddr,
- size_t size);
-
-/****************************************************************************
- * Name: shm_free
- *
- * Description:
- * Free a previously allocated virtual memory region back to the shared
- * memory pool.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- * vaddr - Virtual start address where the allocation starts.
- * size - Size of the allocated area.
- *
- ****************************************************************************/
-
-void shm_free(FAR struct task_group_s *group, FAR void *vaddr, size_t size);
-
-#endif /* CONFIG_MM_SHM */
-#endif /* __INCLUDE_NUTTX_MM_SHM_H */
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index ce450a8137..4667803bf8 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -40,7 +40,6 @@
#include <nuttx/semaphore.h>
#include <nuttx/queue.h>
#include <nuttx/wdog.h>
-#include <nuttx/mm/shm.h>
#include <nuttx/fs/fs.h>
#include <nuttx/net/net.h>
#include <nuttx/mm/map.h>
@@ -510,12 +509,6 @@ struct task_group_s
group_addrenv_t tg_addrenv; /* Task group address environment */
#endif
-#ifdef CONFIG_MM_SHM
- /* Shared Memory **********************************************************/
-
- struct group_shm_s tg_shm; /* Task shared memory logic */
-#endif
-
/* Virtual memory mapping info ********************************************/
struct mm_map_s tg_mm_map; /* Task mmappings */
diff --git a/mm/shm/Make.defs b/mm/shm/Make.defs
index bb93057d05..b9514378e1 100644
--- a/mm/shm/Make.defs
+++ b/mm/shm/Make.defs
@@ -21,7 +21,6 @@
# Shared memory allocator
ifeq ($(CONFIG_MM_SHM),y)
-CSRCS += shm_initialize.c shm_alloc.c
CSRCS += shmat.c shmctl.c shmdt.c shmget.c
# Add the shared memory directory to the build
diff --git a/mm/shm/shm.h b/mm/shm/shm.h
index 591790eabe..e6a37a0489 100644
--- a/mm/shm/shm.h
+++ b/mm/shm/shm.h
@@ -46,6 +46,32 @@
#define SRFLAG_INUSE (1 << 0) /* Bit 0: Region is in use */
#define SRFLAG_UNLINKED (1 << 1) /* Bit 1: Region perists while references */
+#ifndef CONFIG_ARCH_ADDRENV
+# error CONFIG_ARCH_ADDRENV must be selected with CONFIG_MM_SHM
+#endif
+
+#ifndef CONFIG_BUILD_KERNEL
+# error CONFIG_BUILD_KERNEL must be selected with CONFIG_MM_SHM
+#endif
+
+#ifndef CONFIG_GRAN
+# error CONFIG_GRAN must be selected with CONFIG_MM_SHM
+#endif
+
+#ifndef CONFIG_MM_PGALLOC
+# error CONFIG_MM_PGALLOC must be selected with CONFIG_MM_SHM
+#endif
+
+/* Debug */
+
+#ifdef CONFIG_DEBUG_SHM
+# define shmerr _err
+# define shminfo _info
+#else
+# define shmerr merr
+# define shminfo minfo
+#endif
+
/****************************************************************************
* Public Types
****************************************************************************/
diff --git a/mm/shm/shm_alloc.c b/mm/shm/shm_alloc.c
deleted file mode 100644
index 494c6c64bf..0000000000
--- a/mm/shm/shm_alloc.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
- * mm/shm/shm_alloc.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <assert.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/addrenv.h>
-#include <nuttx/sched.h>
-#include <nuttx/mm/gran.h>
-#include <nuttx/pgalloc.h>
-#include <nuttx/mm/shm.h>
-
-#include "shm/shm.h"
-
-#ifdef CONFIG_MM_SHM
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: shm_alloc
- *
- * Description:
- * Allocate virtual memory region from the shared memory pool.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- * vaddr - Virtual start address where the allocation starts, if NULL, will
- * seek and return an address that satisfies the 'size' parameter
- * size - Size of the area to allocate
- *
- * Returned Value:
- * Pointer to reserved vaddr, or NULL if out-of-memory
- *
- ****************************************************************************/
-
-FAR void *shm_alloc(FAR struct task_group_s *group, FAR void *vaddr,
- size_t size)
-{
- FAR void *ret = NULL;
-
- DEBUGASSERT(group != NULL);
-
- if (group->tg_shm.gs_handle != NULL)
- {
- if (vaddr == NULL)
- {
- ret = gran_alloc(group->tg_shm.gs_handle, size);
- }
- else
- {
- ret = gran_reserve(group->tg_shm.gs_handle, (uintptr_t)vaddr,
- size);
- }
- }
-
- return ret;
-}
-
-/****************************************************************************
- * Name: shm_free
- *
- * Description:
- * Free a previously allocated virtual memory region back to the shared
- * memory pool.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- * vaddr - Virtual start address where the allocation starts.
- * size - Size of the allocated area.
- *
- ****************************************************************************/
-
-void shm_free(FAR struct task_group_s *group, FAR void *vaddr, size_t size)
-{
- DEBUGASSERT(group != NULL);
-
- if (group->tg_shm.gs_handle != NULL)
- {
- gran_free(group->tg_shm.gs_handle, vaddr, size);
- }
-}
-
-#endif /* CONFIG_MM_SHM */
diff --git a/mm/shm/shm_initialize.c b/mm/shm/shm_initialize.c
deleted file mode 100644
index d54019d89a..0000000000
--- a/mm/shm/shm_initialize.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
- * mm/shm/shm_initialize.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <assert.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/addrenv.h>
-#include <nuttx/sched.h>
-#include <nuttx/mm/gran.h>
-#include <nuttx/pgalloc.h>
-#include <nuttx/mm/shm.h>
-
-#include "shm/shm.h"
-
-#ifdef CONFIG_MM_SHM
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/* State of the all shared memory */
-
-struct shm_info_s g_shminfo =
-{
- NXMUTEX_INITIALIZER
-};
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: shm_group_initialize
- *
- * Description:
- * Initialize the group shared memory data structures when a new task
- * group is initialized.
- *
- * Input Parameters:
- * group - A reference to the new group structure to be initialized.
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-int shm_group_initialize(FAR struct task_group_s *group)
-{
- DEBUGASSERT(group && !group->tg_shm.gs_handle);
-
- group->tg_shm.gs_handle =
- gran_initialize((FAR void *)CONFIG_ARCH_SHM_VBASE,
- ARCH_SHM_MAXPAGES << MM_PGSHIFT,
- MM_PGSHIFT, MM_PGSHIFT);
-
- if (!group->tg_shm.gs_handle)
- {
- shmerr("ERROR: gran_initialize() failed\n");
- return -ENOMEM;
- }
-
- return OK;
-}
-
-/****************************************************************************
- * Name: shm_group_release
- *
- * Description:
- * Release resources used by the group shared memory logic. This function
- * is called at the time at the group is destroyed.
- *
- * Input Parameters:
- * group - A reference to the group structure to be un-initialized.
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-void shm_group_release(FAR struct task_group_s *group)
-{
- GRAN_HANDLE handle;
- DEBUGASSERT(group);
-
- handle = group->tg_shm.gs_handle;
- if (handle)
- {
- gran_release(handle);
- }
-}
-
-#endif /* CONFIG_MM_SHM */
diff --git a/mm/shm/shmat.c b/mm/shm/shmat.c
index b4215f584e..bfa3e1a9c4 100644
--- a/mm/shm/shmat.c
+++ b/mm/shm/shmat.c
@@ -47,7 +47,7 @@ static int munmap_shm(FAR struct task_group_s *group,
FAR void *start,
size_t length)
{
- FAR const void *shmaddr = entry->vaddr;
+ FAR void *shmaddr = entry->vaddr;
int shmid = entry->priv.i;
FAR struct shm_region_s *region;
pid_t pid;
@@ -80,7 +80,8 @@ static int munmap_shm(FAR struct task_group_s *group,
{
/* Free the virtual address space */
- shm_free(group, (FAR void *)shmaddr, region->sr_ds.shm_segsz);
+ vm_release_region(get_group_mm(group), shmaddr,
+ region->sr_ds.shm_segsz);
/* Convert the region size to pages */
@@ -237,10 +238,11 @@ FAR void *shmat(int shmid, FAR const void *shmaddr, int shmflg)
/* Set aside a virtual address space to span this physical region */
- vaddr = shm_alloc(group, NULL, region->sr_ds.shm_segsz);
+ vaddr = vm_alloc_region(get_group_mm(group), NULL,
+ region->sr_ds.shm_segsz);
if (vaddr == NULL)
{
- shmerr("ERROR: shm_alloc() failed\n");
+ shmerr("ERROR: vm_alloc_regioon() failed\n");
ret = -ENOMEM;
goto errout_with_lock;
}
@@ -294,7 +296,7 @@ FAR void *shmat(int shmid, FAR const void *shmaddr, int shmflg)
return vaddr;
errout_with_vaddr:
- shm_free(group, vaddr, region->sr_ds.shm_segsz);
+ vm_release_region(get_group_mm(group), vaddr, region->sr_ds.shm_segsz);
errout_with_lock:
nxmutex_unlock(®ion->sr_lock);
diff --git a/mm/shm/shmctl.c b/mm/shm/shmctl.c
index 8c1609c0df..0bb14b7da2 100644
--- a/mm/shm/shmctl.c
+++ b/mm/shm/shmctl.c
@@ -33,7 +33,6 @@
#include <assert.h>
#include <debug.h>
-#include <nuttx/mm/shm.h>
#include <nuttx/pgalloc.h>
#include "shm/shm.h"
diff --git a/mm/shm/shmdt.c b/mm/shm/shmdt.c
index d78b1c0887..ae32bc0fba 100644
--- a/mm/shm/shmdt.c
+++ b/mm/shm/shmdt.c
@@ -31,7 +31,6 @@
#include <nuttx/arch.h>
#include <nuttx/sched.h>
-#include <nuttx/mm/shm.h>
#include <nuttx/pgalloc.h>
#include <nuttx/mm/map.h>
diff --git a/mm/shm/shmget.c b/mm/shm/shmget.c
index c80b3fe0b2..c8b71047b2 100644
--- a/mm/shm/shmget.c
+++ b/mm/shm/shmget.c
@@ -32,12 +32,22 @@
#include <errno.h>
#include <nuttx/pgalloc.h>
-#include <nuttx/mm/shm.h>
#include "shm/shm.h"
#ifdef CONFIG_MM_SHM
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* State of the all shared memory */
+
+struct shm_info_s g_shminfo =
+{
+ NXMUTEX_INITIALIZER
+};
+
/****************************************************************************
* Private Functions
****************************************************************************/
diff --git a/sched/group/group_leave.c b/sched/group/group_leave.c
index f1f03c738e..16d92caf1e 100644
--- a/sched/group/group_leave.c
+++ b/sched/group/group_leave.c
@@ -173,12 +173,6 @@ static inline void group_release(FAR struct task_group_s *group)
mm_map_destroy(&group->tg_mm_map);
-#if defined(CONFIG_BUILD_KERNEL) && defined(CONFIG_MM_SHM)
- /* Release any resource held by shared memory virtual page allocator */
-
- shm_group_release(group);
-#endif
-
#if defined(HAVE_GROUP_MEMBERS) || defined(CONFIG_ARCH_ADDRENV)
/* Remove the group from the list of groups */