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

xiaoxiang pushed a commit to branch releases/12.3
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 0cb54c19598225f1529e5cdc7a6ad60b6d3fec58
Author: Ville Juven <ville.ju...@unikie.com>
AuthorDate: Thu Oct 5 15:33:03 2023 +0300

    kmm_map: Add function to map a single page of kernel memory
    
    Mapping a physical page to a kernel virtual page is very simple and does
    not need the kernel vma list, just get the kernel addressable virtual
    address for the page.
---
 mm/kmap/kmm_map.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/mm/kmap/kmm_map.c b/mm/kmap/kmm_map.c
index ca94fe3bf0..cb270706f1 100644
--- a/mm/kmap/kmm_map.c
+++ b/mm/kmap/kmm_map.c
@@ -192,6 +192,27 @@ static FAR void *map_single_user_page(uintptr_t vaddr)
   return (FAR void *)vaddr;
 }
 
+/****************************************************************************
+ * Name: map_single_page
+ *
+ * Description:
+ *   Map (find) a single page from the kernel addressable virtual memory
+ *   pool.
+ *
+ * Input Parameters:
+ *   page - The physical page.
+ *
+ * Returned Value:
+ *   The kernel virtual address for the page, or NULL if page is not kernel
+ *   addressable.
+ *
+ ****************************************************************************/
+
+static FAR void *map_single_page(uintptr_t page)
+{
+  return (FAR void *)up_addrenv_page_vaddr(page);
+}
+
 /****************************************************************************
  * Name: is_kmap_vaddr
  *
@@ -290,6 +311,13 @@ FAR void *kmm_map(FAR void **pages, size_t npages, int 
prot)
       return NULL;
     }
 
+  /* A single page can be addressed directly, if it is a kernel page */
+
+  if (npages == 1)
+    {
+      return map_single_page((uintptr_t)pages[0]);
+    }
+
   /* Attempt to map the pages */
 
   vaddr = (uintptr_t)map_pages(pages, npages, prot);

Reply via email to