diff options
| -rw-r--r-- | kernel/power/snapshot.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 2b1a7bc24c91..0a06b114dd33 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -1204,6 +1204,36 @@ static void free_unnecessary_pages(void) | |||
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | /** | 1206 | /** |
| 1207 | * minimum_image_size - Estimate the minimum acceptable size of an image | ||
| 1208 | * @saveable: Number of saveable pages in the system. | ||
| 1209 | * | ||
| 1210 | * We want to avoid attempting to free too much memory too hard, so estimate the | ||
| 1211 | * minimum acceptable size of a hibernation image to use as the lower limit for | ||
| 1212 | * preallocating memory. | ||
| 1213 | * | ||
| 1214 | * We assume that the minimum image size should be proportional to | ||
| 1215 | * | ||
| 1216 | * [number of saveable pages] - [number of pages that can be freed in theory] | ||
| 1217 | * | ||
| 1218 | * where the second term is the sum of (1) reclaimable slab pages, (2) active | ||
| 1219 | * and (3) inactive anonymouns pages, (4) active and (5) inactive file pages, | ||
| 1220 | * minus mapped file pages. | ||
| 1221 | */ | ||
| 1222 | static unsigned long minimum_image_size(unsigned long saveable) | ||
| 1223 | { | ||
| 1224 | unsigned long size; | ||
| 1225 | |||
| 1226 | size = global_page_state(NR_SLAB_RECLAIMABLE) | ||
| 1227 | + global_page_state(NR_ACTIVE_ANON) | ||
| 1228 | + global_page_state(NR_INACTIVE_ANON) | ||
| 1229 | + global_page_state(NR_ACTIVE_FILE) | ||
| 1230 | + global_page_state(NR_INACTIVE_FILE) | ||
| 1231 | - global_page_state(NR_FILE_MAPPED); | ||
| 1232 | |||
| 1233 | return saveable <= size ? 0 : saveable - size; | ||
| 1234 | } | ||
| 1235 | |||
| 1236 | /** | ||
| 1207 | * hibernate_preallocate_memory - Preallocate memory for hibernation image | 1237 | * hibernate_preallocate_memory - Preallocate memory for hibernation image |
| 1208 | * | 1238 | * |
| 1209 | * To create a hibernation image it is necessary to make a copy of every page | 1239 | * To create a hibernation image it is necessary to make a copy of every page |
| @@ -1220,8 +1250,8 @@ static void free_unnecessary_pages(void) | |||
| 1220 | * | 1250 | * |
| 1221 | * If image_size is set below the number following from the above formula, | 1251 | * If image_size is set below the number following from the above formula, |
| 1222 | * the preallocation of memory is continued until the total number of saveable | 1252 | * the preallocation of memory is continued until the total number of saveable |
| 1223 | * pages in the system is below the requested image size or it is impossible to | 1253 | * pages in the system is below the requested image size or the minimum |
| 1224 | * allocate more memory, whichever happens first. | 1254 | * acceptable image size returned by minimum_image_size(), whichever is greater. |
| 1225 | */ | 1255 | */ |
| 1226 | int hibernate_preallocate_memory(void) | 1256 | int hibernate_preallocate_memory(void) |
| 1227 | { | 1257 | { |
| @@ -1282,6 +1312,11 @@ int hibernate_preallocate_memory(void) | |||
| 1282 | goto out; | 1312 | goto out; |
| 1283 | } | 1313 | } |
| 1284 | 1314 | ||
| 1315 | /* Estimate the minimum size of the image. */ | ||
| 1316 | pages = minimum_image_size(saveable); | ||
| 1317 | if (size < pages) | ||
| 1318 | size = min_t(unsigned long, pages, max_size); | ||
| 1319 | |||
| 1285 | /* | 1320 | /* |
| 1286 | * Let the memory management subsystem know that we're going to need a | 1321 | * Let the memory management subsystem know that we're going to need a |
| 1287 | * large number of page frames to allocate and make it free some memory. | 1322 | * large number of page frames to allocate and make it free some memory. |
| @@ -1294,8 +1329,8 @@ int hibernate_preallocate_memory(void) | |||
| 1294 | * The number of saveable pages in memory was too high, so apply some | 1329 | * The number of saveable pages in memory was too high, so apply some |
| 1295 | * pressure to decrease it. First, make room for the largest possible | 1330 | * pressure to decrease it. First, make room for the largest possible |
| 1296 | * image and fail if that doesn't work. Next, try to decrease the size | 1331 | * image and fail if that doesn't work. Next, try to decrease the size |
| 1297 | * of the image as much as indicated by image_size using allocations | 1332 | * of the image as much as indicated by 'size' using allocations from |
| 1298 | * from highmem and non-highmem zones separately. | 1333 | * highmem and non-highmem zones separately. |
| 1299 | */ | 1334 | */ |
| 1300 | pages_highmem = preallocate_image_highmem(highmem / 2); | 1335 | pages_highmem = preallocate_image_highmem(highmem / 2); |
| 1301 | alloc = (count - max_size) - pages_highmem; | 1336 | alloc = (count - max_size) - pages_highmem; |
