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:18 UTC

[nuttx] branch master updated (fd0195b0d8 -> a2a10c87e3)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


    from fd0195b0d8 fs/mmap: Suppor the partial unmap for anonymous mapping
     new 70de321de3 arch/Kconfig: remove virtual memory allocator dependency from MM_SHM
     new 2236facca9 mm/map: Add a common virtual memory region allocator
     new a2a10c87e3 mm/shm: Switch to use process' common virtual memory region allocator

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 arch/Kconfig                               |  10 +-
 arch/arm/include/arch.h                    |   6 +-
 arch/arm/src/armv7-a/Make.defs             |   2 +-
 arch/arm/src/armv7-a/arm_addrenv.c         |   6 +-
 arch/arm/src/armv7-a/arm_addrenv_shm.c     |   4 +-
 arch/arm/src/armv7-a/pgalloc.h             |   2 +-
 arch/arm64/include/arch.h                  |   4 +-
 arch/arm64/src/common/Make.defs            |   2 +-
 arch/or1k/include/arch.h                   |   6 +-
 arch/risc-v/src/common/riscv_addrenv_shm.c |   2 +-
 binfmt/binfmt_execmodule.c                 |  14 +--
 include/nuttx/addrenv.h                    |   2 +-
 include/nuttx/arch.h                       |   4 +-
 include/nuttx/mm/map.h                     |  51 ++++++++-
 include/nuttx/mm/shm.h                     | 168 -----------------------------
 include/nuttx/sched.h                      |   7 --
 mm/Kconfig                                 |   1 +
 mm/map/Make.defs                           |   4 +
 mm/map/mm_map.c                            |  32 +++++-
 mm/{shm/shm_alloc.c => map/vm_region.c}    |  55 ++++------
 mm/shm/Make.defs                           |   1 -
 mm/shm/shm.h                               |  26 +++++
 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_create.c                 |   3 +-
 sched/group/group_leave.c                  |   6 --
 29 files changed, 179 insertions(+), 381 deletions(-)
 delete mode 100644 include/nuttx/mm/shm.h
 rename mm/{shm/shm_alloc.c => map/vm_region.c} (66%)
 delete mode 100644 mm/shm/shm_initialize.c


[nuttx] 03/03: mm/shm: Switch to use process' common virtual memory region allocator

Posted by xi...@apache.org.
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 */
 


[nuttx] 01/03: arch/Kconfig: remove virtual memory allocator dependency from MM_SHM

Posted by xi...@apache.org.
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 70de321de3f93585ba13e6d24665b60134946e20
Author: Jukka Laitinen <ju...@ssrc.tii.ae>
AuthorDate: Wed Jan 11 13:56:59 2023 +0400

    arch/Kconfig: remove virtual memory allocator dependency from MM_SHM
    
    The dependency should be vice versa; the MM_SHM should depend on the
    existence of the virtual memory range allocator.
    
    Create a new CONFIG flag CONFIG_ARCH_VMA_MAPPING, which will define that
    there is a virtual memory range allocator. Make MM_SHM select that flag
    
    Signed-off-by: Jukka Laitinen <ju...@ssrc.tii.ae>
---
 arch/Kconfig                               | 10 +++++++---
 arch/arm/include/arch.h                    |  6 +++---
 arch/arm/src/armv7-a/Make.defs             |  2 +-
 arch/arm/src/armv7-a/arm_addrenv.c         |  6 +++---
 arch/arm/src/armv7-a/arm_addrenv_shm.c     |  4 ++--
 arch/arm/src/armv7-a/pgalloc.h             |  2 +-
 arch/arm64/include/arch.h                  |  4 ++--
 arch/arm64/src/common/Make.defs            |  2 +-
 arch/or1k/include/arch.h                   |  6 +++---
 arch/risc-v/src/common/riscv_addrenv_shm.c |  2 +-
 binfmt/binfmt_execmodule.c                 |  2 +-
 include/nuttx/addrenv.h                    |  2 +-
 include/nuttx/arch.h                       |  4 ++--
 mm/Kconfig                                 |  1 +
 14 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 6ac116d4f3..5cbc2927f3 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -534,9 +534,13 @@ config ARCH_HEAP_VBASE
 	---help---
 		The virtual address of the beginning of the heap region.
 
+config ARCH_VMA_MAPPING
+	bool "Support runtime memory mapping into SHM area"
+	default n
+
 config ARCH_SHM_VBASE
 	hex "Shared memory base"
-	depends on MM_SHM
+	depends on ARCH_VMA_MAPPING
 	---help---
 		The virtual address of the beginning of the shared memory region.
 
@@ -564,7 +568,7 @@ config ARCH_HEAP_NPAGES
 		This, along with knowledge of the page size, determines the size of
 		the heap virtual address space. Default is 1.
 
-if MM_SHM
+if ARCH_VMA_MAPPING
 
 config ARCH_SHM_MAXREGIONS
 	int "Max shared memory regions"
@@ -592,7 +596,7 @@ config ARCH_SHM_NPAGES
 		maximum number of pages per region, and the configured size of
 		each page.
 
-endif # MM_SHM
+endif # ARCH_VMA_MAPPING
 
 config ARCH_STACK_DYNAMIC
 	bool "Dynamic user stack"
diff --git a/arch/arm/include/arch.h b/arch/arm/include/arch.h
index bec81e41af..ae9b30b4e5 100644
--- a/arch/arm/include/arch.h
+++ b/arch/arm/include/arch.h
@@ -95,7 +95,7 @@ do { \
 #  define ARCH_DATA_NSECTS    ARCH_PG2SECT(CONFIG_ARCH_DATA_NPAGES)
 #  define ARCH_HEAP_NSECTS    ARCH_PG2SECT(CONFIG_ARCH_HEAP_NPAGES)
 
-#  ifdef CONFIG_MM_SHM
+#  ifdef CONFIG_ARCH_VMA_MAPPING
 #    define ARCH_SHM_NSECTS   ARCH_PG2SECT(ARCH_SHM_MAXPAGES)
 #  endif
 
@@ -138,7 +138,7 @@ struct group_addrenv_s
   uintptr_t *data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uintptr_t *heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uintptr_t *shm[ARCH_SHM_NSECTS];
 #endif
 
@@ -169,7 +169,7 @@ struct save_addrenv_s
   uint32_t data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uint32_t heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uint32_t shm[ARCH_SHM_NSECTS];
 #endif
 #endif
diff --git a/arch/arm/src/armv7-a/Make.defs b/arch/arm/src/armv7-a/Make.defs
index 791275125d..bfd992bb09 100644
--- a/arch/arm/src/armv7-a/Make.defs
+++ b/arch/arm/src/armv7-a/Make.defs
@@ -71,7 +71,7 @@ ifeq ($(CONFIG_ARCH_ADDRENV),y)
   ifeq ($(CONFIG_ARCH_KERNEL_STACK),y)
     CMN_CSRCS += arm_addrenv_kstack.c
   endif
-  ifeq ($(CONFIG_MM_SHM),y)
+  ifeq ($(CONFIG_ARCH_VMA_MAPPING),y)
     CMN_CSRCS += arm_addrenv_shm.c
   endif
 endif
diff --git a/arch/arm/src/armv7-a/arm_addrenv.c b/arch/arm/src/armv7-a/arm_addrenv.c
index a4e633879e..0fef2c3767 100644
--- a/arch/arm/src/armv7-a/arm_addrenv.c
+++ b/arch/arm/src/armv7-a/arm_addrenv.c
@@ -346,7 +346,7 @@ int up_addrenv_destroy(group_addrenv_t *addrenv)
 
   arm_addrenv_destroy_region(addrenv->heap, ARCH_HEAP_NSECTS,
                              CONFIG_ARCH_HEAP_VBASE, false);
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   /* Destroy the shared memory region (without freeing the physical page
    * data).
    */
@@ -592,7 +592,7 @@ int up_addrenv_select(const group_addrenv_t *addrenv,
         }
     }
 
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   for (vaddr = CONFIG_ARCH_SHM_VBASE, i = 0;
        i < ARCH_SHM_NSECTS;
        vaddr += SECTION_SIZE, i++)
@@ -676,7 +676,7 @@ int up_addrenv_restore(const save_addrenv_t *oldenv)
       mmu_l1_restore(vaddr, oldenv->heap[i]);
     }
 
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   for (vaddr = CONFIG_ARCH_SHM_VBASE, i = 0;
        i < ARCH_SHM_NSECTS;
        vaddr += SECTION_SIZE, i++)
diff --git a/arch/arm/src/armv7-a/arm_addrenv_shm.c b/arch/arm/src/armv7-a/arm_addrenv_shm.c
index b53822402b..884c0e3224 100644
--- a/arch/arm/src/armv7-a/arm_addrenv_shm.c
+++ b/arch/arm/src/armv7-a/arm_addrenv_shm.c
@@ -38,7 +38,7 @@
 #include "addrenv.h"
 #include "pgalloc.h"
 
-#if defined(CONFIG_BUILD_KERNEL) && defined(CONFIG_MM_SHM)
+#if defined(CONFIG_BUILD_KERNEL) && defined(CONFIG_ARCH_VMA_MAPPING)
 
 /****************************************************************************
  * Public Functions
@@ -269,4 +269,4 @@ int up_shmdt(uintptr_t vaddr, unsigned int npages)
   return OK;
 }
 
-#endif /* CONFIG_BUILD_KERNEL && CONFIG_MM_SHM */
+#endif /* CONFIG_BUILD_KERNEL && CONFIG_ARCH_VMA_MAPPING */
diff --git a/arch/arm/src/armv7-a/pgalloc.h b/arch/arm/src/armv7-a/pgalloc.h
index 611f7de6fe..e3579080dc 100644
--- a/arch/arm/src/armv7-a/pgalloc.h
+++ b/arch/arm/src/armv7-a/pgalloc.h
@@ -92,7 +92,7 @@ static inline bool arm_uservaddr(uintptr_t vaddr)
 #ifdef CONFIG_ARCH_STACK_DYNAMIC
        || (vaddr >= CONFIG_ARCH_STACK_VBASE && vaddr < ARCH_STACK_VEND)
 #endif
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
        || (vaddr >= CONFIG_ARCH_SHM_VBASE && vaddr < ARCH_SHM_VEND)
 #endif
       );
diff --git a/arch/arm64/include/arch.h b/arch/arm64/include/arch.h
index d8673a12e0..322942fdc6 100644
--- a/arch/arm64/include/arch.h
+++ b/arch/arm64/include/arch.h
@@ -75,7 +75,7 @@ struct group_addrenv_s
   uintptr_t *data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uintptr_t *heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uintptr_t *shm[ARCH_SHM_NSECTS];
 #endif
 
@@ -106,7 +106,7 @@ struct save_addrenv_s
   uint32_t data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uint32_t heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uint32_t shm[ARCH_SHM_NSECTS];
 #endif
 #endif
diff --git a/arch/arm64/src/common/Make.defs b/arch/arm64/src/common/Make.defs
index 507e8e57dd..e076f888dd 100644
--- a/arch/arm64/src/common/Make.defs
+++ b/arch/arm64/src/common/Make.defs
@@ -74,7 +74,7 @@ endif
 ifeq ($(CONFIG_ARCH_KERNEL_STACK),y)
 CMN_CSRCS += arm64_addrenv_kstack.c
 endif
-ifeq ($(CONFIG_MM_SHM),y)
+ifeq ($(CONFIG_ARCH_VMA_MAPPING),y)
 CMN_CSRCS += arm64_addrenv_shm.c
 endif
 endif
diff --git a/arch/or1k/include/arch.h b/arch/or1k/include/arch.h
index d60ae6e515..63b326d924 100644
--- a/arch/or1k/include/arch.h
+++ b/arch/or1k/include/arch.h
@@ -57,7 +57,7 @@
 #  define ARCH_DATA_NSECTS    ARCH_PG2SECT(CONFIG_ARCH_DATA_NPAGES)
 #  define ARCH_HEAP_NSECTS    ARCH_PG2SECT(CONFIG_ARCH_HEAP_NPAGES)
 
-#  ifdef CONFIG_MM_SHM
+#  ifdef CONFIG_ARCH_VMA_MAPPING
 #    define ARCH_SHM_NSECTS   ARCH_PG2SECT(ARCH_SHM_MAXPAGES)
 #  endif
 
@@ -89,7 +89,7 @@ struct group_addrenv_s
   uintptr_t *data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uintptr_t *heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uintptr_t *shm[ARCH_SHM_NSECTS];
 #endif
 
@@ -120,7 +120,7 @@ struct save_addrenv_s
   uint32_t data[ARCH_DATA_NSECTS];
 #ifdef CONFIG_BUILD_KERNEL
   uint32_t heap[ARCH_HEAP_NSECTS];
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
   uint32_t shm[ARCH_SHM_NSECTS];
 #endif
 #endif
diff --git a/arch/risc-v/src/common/riscv_addrenv_shm.c b/arch/risc-v/src/common/riscv_addrenv_shm.c
index f850c3051a..3d81d5ad18 100644
--- a/arch/risc-v/src/common/riscv_addrenv_shm.c
+++ b/arch/risc-v/src/common/riscv_addrenv_shm.c
@@ -39,7 +39,7 @@
 #include "pgalloc.h"
 #include "riscv_mmu.h"
 
-#if defined(CONFIG_BUILD_KERNEL) && defined(CONFIG_MM_SHM)
+#if defined(CONFIG_BUILD_KERNEL) && defined(CONFIG_ARCH_VMA_MAPPING)
 
 /****************************************************************************
  * Public Functions
diff --git a/binfmt/binfmt_execmodule.c b/binfmt/binfmt_execmodule.c
index ed4a7046f6..e1f5cda385 100644
--- a/binfmt/binfmt_execmodule.c
+++ b/binfmt/binfmt_execmodule.c
@@ -298,7 +298,7 @@ int exec_module(FAR const struct binary_s *binp,
 
   return (int)pid;
 
-#if defined(CONFIG_ARCH_ADDRENV) || defined(CONFIG_MM_SHM)
+#if defined(CONFIG_ARCH_ADDRENV) || defined(CONFIG_ARCH_VMA_MAPPING)
 errout_with_tcbinit:
   tcb->cmn.stack_alloc_ptr = NULL;
   nxsched_release_tcb(&tcb->cmn, TCB_FLAG_TTYPE_TASK);
diff --git a/include/nuttx/addrenv.h b/include/nuttx/addrenv.h
index 43a0ea92ce..9d1a5b53f0 100644
--- a/include/nuttx/addrenv.h
+++ b/include/nuttx/addrenv.h
@@ -164,7 +164,7 @@
 
 /* Shared memory regions */
 
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
 #  ifndef CONFIG_ARCH_SHM_VBASE
 #    error CONFIG_ARCH_SHM_VBASE not defined
 #    define CONFIG_ARCH_SHM_VBASE __ARCH_SHM_VBASE
diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h
index 4217790605..bf230d2850 100644
--- a/include/nuttx/arch.h
+++ b/include/nuttx/arch.h
@@ -1346,7 +1346,7 @@ uintptr_t up_addrenv_va_to_pa(FAR void *va);
  *
  ****************************************************************************/
 
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
 int up_shmat(FAR uintptr_t *pages, unsigned int npages, uintptr_t vaddr);
 #endif
 
@@ -1367,7 +1367,7 @@ int up_shmat(FAR uintptr_t *pages, unsigned int npages, uintptr_t vaddr);
  *
  ****************************************************************************/
 
-#ifdef CONFIG_MM_SHM
+#ifdef CONFIG_ARCH_VMA_MAPPING
 int up_shmdt(uintptr_t vaddr, unsigned int npages);
 #endif
 
diff --git a/mm/Kconfig b/mm/Kconfig
index ddeaf1d41b..389aa32362 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -162,6 +162,7 @@ config MM_SHM
 	bool "Shared memory support"
 	default n
 	depends on MM_PGALLOC && BUILD_KERNEL
+	select ARCH_VMA_MAPPING
 	---help---
 		Build in support for the shared memory interfaces shmget(), shmat(),
 		shmctl(), and shmdt().


[nuttx] 02/03: mm/map: Add a common virtual memory region allocator

Posted by xi...@apache.org.
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 2236facca9863d3551b9cdb5494dd0b7f203c96e
Author: Jukka Laitinen <ju...@ssrc.tii.ae>
AuthorDate: Wed Jan 11 12:23:08 2023 +0400

    mm/map: Add a common virtual memory region allocator
    
    Signed-off-by: Jukka Laitinen <ju...@ssrc.tii.ae>
---
 include/nuttx/mm/map.h     | 51 ++++++++++++++++++++++++-
 mm/map/Make.defs           |  4 ++
 mm/map/mm_map.c            | 32 +++++++++++++++-
 mm/map/vm_region.c         | 94 ++++++++++++++++++++++++++++++++++++++++++++++
 sched/group/group_create.c |  3 +-
 5 files changed, 180 insertions(+), 4 deletions(-)

diff --git a/include/nuttx/mm/map.h b/include/nuttx/mm/map.h
index ac7d0c442e..af52c0ce60 100644
--- a/include/nuttx/mm/map.h
+++ b/include/nuttx/mm/map.h
@@ -28,6 +28,7 @@
 #include <nuttx/config.h>
 #include <nuttx/queue.h>
 #include <nuttx/mutex.h>
+#include <nuttx/mm/gran.h>
 
 /****************************************************************************
  * Forward declarations
@@ -73,6 +74,11 @@ struct mm_map_entry_s
 struct mm_map_s
 {
   sq_queue_t mm_map_sq;
+
+#ifdef CONFIG_ARCH_VMA_MAPPING
+  GRAN_HANDLE mm_map_vpages;
+#endif
+
   rmutex_t mm_map_mutex;
 };
 
@@ -120,14 +126,15 @@ void mm_map_unlock(void);
  *   Initialization function, called only by group_initialize
  *
  * Input Parameters:
- *   mm - Pointer to the mm_map structure to be initialized
+ *   mm     - Pointer to the mm_map structure to be initialized
+ *   kernel - Indicates whether we are initializing a kernel task
  *
  * Returned Value:
  *   None
  *
  ****************************************************************************/
 
-void mm_map_initialize(FAR struct mm_map_s *mm);
+void mm_map_initialize(FAR struct mm_map_s *mm, bool kernel);
 
 /****************************************************************************
  * Name: mm_map_destroy
@@ -162,6 +169,46 @@ void mm_map_destroy(FAR struct mm_map_s *mm);
  *
  ****************************************************************************/
 
+#ifdef CONFIG_ARCH_VMA_MAPPING
+
+/****************************************************************************
+ * Name: vm_alloc_region
+ *
+ * Description:
+ *   Allocate virtual memory region from the process virtual memory area.
+ *
+ * Input Parameters:
+ *   mm    - A reference to the process mm_map struct
+ *   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 *vm_alloc_region(FAR struct mm_map_s *mm, FAR void *vaddr,
+                          size_t size);
+
+/****************************************************************************
+ * Name: vm_release_region
+ *
+ * Description:
+ *   Free a previously allocated virtual memory region
+ *
+ * Input Parameters:
+ *   mm    - A reference to the process' mm_map struct
+ *   vaddr - Virtual start address where the allocation starts.
+ *   size  - Size of the allocated area.
+ *
+ ****************************************************************************/
+
+void vm_release_region(FAR struct mm_map_s *mm, FAR void *vaddr,
+                       size_t size);
+
+#endif
+
 int mm_map_add(FAR struct mm_map_entry_s *entry);
 
 /****************************************************************************
diff --git a/mm/map/Make.defs b/mm/map/Make.defs
index 1d1f602d2b..9a58507b27 100644
--- a/mm/map/Make.defs
+++ b/mm/map/Make.defs
@@ -22,6 +22,10 @@
 
 CSRCS += mm_map.c
 
+ifeq ($(CONFIG_ARCH_VMA_MAPPING),y)
+CSRCS += vm_region.c
+endif
+
 # Add the shared memory directory to the build
 
 DEPPATH += --dep-path map
diff --git a/mm/map/mm_map.c b/mm/map/mm_map.c
index 22126bb4b7..1996184e2f 100644
--- a/mm/map/mm_map.c
+++ b/mm/map/mm_map.c
@@ -23,6 +23,8 @@
  ****************************************************************************/
 
 #include <nuttx/mm/map.h>
+#include <nuttx/pgalloc.h>
+#include <nuttx/addrenv.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <nuttx/sched.h>
@@ -87,10 +89,29 @@ void mm_map_unlock(void)
  *
  ****************************************************************************/
 
-void mm_map_initialize(FAR struct mm_map_s *mm)
+void mm_map_initialize(FAR struct mm_map_s *mm, bool kernel)
 {
   sq_init(&mm->mm_map_sq);
   nxrmutex_init(&mm->mm_map_mutex);
+
+  /* Create the virtual pages allocator for user process */
+
+#ifdef CONFIG_ARCH_VMA_MAPPING
+  if (!kernel)
+    {
+      mm->mm_map_vpages = gran_initialize((FAR void *)CONFIG_ARCH_SHM_VBASE,
+                                          ARCH_SHM_MAXPAGES << MM_PGSHIFT,
+                                          MM_PGSHIFT, MM_PGSHIFT);
+      if (!mm->mm_map_vpages)
+        {
+          merr("gran_initialize() failed\n");
+        }
+    }
+  else
+    {
+      mm->mm_map_vpages = NULL;
+    }
+#endif
 }
 
 /****************************************************************************
@@ -131,6 +152,15 @@ void mm_map_destroy(FAR struct mm_map_s *mm)
     }
 
   nxrmutex_destroy(&mm->mm_map_mutex);
+
+  /* Release the virtual pages allocator */
+
+#ifdef CONFIG_ARCH_VMA_MAPPING
+  if (mm->mm_map_vpages)
+    {
+      gran_release(mm->mm_map_vpages);
+    }
+#endif
 }
 
 /****************************************************************************
diff --git a/mm/map/vm_region.c b/mm/map/vm_region.c
new file mode 100644
index 0000000000..765f62bcbc
--- /dev/null
+++ b/mm/map/vm_region.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * mm/map/vm_region.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/mm/map.h>
+#include <nuttx/mm/gran.h>
+#include <debug.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: vm_alloc_region
+ *
+ * Description:
+ *   Allocate virtual memory region from the process virtual memory area.
+ *
+ * Input Parameters:
+ *   mm    - A reference to the process mm_map struct
+ *   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 *vm_alloc_region(FAR struct mm_map_s *mm, FAR void *vaddr,
+                          size_t size)
+{
+  FAR void *ret = NULL;
+
+  DEBUGASSERT(mm != NULL);
+
+  if (mm->mm_map_vpages != NULL)
+    {
+      if (vaddr == NULL)
+        {
+          ret = gran_alloc(mm->mm_map_vpages, size);
+        }
+      else
+        {
+          ret = gran_reserve(mm->mm_map_vpages, (uintptr_t)vaddr,
+                             size);
+        }
+    }
+
+  return ret;
+}
+
+/****************************************************************************
+ * Name: vm_release_region
+ *
+ * Description:
+ *   Free a previously allocated virtual memory region
+ *
+ * Input Parameters:
+ *   mm    - A reference to the process' mm_map struct
+ *   vaddr - Virtual start address where the allocation starts.
+ *   size  - Size of the allocated area.
+ *
+ ****************************************************************************/
+
+void vm_release_region(FAR struct mm_map_s *mm, FAR void *vaddr, size_t size)
+{
+  DEBUGASSERT(mm != NULL);
+
+  if (mm->mm_map_vpages != NULL)
+    {
+      gran_free(mm->mm_map_vpages, vaddr, size);
+    }
+}
diff --git a/sched/group/group_create.c b/sched/group/group_create.c
index 404f13e5af..9a35f82788 100644
--- a/sched/group/group_create.c
+++ b/sched/group/group_create.c
@@ -240,7 +240,8 @@ void group_initialize(FAR struct task_tcb_s *tcb)
 
   /* Allocate mm_map list if required */
 
-  mm_map_initialize(&group->tg_mm_map);
+  mm_map_initialize(&group->tg_mm_map,
+                    (tcb->cmn.flags & TCB_FLAG_TTYPE_KERNEL) != 0);
 
 #ifdef HAVE_GROUP_MEMBERS
   /* Assign the PID of this new task as a member of the group. */