diff options
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 16 |
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 | ||
2413 | static int setup_swap_map_and_extents(struct swap_info_struct *p, | 2418 | static 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) |