From: Nigel Cunningham <ncunningham@cyclades.com>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [QN/PATCH] Why do some archs allocate stack via kmalloc, others via get_free_pages?
Date: Fri, 22 Jul 2005 14:11:17 +1000 [thread overview]
Message-ID: <1122005477.3033.56.camel@localhost> (raw)
Hi all.
In making some modifications to Suspend, we've discovered that some
arches use kmalloc and others use get_free_pages to allocate the stack.
Is there a reason for the variation? If not, could the following patch
be considered for inclusion (tested on x86 only).
Regards,
Nigel
arch/frv/kernel/process.c | 4 ++--
include/asm-frv/thread_info.h | 11 ++++++++---
include/asm-i386/thread_info.h | 11 ++++++++---
include/asm-m32r/thread_info.h | 10 +++++++---
include/asm-mips/thread_info.h | 8 +++++---
include/asm-ppc64/thread_info.h | 9 ++++++---
include/asm-um/thread_info.h | 6 ++++--
7 files changed, 40 insertions(+), 19 deletions(-)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/arch/frv/kernel/process.c 821-make-task-struct-use-get-free-pages.patch-new/arch/frv/kernel/process.c
--- 821-make-task-struct-use-get-free-pages.patch-old/arch/frv/kernel/process.c 2005-02-03 22:33:14.000000000 +1100
+++ 821-make-task-struct-use-get-free-pages.patch-new/arch/frv/kernel/process.c 2005-07-22 04:39:15.000000000 +1000
@@ -41,7 +41,7 @@ asmlinkage void ret_from_fork(void);
struct task_struct *alloc_task_struct(void)
{
- struct task_struct *p = kmalloc(THREAD_SIZE, GFP_KERNEL);
+ struct task_struct *p = (struct task_struct *) __get_free_pages(GFP_KERNEL, THREAD_ORDER);
if (p)
atomic_set((atomic_t *)(p+1), 1);
return p;
@@ -50,7 +50,7 @@ struct task_struct *alloc_task_struct(vo
void free_task_struct(struct task_struct *p)
{
if (atomic_dec_and_test((atomic_t *)(p+1)))
- kfree(p);
+ free_pages((unsigned long) p, THREAD_ORDER);
}
static void core_sleep_idle(void)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-frv/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-frv/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-frv/thread_info.h 2005-07-18 06:37:02.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-frv/thread_info.h 2005-07-22 04:52:48.000000000 +1000
@@ -89,6 +89,8 @@ struct thread_info {
#define THREAD_SIZE 8192
#endif
+#define THREAD_ORDER (THREAD_SIZE >> PAGE_SHIFT)
+
/* how to get the thread information struct from C */
register struct thread_info *__current_thread_info asm("gr15");
@@ -100,16 +102,19 @@ register struct thread_info *__current_t
({ \
struct thread_info *ret; \
\
- ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \
+ ret = (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, \
+ THREAD_ORDER); \
if (ret) \
memset(ret, 0, THREAD_SIZE); \
ret; \
})
#else
-#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
+#define alloc_thread_info(tsk) (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER)
#endif
-#define free_thread_info(info) kfree(info)
+#define free_thread_info(info) free_pages((unsigned long) info, THREAD_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-i386/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-i386/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-i386/thread_info.h 2005-07-22 05:17:22.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-i386/thread_info.h 2005-07-22 04:58:14.000000000 +1000
@@ -55,8 +55,10 @@ struct thread_info {
#define PREEMPT_ACTIVE 0x10000000
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
+#define THREAD_ORDER 0
#else
#define THREAD_SIZE (8192)
+#define THREAD_ORDER 1
#endif
#define STACK_WARN (THREAD_SIZE/8)
@@ -101,16 +103,19 @@ register unsigned long current_stack_poi
({ \
struct thread_info *ret; \
\
- ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \
+ ret = (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, \
+ THREAD_ORDER); \
if (ret) \
memset(ret, 0, THREAD_SIZE); \
ret; \
})
#else
-#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
+#define alloc_thread_info(tsk) (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER)
#endif
-#define free_thread_info(info) kfree(info)
+#define free_thread_info(info) free_pages((unsigned long) info, THREAD_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-m32r/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-m32r/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-m32r/thread_info.h 2005-07-18 06:37:03.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-m32r/thread_info.h 2005-07-22 05:01:51.000000000 +1000
@@ -79,6 +79,7 @@ struct thread_info {
#define init_stack (init_thread_union.stack)
#define THREAD_SIZE (2*PAGE_SIZE)
+#define THREAD_ORDER 1
/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
@@ -100,16 +101,19 @@ static inline struct thread_info *curren
({ \
struct thread_info *ret; \
\
- ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \
+ ret = (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, \
+ THREAD_ORDER); \
if (ret) \
memset(ret, 0, THREAD_SIZE); \
ret; \
})
#else
-#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
+#define alloc_thread_info(tsk) (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER)
#endif
-#define free_thread_info(info) kfree(info)
+#define free_thread_info(info) free_pages((unsigned long) info, THREAD_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-mips/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-mips/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-mips/thread_info.h 2005-07-18 06:37:03.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-mips/thread_info.h 2005-07-22 04:43:10.000000000 +1000
@@ -86,16 +86,18 @@ register struct thread_info *__current_t
({ \
struct thread_info *ret; \
\
- ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \
+ ret = (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER); \
if (ret) \
memset(ret, 0, THREAD_SIZE); \
ret; \
})
#else
-#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
+#define alloc_thread_info(tsk) (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER)
#endif
-#define free_thread_info(info) kfree(info)
+#define free_thread_info(info) free_pages((unsigned long) info, THREAD_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-ppc64/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-ppc64/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-ppc64/thread_info.h 2005-07-18 06:37:03.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-ppc64/thread_info.h 2005-07-22 04:44:26.000000000 +1000
@@ -62,15 +62,18 @@ struct thread_info {
({ \
struct thread_info *ret; \
\
- ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \
+ ret = (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, \
+ THREAD_ORDER); \
if (ret) \
memset(ret, 0, THREAD_SIZE); \
ret; \
})
#else
-#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
+#define alloc_thread_info(tsk) (struct thread_info *) \
+ __get_free_pages(GFP_KERNEL, THREAD_ORDER)
#endif
-#define free_thread_info(ti) kfree(ti)
+#define free_thread_info(ti) free_pages((unsigned long) ti, THREAD_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
diff -ruNp 821-make-task-struct-use-get-free-pages.patch-old/include/asm-um/thread_info.h 821-make-task-struct-use-get-free-pages.patch-new/include/asm-um/thread_info.h
--- 821-make-task-struct-use-get-free-pages.patch-old/include/asm-um/thread_info.h 2005-07-18 06:37:04.000000000 +1000
+++ 821-make-task-struct-use-get-free-pages.patch-new/include/asm-um/thread_info.h 2005-07-22 01:57:00.000000000 +1000
@@ -53,8 +53,10 @@ static inline struct thread_info *curren
/* thread information allocation */
#define alloc_thread_info(tsk) \
- ((struct thread_info *) kmalloc(THREAD_SIZE, GFP_KERNEL))
-#define free_thread_info(ti) kfree(ti)
+ ((struct thread_info *) __get_free_pages(GFP_KERNEL, \
+ CONFIG_KERNEL_STACK_ORDER))
+#define free_thread_info(ti) free_pages((unsigned long) ti, \
+ CONFIG_KERNEL_STACK_ORDER)
#define get_thread_info(ti) get_task_struct((ti)->task)
#define put_thread_info(ti) put_task_struct((ti)->task)
--
Evolution.
Enumerate the requirements.
Consider the interdependencies.
Calculate the probabilities.
next reply other threads:[~2005-07-22 4:35 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-22 4:11 Nigel Cunningham [this message]
2005-07-22 7:50 ` [QN/PATCH] Why do some archs allocate stack via kmalloc, others via get_free_pages? David S. Miller
2005-07-22 14:57 ` Nigel Cunningham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1122005477.3033.56.camel@localhost \
--to=ncunningham@cyclades.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.