aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/swap.h1
-rw-r--r--mm/swapfile.c11
2 files changed, 10 insertions, 2 deletions
diff --git a/include/linux/swap.h b/include/linux/swap.h
index fe79f44c858e..cbf7fbed3dfd 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -122,6 +122,7 @@ enum {
122 SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ 122 SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */
123 SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */ 123 SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */
124 SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ 124 SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */
125 SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */
125 /* add others here before... */ 126 /* add others here before... */
126 SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */ 127 SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */
127}; 128};
diff --git a/mm/swapfile.c b/mm/swapfile.c
index ca75b9e7c09f..b0f56603b9be 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -16,6 +16,7 @@
16#include <linux/namei.h> 16#include <linux/namei.h>
17#include <linux/shm.h> 17#include <linux/shm.h>
18#include <linux/blkdev.h> 18#include <linux/blkdev.h>
19#include <linux/random.h>
19#include <linux/writeback.h> 20#include <linux/writeback.h>
20#include <linux/proc_fs.h> 21#include <linux/proc_fs.h>
21#include <linux/seq_file.h> 22#include <linux/seq_file.h>
@@ -1806,6 +1807,11 @@ asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags)
1806 goto bad_swap; 1807 goto bad_swap;
1807 } 1808 }
1808 1809
1810 if (blk_queue_nonrot(bdev_get_queue(p->bdev))) {
1811 p->flags |= SWP_SOLIDSTATE;
1812 srandom32((u32)get_seconds());
1813 p->cluster_next = 1 + (random32() % p->highest_bit);
1814 }
1809 if (discard_swap(p) == 0) 1815 if (discard_swap(p) == 0)
1810 p->flags |= SWP_DISCARDABLE; 1816 p->flags |= SWP_DISCARDABLE;
1811 1817
@@ -1822,10 +1828,11 @@ asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags)
1822 total_swap_pages += nr_good_pages; 1828 total_swap_pages += nr_good_pages;
1823 1829
1824 printk(KERN_INFO "Adding %uk swap on %s. " 1830 printk(KERN_INFO "Adding %uk swap on %s. "
1825 "Priority:%d extents:%d across:%lluk%s\n", 1831 "Priority:%d extents:%d across:%lluk %s%s\n",
1826 nr_good_pages<<(PAGE_SHIFT-10), name, p->prio, 1832 nr_good_pages<<(PAGE_SHIFT-10), name, p->prio,
1827 nr_extents, (unsigned long long)span<<(PAGE_SHIFT-10), 1833 nr_extents, (unsigned long long)span<<(PAGE_SHIFT-10),
1828 (p->flags & SWP_DISCARDABLE) ? " D" : ""); 1834 (p->flags & SWP_SOLIDSTATE) ? "SS" : "",
1835 (p->flags & SWP_DISCARDABLE) ? "D" : "");
1829 1836
1830 /* insert swap space into swap_list: */ 1837 /* insert swap space into swap_list: */
1831 prev = -1; 1838 prev = -1;