From a2a10c87e30dcc3b0fee0f9796dc42d52444bdd4 Mon Sep 17 00:00:00 2001 From: Jukka Laitinen Date: Wed, 11 Jan 2023 12:26:40 +0400 Subject: [PATCH] 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 --- 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(-) delete mode 100644 include/nuttx/mm/shm.h delete mode 100644 mm/shm/shm_alloc.c delete mode 100644 mm/shm/shm_initialize.c 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 #include #include -#include #include #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 - -#include - -#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 #include #include -#include #include #include #include @@ -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 - -#include -#include -#include - -#include -#include -#include -#include -#include - -#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 - -#include -#include -#include - -#include -#include -#include -#include -#include - -#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 #include -#include #include #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 #include -#include #include #include 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 #include -#include #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 */