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
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to