Skip to content

Commit

Permalink
kmod: move call_usermodehelper_fns() to .c file and unexport all it's…
Browse files Browse the repository at this point in the history
… 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 <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Boaz Harrosh authored and torvalds committed Jun 1, 2012
1 parent 81ab6e7 commit 785042f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 31 deletions.
30 changes: 2 additions & 28 deletions include/linux/kmod.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,36 +66,10 @@ struct subprocess_info {
void *data;
};

/* Allocate a subprocess_info structure */
struct subprocess_info *call_usermodehelper_setup(char *path, char **argv,
char **envp, gfp_t gfp_mask);

/* Set various pieces of state into the subprocess_info structure */
void call_usermodehelper_setfns(struct subprocess_info *info,
int (*init)(struct subprocess_info *info, struct cred *new),
void (*cleanup)(struct subprocess_info *info),
void *data);

/* Actually execute the sub-process */
int call_usermodehelper_exec(struct subprocess_info *info, int wait);

static inline int
extern int
call_usermodehelper_fns(char *path, char **argv, char **envp, int wait,
int (*init)(struct subprocess_info *info, struct cred *new),
void (*cleanup)(struct subprocess_info *), void *data)
{
struct subprocess_info *info;
gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;

info = call_usermodehelper_setup(path, argv, envp, gfp_mask);

if (info == NULL)
return -ENOMEM;

call_usermodehelper_setfns(info, init, cleanup, data);

return call_usermodehelper_exec(info, wait);
}
void (*cleanup)(struct subprocess_info *), void *data);

static inline int
call_usermodehelper(char *path, char **argv, char **envp, int wait)
Expand Down
25 changes: 22 additions & 3 deletions kernel/kmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ static void helper_unlock(void)
* structure. This should be passed to call_usermodehelper_exec to
* exec the process and free the structure.
*/
static
struct subprocess_info *call_usermodehelper_setup(char *path, char **argv,
char **envp, gfp_t gfp_mask)
{
Expand All @@ -493,7 +494,6 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv,
out:
return sub_info;
}
EXPORT_SYMBOL(call_usermodehelper_setup);

/**
* call_usermodehelper_setfns - set a cleanup/init function
Expand All @@ -511,6 +511,7 @@ EXPORT_SYMBOL(call_usermodehelper_setup);
* Function must be runnable in either a process context or the
* context in which call_usermodehelper_exec is called.
*/
static
void call_usermodehelper_setfns(struct subprocess_info *info,
int (*init)(struct subprocess_info *info, struct cred *new),
void (*cleanup)(struct subprocess_info *info),
Expand All @@ -520,7 +521,6 @@ void call_usermodehelper_setfns(struct subprocess_info *info,
info->init = init;
info->data = data;
}
EXPORT_SYMBOL(call_usermodehelper_setfns);

/**
* call_usermodehelper_exec - start a usermode application
Expand All @@ -534,6 +534,7 @@ EXPORT_SYMBOL(call_usermodehelper_setfns);
* asynchronously if wait is not set, and runs as a child of keventd.
* (ie. it runs with full root capabilities).
*/
static
int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
{
DECLARE_COMPLETION_ONSTACK(done);
Expand Down Expand Up @@ -575,7 +576,25 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
helper_unlock();
return retval;
}
EXPORT_SYMBOL(call_usermodehelper_exec);

int call_usermodehelper_fns(
char *path, char **argv, char **envp, int wait,
int (*init)(struct subprocess_info *info, struct cred *new),
void (*cleanup)(struct subprocess_info *), void *data)
{
struct subprocess_info *info;
gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;

info = call_usermodehelper_setup(path, argv, envp, gfp_mask);

if (info == NULL)
return -ENOMEM;

call_usermodehelper_setfns(info, init, cleanup, data);

return call_usermodehelper_exec(info, wait);
}
EXPORT_SYMBOL(call_usermodehelper_fns);

static int proc_cap_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
Expand Down

0 comments on commit 785042f

Please sign in to comment.