summaryrefslogtreecommitdiffstats
path: root/mm/swapfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r--mm/swapfile.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c
index eb71b5d9430b..66e95eb73040 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -2084,6 +2084,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
2084 vfree(frontswap_map); 2084 vfree(frontswap_map);
2085 /* Destroy swap account information */ 2085 /* Destroy swap account information */
2086 swap_cgroup_swapoff(p->type); 2086 swap_cgroup_swapoff(p->type);
2087 exit_swap_address_space(p->type);
2087 2088
2088 inode = mapping->host; 2089 inode = mapping->host;
2089 if (S_ISBLK(inode->i_mode)) { 2090 if (S_ISBLK(inode->i_mode)) {
@@ -2407,8 +2408,12 @@ static unsigned long read_swap_header(struct swap_info_struct *p,
2407 return maxpages; 2408 return maxpages;
2408} 2409}
2409 2410
2410#define SWAP_CLUSTER_COLS \ 2411#define SWAP_CLUSTER_INFO_COLS \
2411 DIV_ROUND_UP(L1_CACHE_BYTES, sizeof(struct swap_cluster_info)) 2412 DIV_ROUND_UP(L1_CACHE_BYTES, sizeof(struct swap_cluster_info))
2413#define SWAP_CLUSTER_SPACE_COLS \
2414 DIV_ROUND_UP(SWAP_ADDRESS_SPACE_PAGES, SWAPFILE_CLUSTER)
2415#define SWAP_CLUSTER_COLS \
2416 max_t(unsigned int, SWAP_CLUSTER_INFO_COLS, SWAP_CLUSTER_SPACE_COLS)
2412 2417
2413static int setup_swap_map_and_extents(struct swap_info_struct *p, 2418static int setup_swap_map_and_extents(struct swap_info_struct *p,
2414 union swap_header *swap_header, 2419 union swap_header *swap_header,
@@ -2471,7 +2476,10 @@ static int setup_swap_map_and_extents(struct swap_info_struct *p,
2471 return nr_extents; 2476 return nr_extents;
2472 2477
2473 2478
2474 /* Reduce false cache line sharing between cluster_info */ 2479 /*
2480 * Reduce false cache line sharing between cluster_info and
2481 * sharing same address space.
2482 */
2475 for (k = 0; k < SWAP_CLUSTER_COLS; k++) { 2483 for (k = 0; k < SWAP_CLUSTER_COLS; k++) {
2476 j = (k + col) % SWAP_CLUSTER_COLS; 2484 j = (k + col) % SWAP_CLUSTER_COLS;
2477 for (i = 0; i < DIV_ROUND_UP(nr_clusters, SWAP_CLUSTER_COLS); i++) { 2485 for (i = 0; i < DIV_ROUND_UP(nr_clusters, SWAP_CLUSTER_COLS); i++) {
@@ -2661,6 +2669,10 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
2661 } 2669 }
2662 } 2670 }
2663 2671
2672 error = init_swap_address_space(p->type, maxpages);
2673 if (error)
2674 goto bad_swap;
2675
2664 mutex_lock(&swapon_mutex); 2676 mutex_lock(&swapon_mutex);
2665 prio = -1; 2677 prio = -1;
2666 if (swap_flags & SWAP_FLAG_PREFER) 2678 if (swap_flags & SWAP_FLAG_PREFER)