Commit 8278cc16 authored by Helge Deller's avatar Helge Deller

parisc: Reduce code size by optimizing get_current() function calls

The get_current() code uses the mfctl() macro to get the pointer to the
current task struct from %cr30. The problem with the mfctl() macro is,
that it is marked volatile which is basically correct, because mfctl()
is used to get e.g. the current internal timer or interrupt flags as
well.

But specifically the task struct pointer (%cr30) doesn't change over
time when the kernel executes code for a task.

So, by dropping the volatile when retrieving %cr30 the compiler is now
able to get this value only once and optimize the generated code a lot.

A bloat-o-meter comparism shows that this patch saves ~5kB kernel code
on a 32-bit kernel and ~6kB kernel code on a 64-bit kernel.
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 360bd6c6
...@@ -2,14 +2,16 @@ ...@@ -2,14 +2,16 @@
#ifndef _ASM_PARISC_CURRENT_H #ifndef _ASM_PARISC_CURRENT_H
#define _ASM_PARISC_CURRENT_H #define _ASM_PARISC_CURRENT_H
#include <asm/special_insns.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
struct task_struct; struct task_struct;
static __always_inline struct task_struct *get_current(void) static __always_inline struct task_struct *get_current(void)
{ {
return (struct task_struct *) mfctl(30); struct task_struct *ts;
/* do not use mfctl() macro as it is marked volatile */
asm( "mfctl %%cr30,%0" : "=r" (ts) );
return ts;
} }
#define current get_current() #define current get_current()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment