diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-02-08 07:18:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-08 12:22:25 -0500 |
commit | b2d75cddc83a349ef5633f609b9734b6b957f90f (patch) | |
tree | 95e493a25eedec2722d5fb3c2ef0aabc64645b21 | |
parent | a46c9994242978ab001299cc9c906b9a3eedadcc (diff) |
ipc: uninline some code from util.h
ipc_lock_check_down(), ipc_lock_check() and ipcget() seem too large to be
inline. Besides, they give no optimization being inline as they perform
calls inside in any case.
Moving them into ipc/util.c saves 500 bytes of vmlinux and shortens IPC
internal API.
$ ./scripts/bloat-o-meter vmlinux-orig vmlinux
add/remove: 3/2 grow/shrink: 0/10 up/down: 490/-989 (-499)
function old new delta
ipcget - 392 +392
ipc_lock_check_down - 49 +49
ipc_lock_check - 49 +49
sys_semget 119 105 -14
sys_shmget 108 86 -22
sys_msgget 100 78 -22
do_msgsnd 665 631 -34
do_msgrcv 680 644 -36
do_shmat 771 733 -38
sys_msgctl 1302 1229 -73
ipcget_new 80 - -80
sys_semtimedop 1534 1452 -82
sys_semctl 2034 1922 -112
sys_shmctl 1919 1765 -154
ipcget_public 322 - -322
The ipcget() growth is the result of gcc inlining of currently static
ipcget_new/_public.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Cc: Nadia Derbey <Nadia.Derbey@bull.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | ipc/util.c | 55 | ||||
-rw-r--r-- | ipc/util.h | 60 |
2 files changed, 57 insertions, 58 deletions
diff --git a/ipc/util.c b/ipc/util.c index 5432b8e34c9b..910db7748199 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
@@ -248,7 +248,7 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
248 | * This routine is called by sys_msgget, sys_semget() and sys_shmget() | 248 | * This routine is called by sys_msgget, sys_semget() and sys_shmget() |
249 | * when the key is IPC_PRIVATE. | 249 | * when the key is IPC_PRIVATE. |
250 | */ | 250 | */ |
251 | int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, | 251 | static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, |
252 | struct ipc_ops *ops, struct ipc_params *params) | 252 | struct ipc_ops *ops, struct ipc_params *params) |
253 | { | 253 | { |
254 | int err; | 254 | int err; |
@@ -312,7 +312,7 @@ static int ipc_check_perms(struct kern_ipc_perm *ipcp, struct ipc_ops *ops, | |||
312 | * | 312 | * |
313 | * On success, the ipc id is returned. | 313 | * On success, the ipc id is returned. |
314 | */ | 314 | */ |
315 | int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, | 315 | static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, |
316 | struct ipc_ops *ops, struct ipc_params *params) | 316 | struct ipc_ops *ops, struct ipc_params *params) |
317 | { | 317 | { |
318 | struct kern_ipc_perm *ipcp; | 318 | struct kern_ipc_perm *ipcp; |
@@ -710,6 +710,57 @@ struct kern_ipc_perm *ipc_lock_down(struct ipc_ids *ids, int id) | |||
710 | return out; | 710 | return out; |
711 | } | 711 | } |
712 | 712 | ||
713 | struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id) | ||
714 | { | ||
715 | struct kern_ipc_perm *out; | ||
716 | |||
717 | out = ipc_lock_down(ids, id); | ||
718 | if (IS_ERR(out)) | ||
719 | return out; | ||
720 | |||
721 | if (ipc_checkid(out, id)) { | ||
722 | ipc_unlock(out); | ||
723 | return ERR_PTR(-EIDRM); | ||
724 | } | ||
725 | |||
726 | return out; | ||
727 | } | ||
728 | |||
729 | struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id) | ||
730 | { | ||
731 | struct kern_ipc_perm *out; | ||
732 | |||
733 | out = ipc_lock(ids, id); | ||
734 | if (IS_ERR(out)) | ||
735 | return out; | ||
736 | |||
737 | if (ipc_checkid(out, id)) { | ||
738 | ipc_unlock(out); | ||
739 | return ERR_PTR(-EIDRM); | ||
740 | } | ||
741 | |||
742 | return out; | ||
743 | } | ||
744 | |||
745 | /** | ||
746 | * ipcget - Common sys_*get() code | ||
747 | * @ns : namsepace | ||
748 | * @ids : IPC identifier set | ||
749 | * @ops : operations to be called on ipc object creation, permission checks | ||
750 | * and further checks | ||
751 | * @params : the parameters needed by the previous operations. | ||
752 | * | ||
753 | * Common routine called by sys_msgget(), sys_semget() and sys_shmget(). | ||
754 | */ | ||
755 | int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, | ||
756 | struct ipc_ops *ops, struct ipc_params *params) | ||
757 | { | ||
758 | if (params->key == IPC_PRIVATE) | ||
759 | return ipcget_new(ns, ids, ops, params); | ||
760 | else | ||
761 | return ipcget_public(ns, ids, ops, params); | ||
762 | } | ||
763 | |||
713 | #ifdef __ARCH_WANT_IPC_PARSE_VERSION | 764 | #ifdef __ARCH_WANT_IPC_PARSE_VERSION |
714 | 765 | ||
715 | 766 | ||
diff --git a/ipc/util.h b/ipc/util.h index fc6b7294f764..ca245fae2f98 100644 --- a/ipc/util.h +++ b/ipc/util.h | |||
@@ -131,10 +131,6 @@ int ipc_parse_version (int *cmd); | |||
131 | extern void free_msg(struct msg_msg *msg); | 131 | extern void free_msg(struct msg_msg *msg); |
132 | extern struct msg_msg *load_msg(const void __user *src, int len); | 132 | extern struct msg_msg *load_msg(const void __user *src, int len); |
133 | extern int store_msg(void __user *dest, struct msg_msg *msg, int len); | 133 | extern int store_msg(void __user *dest, struct msg_msg *msg, int len); |
134 | extern int ipcget_new(struct ipc_namespace *, struct ipc_ids *, | ||
135 | struct ipc_ops *, struct ipc_params *); | ||
136 | extern int ipcget_public(struct ipc_namespace *, struct ipc_ids *, | ||
137 | struct ipc_ops *, struct ipc_params *); | ||
138 | 134 | ||
139 | static inline int ipc_buildid(int id, int seq) | 135 | static inline int ipc_buildid(int id, int seq) |
140 | { | 136 | { |
@@ -163,57 +159,9 @@ static inline void ipc_unlock(struct kern_ipc_perm *perm) | |||
163 | rcu_read_unlock(); | 159 | rcu_read_unlock(); |
164 | } | 160 | } |
165 | 161 | ||
166 | static inline struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, | 162 | struct kern_ipc_perm *ipc_lock_check_down(struct ipc_ids *ids, int id); |
167 | int id) | 163 | struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id); |
168 | { | 164 | int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, |
169 | struct kern_ipc_perm *out; | 165 | struct ipc_ops *ops, struct ipc_params *params); |
170 | |||
171 | out = ipc_lock_down(ids, id); | ||
172 | if (IS_ERR(out)) | ||
173 | return out; | ||
174 | |||
175 | if (ipc_checkid(out, id)) { | ||
176 | ipc_unlock(out); | ||
177 | return ERR_PTR(-EIDRM); | ||
178 | } | ||
179 | |||
180 | return out; | ||
181 | } | ||
182 | |||
183 | static inline struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, | ||
184 | int id) | ||
185 | { | ||
186 | struct kern_ipc_perm *out; | ||
187 | |||
188 | out = ipc_lock(ids, id); | ||
189 | if (IS_ERR(out)) | ||
190 | return out; | ||
191 | |||
192 | if (ipc_checkid(out, id)) { | ||
193 | ipc_unlock(out); | ||
194 | return ERR_PTR(-EIDRM); | ||
195 | } | ||
196 | |||
197 | return out; | ||
198 | } | ||
199 | |||
200 | /** | ||
201 | * ipcget - Common sys_*get() code | ||
202 | * @ns : namsepace | ||
203 | * @ids : IPC identifier set | ||
204 | * @ops : operations to be called on ipc object creation, permission checks | ||
205 | * and further checks | ||
206 | * @params : the parameters needed by the previous operations. | ||
207 | * | ||
208 | * Common routine called by sys_msgget(), sys_semget() and sys_shmget(). | ||
209 | */ | ||
210 | static inline int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, | ||
211 | struct ipc_ops *ops, struct ipc_params *params) | ||
212 | { | ||
213 | if (params->key == IPC_PRIVATE) | ||
214 | return ipcget_new(ns, ids, ops, params); | ||
215 | else | ||
216 | return ipcget_public(ns, ids, ops, params); | ||
217 | } | ||
218 | 166 | ||
219 | #endif | 167 | #endif |