amlogic: mm: Add aml_task_stack() in amlogic vmap 71/252171/1
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 25 Jan 2021 06:40:42 +0000 (15:40 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Mon, 25 Jan 2021 06:49:58 +0000 (15:49 +0900)
In kerne, there are several places to get stack page address of
task and when using AMLOGIC_VMAP, task_stack_page() does not
return page address. Add aml_task_stack() to get task stack page
for amlogic vmap.

Change-Id: I64cd827f98bec74357227dcc3ed546807b5406e3
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
drivers/amlogic/memory_ext/vmap_stack.c
include/linux/amlogic/vmap_stack.h

index 387fb80..7a98983 100644 (file)
@@ -753,6 +753,22 @@ static void check_and_map_stack_shadow(unsigned long addr)
 }
 #endif
 
+void *aml_task_stack(struct task_struct *tsk)
+{
+       unsigned long stack = (unsigned long)tsk->stack;
+       unsigned long addr;
+       struct page *page;
+
+       if (unlikely(!is_vmap_addr(stack))) {
+               /* stack get from kmalloc, currently no method to get page */
+               return NULL;
+       }
+
+       addr = stack + STACK_TOP_PAGE_OFF;
+       page = vmalloc_to_page((const void *)addr);
+       return page ? page_address(page) : NULL;
+}
+
 void *aml_stack_alloc(int node, struct task_struct *tsk)
 {
        unsigned long bitmap_no, raw_start;
index 9b1f868..419e908 100644 (file)
@@ -76,6 +76,7 @@ extern void  __setup_vmap_stack(unsigned long off);
 extern void  update_vmap_stack(int diff);
 extern int   get_vmap_stack_size(void);
 extern int   is_vmap_addr(unsigned long addr);
+extern void *aml_task_stack(struct task_struct *tsk);
 extern void  aml_stack_free(struct task_struct *tsk);
 extern void *aml_stack_alloc(int node, struct task_struct *tsk);
 extern void  aml_account_task_stack(struct task_struct *tsk, int account);