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 a5ed8014e876242cb9bea12499fef74ac0bfa76b Author: Jukka Laitinen <juk...@ssrc.tii.ae> AuthorDate: Mon Jan 9 12:02:24 2023 +0400 Move anonymous mapping emulation into own module under fs/mmap Signed-off-by: Jukka Laitinen <juk...@ssrc.tii.ae> --- fs/mmap/Kconfig | 7 +++- fs/mmap/Make.defs | 4 ++ fs/mmap/fs_anonmap.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++ fs/mmap/fs_anonmap.h | 61 +++++++++++++++++++++++++++ fs/mmap/fs_mmap.c | 61 +-------------------------- 5 files changed, 186 insertions(+), 61 deletions(-) diff --git a/fs/mmap/Kconfig b/fs/mmap/Kconfig index b4551376e4..6732b8e89d 100644 --- a/fs/mmap/Kconfig +++ b/fs/mmap/Kconfig @@ -23,5 +23,8 @@ config FS_RAMMAP See nuttx/fs/mmap/README.txt for additional information. -if FS_RAMMAP -endif +config FS_ANONMAP + bool "Anonymous mapping emulation" + default y + ---help--- + Simulate private anonymous mappings by plain malloc diff --git a/fs/mmap/Make.defs b/fs/mmap/Make.defs index ab8cbd05e4..dff6e732b8 100644 --- a/fs/mmap/Make.defs +++ b/fs/mmap/Make.defs @@ -24,6 +24,10 @@ ifeq ($(CONFIG_FS_RAMMAP),y) CSRCS += fs_rammap.c endif +ifeq ($(CONFIG_FS_ANONMAP),y) +CSRCS += fs_anonmap.c +endif + # Include MMAP build support DEPPATH += --dep-path mmap diff --git a/fs/mmap/fs_anonmap.c b/fs/mmap/fs_anonmap.c new file mode 100644 index 0000000000..534806e9af --- /dev/null +++ b/fs/mmap/fs_anonmap.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * fs/mmap/fs_anonmap.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 <nuttx/kmalloc.h> +#include <debug.h> + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: unmap_anonymous + ****************************************************************************/ + +static int unmap_anonymous(FAR struct task_group_s *group, + FAR struct mm_map_entry_s *entry, + FAR void *start, + size_t length) +{ + int ret; + + /* De-allocate memory. + * NB: This is incomplete anounymous mapping implementation + * see file_mmap_ below + */ + + if (start == entry->vaddr && length == entry->length) + { + /* entry->priv marks allocation from kernel heap */ + + if (entry->priv.i) + { + kmm_free(start); + } + else + { + kumm_free(start); + } + + ret = mm_map_remove(get_group_mm(group), entry); + } + else + { + ret = -EINVAL; + ferr("ERROR: Unknown map type\n"); + } + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int map_anonymous(FAR struct mm_map_entry_s *entry, bool kernel) +{ + int ret; + + /* REVISIT: Should reside outside of the heap. That is really the + * only purpose of MAP_ANONYMOUS: To get non-heap memory. In KERNEL + * build, this could be accomplished using pgalloc(), provided that + * you had logic in place to assign a virtual address to the mapping. + */ + + entry->vaddr = kernel ? + kmm_zalloc(entry->length) : kumm_zalloc(entry->length); + if (entry->vaddr == NULL) + { + ferr("ERROR: kumm_alloc() failed, enable DEBUG_MM for info!\n"); + return -ENOMEM; + } + + entry->munmap = unmap_anonymous; + entry->priv.i = kernel; + + ret = mm_map_add(entry); + if (ret < 0) + { + if (kernel) + { + kmm_free(entry->vaddr); + } + else + { + kumm_free(entry->vaddr); + } + + entry->vaddr = NULL; + } + + return ret; +} diff --git a/fs/mmap/fs_anonmap.h b/fs/mmap/fs_anonmap.h new file mode 100644 index 0000000000..70725c5623 --- /dev/null +++ b/fs/mmap/fs_anonmap.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * fs/mmap/fs_anonmap.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 __FS_MMAP_FS_ANONMAP_H +#define __FS_MMAP_FS_ANONMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <sys/types.h> +#include <nuttx/mm/map.h> + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: map_anonymous + * + * Description: + * Support simulation of private anonymous mapping by allocating memory + * from heap + * + * Input Parameters: + * map Input struct containing user request + * kernel kmm_zalloc or kumm_zalloc + * + * Returned Value: + * On success returns 0. Otherwise negated errno is returned appropriately. + * + * ENOMEM + * Insufficient memory is available to simulate mapping + * + ****************************************************************************/ + +#ifdef CONFIG_FS_ANONMAP +int map_anonymous(FAR struct mm_map_entry_s *entry, bool kernel); +#else +#define map_anonymous(entry,kernel) (-ENOSYS) +#endif /* CONFIG_FS_ANONMAP */ + +#endif /* __FS_MMAP_FS_ANONMAP_H */ diff --git a/fs/mmap/fs_mmap.c b/fs/mmap/fs_mmap.c index 4f541fffe9..e0f81f53a9 100644 --- a/fs/mmap/fs_mmap.c +++ b/fs/mmap/fs_mmap.c @@ -36,51 +36,12 @@ #include "inode/inode.h" #include "fs_rammap.h" +#include "fs_anonmap.h" /**************************************************************************** * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: unmap_anonymous - ****************************************************************************/ - -static int unmap_anonymous(FAR struct task_group_s *group, - FAR struct mm_map_entry_s *entry, - FAR void *start, - size_t length) -{ - int ret; - - /* De-allocate memory. - * NB: This is incomplete anounymous mapping implementation - * see file_mmap_ below - */ - - if (start == entry->vaddr && length == entry->length) - { - /* entry->priv marks allocation from kernel heap */ - - if (entry->priv.i) - { - kmm_free(start); - } - else - { - kumm_free(start); - } - - ret = mm_map_remove(group, &entry); - } - else - { - ret = -EINVAL; - ferr("ERROR: Unknown map type\n"); - } - - return ret; -} - /**************************************************************************** * Name: file_mmap_ ****************************************************************************/ @@ -164,25 +125,7 @@ static int file_mmap_(FAR struct file *filep, FAR void *start, if ((flags & MAP_ANONYMOUS) != 0) { - /* REVISIT: Should reside outside of the heap. That is really the - * only purpose of MAP_ANONYMOUS: To get non-heap memory. In KERNEL - * build, this could be accomplished using pgalloc(), provided that - * you had logic in place to assign a virtual address to the mapping. - */ - - *mapped = kernel ? kmm_zalloc(length) : kumm_zalloc(length); - if (*mapped == NULL) - { - ferr("ERROR: kumm_alloc() failed, enable DEBUG_MM for info!\n"); - return -ENOMEM; - } - - entry.vaddr = *mapped; - entry.munmap = unmap_anonymous; - entry.priv.i = kernel; - mm_map_add(&entry); - - return OK; + return map_anonymous(&entry, kernel); } if ((flags & MAP_PRIVATE) != 0)