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(&region->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 */