diff options
| author | Boaz Harrosh <bharrosh@panasas.com> | 2012-05-31 19:26:15 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-31 20:49:28 -0400 |
| commit | 785042f2e275089e22c36b462f6495ce8d91732d (patch) | |
| tree | 4e847408b4e675c7c616d357ae9b330f7104fbc0 /kernel | |
| parent | 81ab6e7b26b453a795d46f2616ed0e31d97f05b9 (diff) | |
kmod: move call_usermodehelper_fns() to .c file and unexport all it's helpers
If we move call_usermodehelper_fns() to kmod.c file and EXPORT_SYMBOL it
we can avoid exporting all it's helper functions:
call_usermodehelper_setup
call_usermodehelper_setfns
call_usermodehelper_exec
And make all of them static to kmod.c
Since the optimizer will see all these as a single call site it will
inline them inside call_usermodehelper_fns(). So we loose the call to
_fns but gain 3 calls to the helpers. (Not that it matters)
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kmod.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c index 21a0f8e99102..1f596e4de306 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -478,6 +478,7 @@ static void helper_unlock(void) | |||
| 478 | * structure. This should be passed to call_usermodehelper_exec to | 478 | * structure. This should be passed to call_usermodehelper_exec to |
| 479 | * exec the process and free the structure. | 479 | * exec the process and free the structure. |
| 480 | */ | 480 | */ |
| 481 | static | ||
| 481 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | 482 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, |
| 482 | char **envp, gfp_t gfp_mask) | 483 | char **envp, gfp_t gfp_mask) |
| 483 | { | 484 | { |
| @@ -493,7 +494,6 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | |||
| 493 | out: | 494 | out: |
| 494 | return sub_info; | 495 | return sub_info; |
| 495 | } | 496 | } |
| 496 | EXPORT_SYMBOL(call_usermodehelper_setup); | ||
| 497 | 497 | ||
| 498 | /** | 498 | /** |
| 499 | * call_usermodehelper_setfns - set a cleanup/init function | 499 | * call_usermodehelper_setfns - set a cleanup/init function |
| @@ -511,6 +511,7 @@ EXPORT_SYMBOL(call_usermodehelper_setup); | |||
| 511 | * Function must be runnable in either a process context or the | 511 | * Function must be runnable in either a process context or the |
| 512 | * context in which call_usermodehelper_exec is called. | 512 | * context in which call_usermodehelper_exec is called. |
| 513 | */ | 513 | */ |
| 514 | static | ||
| 514 | void call_usermodehelper_setfns(struct subprocess_info *info, | 515 | void call_usermodehelper_setfns(struct subprocess_info *info, |
| 515 | int (*init)(struct subprocess_info *info, struct cred *new), | 516 | int (*init)(struct subprocess_info *info, struct cred *new), |
| 516 | void (*cleanup)(struct subprocess_info *info), | 517 | void (*cleanup)(struct subprocess_info *info), |
| @@ -520,7 +521,6 @@ void call_usermodehelper_setfns(struct subprocess_info *info, | |||
| 520 | info->init = init; | 521 | info->init = init; |
| 521 | info->data = data; | 522 | info->data = data; |
| 522 | } | 523 | } |
| 523 | EXPORT_SYMBOL(call_usermodehelper_setfns); | ||
| 524 | 524 | ||
| 525 | /** | 525 | /** |
| 526 | * call_usermodehelper_exec - start a usermode application | 526 | * call_usermodehelper_exec - start a usermode application |
| @@ -534,6 +534,7 @@ EXPORT_SYMBOL(call_usermodehelper_setfns); | |||
| 534 | * asynchronously if wait is not set, and runs as a child of keventd. | 534 | * asynchronously if wait is not set, and runs as a child of keventd. |
| 535 | * (ie. it runs with full root capabilities). | 535 | * (ie. it runs with full root capabilities). |
| 536 | */ | 536 | */ |
| 537 | static | ||
| 537 | int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) | 538 | int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) |
| 538 | { | 539 | { |
| 539 | DECLARE_COMPLETION_ONSTACK(done); | 540 | DECLARE_COMPLETION_ONSTACK(done); |
| @@ -575,7 +576,25 @@ unlock: | |||
| 575 | helper_unlock(); | 576 | helper_unlock(); |
| 576 | return retval; | 577 | return retval; |
| 577 | } | 578 | } |
| 578 | EXPORT_SYMBOL(call_usermodehelper_exec); | 579 | |
| 580 | int call_usermodehelper_fns( | ||
| 581 | char *path, char **argv, char **envp, int wait, | ||
| 582 | int (*init)(struct subprocess_info *info, struct cred *new), | ||
| 583 | void (*cleanup)(struct subprocess_info *), void *data) | ||
| 584 | { | ||
| 585 | struct subprocess_info *info; | ||
| 586 | gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; | ||
| 587 | |||
| 588 | info = call_usermodehelper_setup(path, argv, envp, gfp_mask); | ||
| 589 | |||
| 590 | if (info == NULL) | ||
| 591 | return -ENOMEM; | ||
| 592 | |||
| 593 | call_usermodehelper_setfns(info, init, cleanup, data); | ||
| 594 | |||
| 595 | return call_usermodehelper_exec(info, wait); | ||
| 596 | } | ||
| 597 | EXPORT_SYMBOL(call_usermodehelper_fns); | ||
| 579 | 598 | ||
| 580 | static int proc_cap_handler(struct ctl_table *table, int write, | 599 | static int proc_cap_handler(struct ctl_table *table, int write, |
| 581 | void __user *buffer, size_t *lenp, loff_t *ppos) | 600 | void __user *buffer, size_t *lenp, loff_t *ppos) |
