[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    swapon: implementing discard option.
From:       Andy Lee <androidkslee () gmail ! com>
Date:       2012-05-23 1:02:59
Message-ID: CAOcf3K+KNB5xrdVdhxg2-RZt8qANtBpWVHy4JWsDemPsBzZ5vA () mail ! gmail ! com
[Download RAW message or body]

Hi,

This makes swapon to use discard option.
Enable support for discarding freed pages before they are reused.

Cheers,
Andy

---
 util-linux/Config.src  |    7 +++++++
 util-linux/swaponoff.c |   41 +++++++++++++++++++++++++++++++++--------
 2 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/util-linux/Config.src b/util-linux/Config.src
index 57a52ce..84652eb 100644
--- a/util-linux/Config.src
+++ b/util-linux/Config.src
@@ -606,6 +606,13 @@ config FEATURE_SWAPON_PRI
 	help
 	  Enable support for setting swap device priority in swapon.

+config FEATURE_SWAPON_DISCARD
+	bool "Support discard option -d"
+	default y
+	depends on SWAPONOFF
+	help
+	  Enable support for discarding freed pages before they are reused.
+
 config SWITCH_ROOT
 	bool "switch_root"
 	default y
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
index 54867ec..d911b31 100644
--- a/util-linux/swaponoff.c
+++ b/util-linux/swaponoff.c
@@ -8,10 +8,13 @@
  */

 //usage:#define swapon_trivial_usage
-//usage:       "[-a]" IF_FEATURE_SWAPON_PRI(" [-p PRI]") " [DEVICE]"
+//usage:       "[-a]" IF_FEATURE_SWAPON_DISCARD(" [-d]")
IF_FEATURE_SWAPON_PRI(" [-p PRI]") " [DEVICE]"
 //usage:#define swapon_full_usage "\n\n"
 //usage:       "Start swapping on DEVICE\n"
 //usage:     "\n	-a	Start swapping on all swap devices"
+//usage:	IF_FEATURE_SWAPON_DISCARD(
+//usage:     "\n	-d	Discard freed pages before they are used"
+//usage:	)
 //usage:	IF_FEATURE_SWAPON_PRI(
 //usage:     "\n	-p PRI	Set swap device priority"
 //usage:	)
@@ -28,6 +31,17 @@
 # include <sys/swap.h>
 #endif

+#if ENABLE_FEATURE_SWAPON_DISCARD
+#ifndef SWAP_FLAG_DISCARD
+#define SWAP_FLAG_DISCARD   0x10000 /* discard swap cluster after use */
+#endif
+#if ENABLE_FEATURE_SWAPON_PRI
+#define OPT_DISCARD (1 << 2)
+#else
+#define OPT_DISCARD (1 << 1)
+#endif
+#endif
+
 #if ENABLE_FEATURE_MOUNT_LABEL
 # include "volume_id.h"
 #else
@@ -38,7 +52,7 @@
 # define MNTTYPE_SWAP "swap"
 #endif

-#if ENABLE_FEATURE_SWAPON_PRI
+#if ENABLE_FEATURE_SWAPON_PRI || ENABLE_FEATURE_SWAPON_DISCARD
 struct globals {
 	int flags;
 } FIX_ALIASING;
@@ -113,28 +127,39 @@ int swap_on_off_main(int argc UNUSED_PARAM, char **argv)

 	INIT_G();

-#if !ENABLE_FEATURE_SWAPON_PRI
+#if !ENABLE_FEATURE_SWAPON_PRI && !ENABLE_FEATURE_SWAPON_DISCARD
 	ret = getopt32(argv, "a");
 #else
+#if ENABLE_FEATURE_SWAPON_PRI
 	if (applet_name[5] == 'n')
 		opt_complementary = "p+";
-	ret = getopt32(argv, (applet_name[5] == 'n') ? "ap:" : "a", &g_flags);
+#endif
+	ret = getopt32(argv, (applet_name[5] == 'n') ?
+			"a" IF_FEATURE_SWAPON_PRI("p:") IF_FEATURE_SWAPON_DISCARD("d") :
+			"a", &g_flags);

+#if ENABLE_FEATURE_SWAPON_PRI
 	if (ret & 2) { // -p
-		g_flags = SWAP_FLAG_PREFER |
+		g_flags |= SWAP_FLAG_PREFER |
 			((g_flags & SWAP_FLAG_PRIO_MASK) << SWAP_FLAG_PRIO_SHIFT);
-		ret &= 1;
 	}
 #endif

-	if (ret /* & 1: not needed */) // -a
+#if ENABLE_FEATURE_SWAPON_DISCARD
+	if (ret & OPT_DISCARD) { // -d
+		g_flags |= SWAP_FLAG_DISCARD;
+	}
+#endif
+#endif //!ENABLE_FEATURE_SWAPON_PRI && !ENABLE_FEATURE_SWAPON_DISCARD
+
+	if (ret & 1) // -a
 		return do_em_all();

 	argv += optind;
 	if (!*argv)
 		bb_show_usage();

-	/* ret = 0; redundant */
+	ret = 0;
 	do {
 		ret += swap_enable_disable(*argv);
 	} while (*++argv);
-- 
1.7.0.4
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic