proc: uninline name_to_int()
PATCH 1/2 proc: uninline name_to_int()
Save ~360 bytes.
add/remove: 1/0 grow/shrink: 0/4 up/down: 104/-463 (-359)
function old new delta
name_to_int - 104 +104
proc_pid_lookup 217 126 -91
proc_lookupfd_common 212 121 -91
proc_task_lookup 289 194 -95
__proc_create 588 402 -186
---
fs/proc/Makefile | 1 + fs/proc/internal.h | 23 +---------------------- fs/proc/util.c | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 22 deletions(-)
fs/proc/Makefile +1 -0
@@ -20,6 +20,7 @@ proc-y += loadavg.o proc-y += meminfo.o proc-y += stat.o proc-y += uptime.o +proc-y += util.o proc-y += version.o proc-y += softirqs.o proc-y += namespaces.o
fs/proc/internal.h +1 -22
@@ -103,28 +103,7 @@ static inline struct task_struct *get_proc_task(struct inode *inode)void task_dump_owner (struct task_struct *task,mode_t mode,kuid_t *ruid,kgid_t *rgid); -static inline unsigned name_to_int (const struct qstr *qstr) -{ -const char *name = qstr->name; -int len = qstr->len; -unsigned n =0 ; - -if (len >1 && *name =='0' ) - goto out; -while (len-- >0 ) { -unsigned c = *name++ -'0' ; -if (c >9 ) - goto out; -if (n >= (~0U -9 )/10 ) - goto out; - n *=10 ; - n += c; - } -return n; -out: -return ~0U ; -} - +unsigned name_to_int (const struct qstr *qstr);/* * Offset of the first process in the /proc root directory.. */
fs/proc/util.c new file +23 -0
@@ -0,0 +1,23 @@ +#include <linux/dcache.h> + +unsigned name_to_int (const struct qstr *qstr) +{ +const char *name = qstr->name; +int len = qstr->len; +unsigned n =0 ; + +if (len >1 && *name =='0' ) + goto out; +while (len-- >0 ) { +unsigned c = *name++ -'0' ; +if (c >9 ) + goto out; +if (n >= (~0U -9 )/10 ) + goto out; + n *=10 ; + n += c; + } +return n; +out: +return ~0U ; +}
PATCH 2/2 proc: use do-while in name_to_int()
Gcc doesn't know that "len" is guaranteed to be >=1 by dcache and generates standard while-loop prologue duplicating loop condition.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-27 (-27)
function old new delta
name_to_int 104 77 -27
---
fs/proc/util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/proc/util.c +2 -2
@@ -8,7 +8,7 @@ unsigned name_to_int(const struct qstr *qstr)if (len >1 && *name =='0' ) goto out; -while (len-- >0 ) { + do { unsigned c = *name++ - '0'; if (c > 9) goto out;
@@ -16,7 +16,7 @@ unsigned name_to_int(const struct qstr *qstr) goto out; n *=10 ; n += c; - } + }while (--len >0 );return n; out:return ~0U ;