diff options
Diffstat (limited to 'mm/util.c')
-rw-r--r-- | mm/util.c | 36 |
1 files changed, 34 insertions, 2 deletions
@@ -404,13 +404,45 @@ struct address_space *page_mapping(struct page *page) | |||
404 | return mapping; | 404 | return mapping; |
405 | } | 405 | } |
406 | 406 | ||
407 | int overcommit_ratio_handler(struct ctl_table *table, int write, | ||
408 | void __user *buffer, size_t *lenp, | ||
409 | loff_t *ppos) | ||
410 | { | ||
411 | int ret; | ||
412 | |||
413 | ret = proc_dointvec(table, write, buffer, lenp, ppos); | ||
414 | if (ret == 0 && write) | ||
415 | sysctl_overcommit_kbytes = 0; | ||
416 | return ret; | ||
417 | } | ||
418 | |||
419 | int overcommit_kbytes_handler(struct ctl_table *table, int write, | ||
420 | void __user *buffer, size_t *lenp, | ||
421 | loff_t *ppos) | ||
422 | { | ||
423 | int ret; | ||
424 | |||
425 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); | ||
426 | if (ret == 0 && write) | ||
427 | sysctl_overcommit_ratio = 0; | ||
428 | return ret; | ||
429 | } | ||
430 | |||
407 | /* | 431 | /* |
408 | * Committed memory limit enforced when OVERCOMMIT_NEVER policy is used | 432 | * Committed memory limit enforced when OVERCOMMIT_NEVER policy is used |
409 | */ | 433 | */ |
410 | unsigned long vm_commit_limit(void) | 434 | unsigned long vm_commit_limit(void) |
411 | { | 435 | { |
412 | return ((totalram_pages - hugetlb_total_pages()) | 436 | unsigned long allowed; |
413 | * sysctl_overcommit_ratio / 100) + total_swap_pages; | 437 | |
438 | if (sysctl_overcommit_kbytes) | ||
439 | allowed = sysctl_overcommit_kbytes >> (PAGE_SHIFT - 10); | ||
440 | else | ||
441 | allowed = ((totalram_pages - hugetlb_total_pages()) | ||
442 | * sysctl_overcommit_ratio / 100); | ||
443 | allowed += total_swap_pages; | ||
444 | |||
445 | return allowed; | ||
414 | } | 446 | } |
415 | 447 | ||
416 | 448 | ||