aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorExplorer09 <explorer09@gmail.com>2017-01-09 15:04:43 +0800
committerDenys Vlasenko <vda.linux@googlemail.com>2017-01-09 09:31:17 +0100
commit80172e46221222f26680f3b9caf7637383205e7a (patch)
tree73e65bf0435b0780e67d8227aa40c9fd1757fd45
parentb130f9f758b6404c6d0911a1c120937ae6ab47f8 (diff)
downloadbusybox-w32-80172e46221222f26680f3b9caf7637383205e7a.tar.gz
busybox-w32-80172e46221222f26680f3b9caf7637383205e7a.tar.bz2
busybox-w32-80172e46221222f26680f3b9caf7637383205e7a.zip
modprobe-small: optimizations for single applet build
(I'm requesting for a review first because I fear such an aggressive change could lead to bugs. While I observe the sizes have reduced, I haven't test the functionality of each applet after that. So please test before merging.) Aggressively cut off unneeded code when the relevant applets are not built. Correct dependencies of FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE and FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED. Don't bother with the '-r' option check if only rmmod is built (assume true then), or when neither rmmod or mobprobe is built (assume false then). Size comparison before and after the change (single applet configuration): text data bss dec hex filename 34778 946 112 35836 8bfc old/busybox_DEPMOD 34151 946 112 35209 8989 new/busybox_DEPMOD 34903 946 112 35961 8c79 old/busybox_INSMOD 28316 778 112 29206 7216 new/busybox_INSMOD 35228 962 112 36302 8dce old/busybox_LSMOD 5011 706 40 5757 167d new/busybox_LSMOD 34830 946 112 35888 8c30 old/busybox_MODPROBE 34795 946 112 35853 8c0d new/busybox_MODPROBE 34718 946 112 35776 8bc0 old/busybox_RMMOD 7502 714 104 8320 2080 new/busybox_RMMOD Signed-off-by: Kang-Che Sung <explorer09@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--modutils/modprobe-small.c72
1 files changed, 39 insertions, 33 deletions
diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c
index 0fc9ea454..12e09938a 100644
--- a/modutils/modprobe-small.c
+++ b/modutils/modprobe-small.c
@@ -13,15 +13,14 @@
13//config:config FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE 13//config:config FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE
14//config: bool "Accept module options on modprobe command line" 14//config: bool "Accept module options on modprobe command line"
15//config: default y 15//config: default y
16//config: depends on MODPROBE_SMALL 16//config: depends on MODPROBE_SMALL && (INSMOD || MODPROBE)
17//config: select PLATFORM_LINUX
18//config: help 17//config: help
19//config: Allow insmod and modprobe take module options from command line. 18//config: Allow insmod and modprobe take module options from command line.
20//config: 19//config:
21//config:config FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED 20//config:config FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED
22//config: bool "Skip loading of already loaded modules" 21//config: bool "Skip loading of already loaded modules"
23//config: default y 22//config: default y
24//config: depends on MODPROBE_SMALL 23//config: depends on MODPROBE_SMALL && (DEPMOD || INSMOD || MODPROBE)
25//config: help 24//config: help
26//config: Check if the module is already loaded. 25//config: Check if the module is already loaded.
27 26
@@ -59,6 +58,14 @@
59 58
60#define DEPFILE_BB CONFIG_DEFAULT_DEPMOD_FILE".bb" 59#define DEPFILE_BB CONFIG_DEFAULT_DEPMOD_FILE".bb"
61 60
61#define ONLY_APPLET (ENABLE_MODPROBE + ENABLE_DEPMOD + ENABLE_INSMOD \
62 + ENABLE_LSMOD + ENABLE_RMMOD <= 1)
63#define is_modprobe (ENABLE_MODPROBE && (ONLY_APPLET || applet_name[0] == 'm'))
64#define is_depmod (ENABLE_DEPMOD && (ONLY_APPLET || applet_name[0] == 'd'))
65#define is_insmod (ENABLE_INSMOD && (ONLY_APPLET || applet_name[0] == 'i'))
66#define is_lsmod (ENABLE_LSMOD && (ONLY_APPLET || applet_name[0] == 'l'))
67#define is_rmmod (ENABLE_RMMOD && (ONLY_APPLET || applet_name[0] == 'r'))
68
62enum { 69enum {
63 OPT_q = (1 << 0), /* be quiet */ 70 OPT_q = (1 << 0), /* be quiet */
64 OPT_r = (1 << 1), /* module removal instead of loading */ 71 OPT_r = (1 << 1), /* module removal instead of loading */
@@ -361,6 +368,8 @@ static FAST_FUNC int fileAction(const char *pathname,
361{ 368{
362 int cur; 369 int cur;
363 const char *fname; 370 const char *fname;
371 bool is_remove = (ENABLE_RMMOD && ONLY_APPLET)
372 || ((ENABLE_RMMOD || ENABLE_MODPROBE) && (option_mask32 & OPT_r));
364 373
365 pathname += 2; /* skip "./" */ 374 pathname += 2; /* skip "./" */
366 fname = bb_get_last_path_component_nostrip(pathname); 375 fname = bb_get_last_path_component_nostrip(pathname);
@@ -385,7 +394,7 @@ static FAST_FUNC int fileAction(const char *pathname,
385 if (parse_module(&modinfo[cur], pathname) != 0) 394 if (parse_module(&modinfo[cur], pathname) != 0)
386 return TRUE; /* failed to open/read it, no point in trying loading */ 395 return TRUE; /* failed to open/read it, no point in trying loading */
387 396
388 if (!(option_mask32 & OPT_r)) { 397 if (!is_remove) {
389 if (load_module(pathname, module_load_options) == 0) { 398 if (load_module(pathname, module_load_options) == 0) {
390 /* Load was successful, there is nothing else to do. 399 /* Load was successful, there is nothing else to do.
391 * This can happen ONLY for "top-level" module load, 400 * This can happen ONLY for "top-level" module load,
@@ -666,7 +675,8 @@ static int process_module(char *name, const char *cmdline_options)
666 module_info **infovec; 675 module_info **infovec;
667 module_info *info; 676 module_info *info;
668 int infoidx; 677 int infoidx;
669 int is_remove = (option_mask32 & OPT_r) != 0; 678 bool is_remove = (ENABLE_RMMOD && ONLY_APPLET)
679 || ((ENABLE_RMMOD || ENABLE_MODPROBE) && (option_mask32 & OPT_r));
670 int exitcode = EXIT_SUCCESS; 680 int exitcode = EXIT_SUCCESS;
671 681
672 dbg1_error_msg("process_module('%s','%s')", name, cmdline_options); 682 dbg1_error_msg("process_module('%s','%s')", name, cmdline_options);
@@ -675,9 +685,8 @@ static int process_module(char *name, const char *cmdline_options)
675 685
676 dbg1_error_msg("already_loaded:%d is_remove:%d", already_loaded(name), is_remove); 686 dbg1_error_msg("already_loaded:%d is_remove:%d", already_loaded(name), is_remove);
677 687
678 if (applet_name[0] == 'r') { 688 if (is_rmmod) {
679 /* rmmod. 689 /* Does not remove dependencies, no need to scan, just remove.
680 * Does not remove dependencies, no need to scan, just remove.
681 * (compat note: this allows and strips .ko suffix) 690 * (compat note: this allows and strips .ko suffix)
682 */ 691 */
683 rmmod(name); 692 rmmod(name);
@@ -743,7 +752,7 @@ static int process_module(char *name, const char *cmdline_options)
743 752
744 if (!infovec) { 753 if (!infovec) {
745 /* both dirscan and find_alias found nothing */ 754 /* both dirscan and find_alias found nothing */
746 if (!is_remove && applet_name[0] != 'd') /* it wasn't rmmod or depmod */ 755 if (!is_remove && !is_depmod) /* it wasn't rmmod or depmod */
747 bb_error_msg("module '%s' not found", name); 756 bb_error_msg("module '%s' not found", name);
748//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline? 757//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline?
749 goto ret; 758 goto ret;
@@ -926,11 +935,10 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
926{ 935{
927 int exitcode; 936 int exitcode;
928 struct utsname uts; 937 struct utsname uts;
929 char applet0 = applet_name[0]; 938 IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(char *options = NULL;)
930 IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(char *options;)
931 939
932 /* are we lsmod? -> just dump /proc/modules */ 940 /* are we lsmod? -> just dump /proc/modules */
933 if (ENABLE_LSMOD && 'l' == applet0) { 941 if (is_lsmod) {
934 xprint_and_close_file(xfopen_for_read("/proc/modules")); 942 xprint_and_close_file(xfopen_for_read("/proc/modules"));
935 return EXIT_SUCCESS; 943 return EXIT_SUCCESS;
936 } 944 }
@@ -940,14 +948,13 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
940 /* Prevent ugly corner cases with no modules at all */ 948 /* Prevent ugly corner cases with no modules at all */
941 modinfo = xzalloc(sizeof(modinfo[0])); 949 modinfo = xzalloc(sizeof(modinfo[0]));
942 950
943 if (!ENABLE_INSMOD || 'i' != applet0) { /* not insmod */ 951 if (!is_insmod) {
944 /* Goto modules directory */ 952 /* Goto modules directory */
945 xchdir(CONFIG_DEFAULT_MODULES_DIR); 953 xchdir(CONFIG_DEFAULT_MODULES_DIR);
946 } 954 }
947 uname(&uts); /* never fails */ 955 uname(&uts); /* never fails */
948 956
949 /* depmod? */ 957 if (is_depmod) {
950 if (ENABLE_DEPMOD && 'd' == applet0) {
951 /* Supported: 958 /* Supported:
952 * -n: print result to stdout 959 * -n: print result to stdout
953 * -a: process all modules (default) 960 * -a: process all modules (default)
@@ -978,28 +985,28 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
978 return !wrote_dep_bb_ok; 985 return !wrote_dep_bb_ok;
979 } 986 }
980 987
981 /* insmod, modprobe, rmmod require at least one argument */ 988#if ENABLE_MODPROBE || ENABLE_INSMOD || ENABLE_RMMOD
989 /* modprobe, insmod, rmmod require at least one argument */
982 opt_complementary = "-1"; 990 opt_complementary = "-1";
983 /* only -q (quiet) and -r (rmmod), 991 /* only -q (quiet) and -r (rmmod),
984 * the rest are accepted and ignored (compat) */ 992 * the rest are accepted and ignored (compat) */
985 getopt32(argv, "qrfsvwb"); 993 getopt32(argv, "qrfsvwb");
986 argv += optind; 994 argv += optind;
987 995
988 /* are we rmmod? -> simulate modprobe -r */ 996 if (!is_insmod) {
989 if (ENABLE_RMMOD && 'r' == applet0) {
990 option_mask32 |= OPT_r;
991 }
992
993 if (!ENABLE_INSMOD || 'i' != applet0) { /* not insmod */
994 /* Goto $VERSION directory */ 997 /* Goto $VERSION directory */
995 xchdir(uts.release); 998 xchdir(uts.release);
996 } 999 }
997 1000
998#if ENABLE_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE 1001 /* are we rmmod? -> simulate modprobe -r, but don't bother the flag if
1002 * there're no other applets here */
1003 if (is_rmmod) {
1004 if (!ONLY_APPLET)
1005 option_mask32 |= OPT_r;
1006 } else if (!ENABLE_MODPROBE || !(option_mask32 & OPT_r)) {
1007# if ENABLE_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE
999 /* If not rmmod/-r, parse possible module options given on command line. 1008 /* If not rmmod/-r, parse possible module options given on command line.
1000 * insmod/modprobe takes one module name, the rest are parameters. */ 1009 * insmod/modprobe takes one module name, the rest are parameters. */
1001 options = NULL;
1002 if (!(option_mask32 & OPT_r)) {
1003 char **arg = argv; 1010 char **arg = argv;
1004 while (*++arg) { 1011 while (*++arg) {
1005 /* Enclose options in quotes */ 1012 /* Enclose options in quotes */
@@ -1008,13 +1015,12 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
1008 free(s); 1015 free(s);
1009 *arg = NULL; 1016 *arg = NULL;
1010 } 1017 }
1011 } 1018# else
1012#else
1013 if (!(option_mask32 & OPT_r))
1014 argv[1] = NULL; 1019 argv[1] = NULL;
1015#endif 1020# endif
1021 }
1016 1022
1017 if (ENABLE_INSMOD && 'i' == applet0) { /* insmod */ 1023 if (is_insmod) {
1018 size_t len; 1024 size_t len;
1019 void *map; 1025 void *map;
1020 1026
@@ -1023,8 +1029,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
1023 if (!map) 1029 if (!map)
1024 bb_perror_msg_and_die("can't read '%s'", *argv); 1030 bb_perror_msg_and_die("can't read '%s'", *argv);
1025 if (init_module(map, len, 1031 if (init_module(map, len,
1026 IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(options ? options : "") 1032 (IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(options ? options : ) "")
1027 IF_NOT_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE("")
1028 ) != 0 1033 ) != 0
1029 ) { 1034 ) {
1030 bb_error_msg_and_die("can't insert '%s': %s", 1035 bb_error_msg_and_die("can't insert '%s': %s",
@@ -1034,7 +1039,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
1034 } 1039 }
1035 1040
1036 /* Try to load modprobe.dep.bb */ 1041 /* Try to load modprobe.dep.bb */
1037 if (!ENABLE_RMMOD || 'r' != applet0) { /* not rmmod */ 1042 if (!is_rmmod) {
1038 load_dep_bb(); 1043 load_dep_bb();
1039 } 1044 }
1040 1045
@@ -1049,4 +1054,5 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
1049 IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(free(options);) 1054 IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(free(options);)
1050 } 1055 }
1051 return exitcode; 1056 return exitcode;
1057#endif /* MODPROBE || INSMOD || RMMOD */
1052} 1058}