Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm: memcontrol: consolidate swap controller code

The swap controller code is scattered all over the file. Gather all
the code that isn't directly needed by the memory controller at the
end of the file in its own CONFIG_MEMCG_SWAP section.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Reviewed-by: Vladimir Davydov <vdavydov@parallels.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Johannes Weiner and committed by
Linus Torvalds
21afa38e 95a045f6

+125 -139
+125 -139
mm/memcontrol.c
··· 72 72 #define MEM_CGROUP_RECLAIM_RETRIES 5 73 73 static struct mem_cgroup *root_mem_cgroup __read_mostly; 74 74 75 + /* Whether the swap controller is active */ 75 76 #ifdef CONFIG_MEMCG_SWAP 76 - /* Turned on only when memory cgroup is enabled && really_do_swap_account = 1 */ 77 77 int do_swap_account __read_mostly; 78 - 79 - /* for remember boot option*/ 80 - #ifdef CONFIG_MEMCG_SWAP_ENABLED 81 - static int really_do_swap_account __initdata = 1; 82 - #else 83 - static int really_do_swap_account __initdata; 84 - #endif 85 - 86 78 #else 87 79 #define do_swap_account 0 88 80 #endif 89 - 90 81 91 82 static const char * const mem_cgroup_stat_names[] = { 92 83 "cache", ··· 4364 4373 { }, /* terminate */ 4365 4374 }; 4366 4375 4367 - #ifdef CONFIG_MEMCG_SWAP 4368 - static struct cftype memsw_cgroup_files[] = { 4369 - { 4370 - .name = "memsw.usage_in_bytes", 4371 - .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE), 4372 - .read_u64 = mem_cgroup_read_u64, 4373 - }, 4374 - { 4375 - .name = "memsw.max_usage_in_bytes", 4376 - .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE), 4377 - .write = mem_cgroup_reset, 4378 - .read_u64 = mem_cgroup_read_u64, 4379 - }, 4380 - { 4381 - .name = "memsw.limit_in_bytes", 4382 - .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT), 4383 - .write = mem_cgroup_write, 4384 - .read_u64 = mem_cgroup_read_u64, 4385 - }, 4386 - { 4387 - .name = "memsw.failcnt", 4388 - .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT), 4389 - .write = mem_cgroup_reset, 4390 - .read_u64 = mem_cgroup_read_u64, 4391 - }, 4392 - { }, /* terminate */ 4393 - }; 4394 - #endif 4395 4376 static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *memcg, int node) 4396 4377 { 4397 4378 struct mem_cgroup_per_node *pn; ··· 5354 5391 .early_init = 0, 5355 5392 }; 5356 5393 5357 - #ifdef CONFIG_MEMCG_SWAP 5358 - static int __init enable_swap_account(char *s) 5359 - { 5360 - if (!strcmp(s, "1")) 5361 - really_do_swap_account = 1; 5362 - else if (!strcmp(s, "0")) 5363 - really_do_swap_account = 0; 5364 - return 1; 5365 - } 5366 - __setup("swapaccount=", enable_swap_account); 5367 - 5368 - static void __init memsw_file_init(void) 5369 - { 5370 - WARN_ON(cgroup_add_legacy_cftypes(&memory_cgrp_subsys, 5371 - memsw_cgroup_files)); 5372 - } 5373 - 5374 - static void __init enable_swap_cgroup(void) 5375 - { 5376 - if (!mem_cgroup_disabled() && really_do_swap_account) { 5377 - do_swap_account = 1; 5378 - memsw_file_init(); 5379 - } 5380 - } 5381 - 5382 - #else 5383 - static void __init enable_swap_cgroup(void) 5384 - { 5385 - } 5386 - #endif 5387 - 5388 5394 /** 5389 5395 * mem_cgroup_events - count memory events against a cgroup 5390 5396 * @memcg: the memory cgroup ··· 5403 5471 } 5404 5472 return true; 5405 5473 } 5406 - 5407 - #ifdef CONFIG_MEMCG_SWAP 5408 - /** 5409 - * mem_cgroup_swapout - transfer a memsw charge to swap 5410 - * @page: page whose memsw charge to transfer 5411 - * @entry: swap entry to move the charge to 5412 - * 5413 - * Transfer the memsw charge of @page to @entry. 5414 - */ 5415 - void mem_cgroup_swapout(struct page *page, swp_entry_t entry) 5416 - { 5417 - struct mem_cgroup *memcg; 5418 - unsigned short oldid; 5419 - 5420 - VM_BUG_ON_PAGE(PageLRU(page), page); 5421 - VM_BUG_ON_PAGE(page_count(page), page); 5422 - 5423 - if (!do_swap_account) 5424 - return; 5425 - 5426 - memcg = page->mem_cgroup; 5427 - 5428 - /* Readahead page, never charged */ 5429 - if (!memcg) 5430 - return; 5431 - 5432 - oldid = swap_cgroup_record(entry, mem_cgroup_id(memcg)); 5433 - VM_BUG_ON_PAGE(oldid, page); 5434 - mem_cgroup_swap_statistics(memcg, true); 5435 - 5436 - page->mem_cgroup = NULL; 5437 - 5438 - if (!mem_cgroup_is_root(memcg)) 5439 - page_counter_uncharge(&memcg->memory, 1); 5440 - 5441 - /* XXX: caller holds IRQ-safe mapping->tree_lock */ 5442 - VM_BUG_ON(!irqs_disabled()); 5443 - 5444 - mem_cgroup_charge_statistics(memcg, page, -1); 5445 - memcg_check_events(memcg, page); 5446 - } 5447 - 5448 - /** 5449 - * mem_cgroup_uncharge_swap - uncharge a swap entry 5450 - * @entry: swap entry to uncharge 5451 - * 5452 - * Drop the memsw charge associated with @entry. 5453 - */ 5454 - void mem_cgroup_uncharge_swap(swp_entry_t entry) 5455 - { 5456 - struct mem_cgroup *memcg; 5457 - unsigned short id; 5458 - 5459 - if (!do_swap_account) 5460 - return; 5461 - 5462 - id = swap_cgroup_record(entry, 0); 5463 - rcu_read_lock(); 5464 - memcg = mem_cgroup_lookup(id); 5465 - if (memcg) { 5466 - if (!mem_cgroup_is_root(memcg)) 5467 - page_counter_uncharge(&memcg->memsw, 1); 5468 - mem_cgroup_swap_statistics(memcg, false); 5469 - css_put(&memcg->css); 5470 - } 5471 - rcu_read_unlock(); 5472 - } 5473 - #endif 5474 5474 5475 5475 /** 5476 5476 * mem_cgroup_try_charge - try charging a page ··· 5761 5897 soft_limit_tree.rb_tree_per_node[node] = rtpn; 5762 5898 } 5763 5899 5764 - enable_swap_cgroup(); 5765 - 5766 5900 return 0; 5767 5901 } 5768 5902 subsys_initcall(mem_cgroup_init); 5903 + 5904 + #ifdef CONFIG_MEMCG_SWAP 5905 + /** 5906 + * mem_cgroup_swapout - transfer a memsw charge to swap 5907 + * @page: page whose memsw charge to transfer 5908 + * @entry: swap entry to move the charge to 5909 + * 5910 + * Transfer the memsw charge of @page to @entry. 5911 + */ 5912 + void mem_cgroup_swapout(struct page *page, swp_entry_t entry) 5913 + { 5914 + struct mem_cgroup *memcg; 5915 + unsigned short oldid; 5916 + 5917 + VM_BUG_ON_PAGE(PageLRU(page), page); 5918 + VM_BUG_ON_PAGE(page_count(page), page); 5919 + 5920 + if (!do_swap_account) 5921 + return; 5922 + 5923 + memcg = page->mem_cgroup; 5924 + 5925 + /* Readahead page, never charged */ 5926 + if (!memcg) 5927 + return; 5928 + 5929 + oldid = swap_cgroup_record(entry, mem_cgroup_id(memcg)); 5930 + VM_BUG_ON_PAGE(oldid, page); 5931 + mem_cgroup_swap_statistics(memcg, true); 5932 + 5933 + page->mem_cgroup = NULL; 5934 + 5935 + if (!mem_cgroup_is_root(memcg)) 5936 + page_counter_uncharge(&memcg->memory, 1); 5937 + 5938 + /* XXX: caller holds IRQ-safe mapping->tree_lock */ 5939 + VM_BUG_ON(!irqs_disabled()); 5940 + 5941 + mem_cgroup_charge_statistics(memcg, page, -1); 5942 + memcg_check_events(memcg, page); 5943 + } 5944 + 5945 + /** 5946 + * mem_cgroup_uncharge_swap - uncharge a swap entry 5947 + * @entry: swap entry to uncharge 5948 + * 5949 + * Drop the memsw charge associated with @entry. 5950 + */ 5951 + void mem_cgroup_uncharge_swap(swp_entry_t entry) 5952 + { 5953 + struct mem_cgroup *memcg; 5954 + unsigned short id; 5955 + 5956 + if (!do_swap_account) 5957 + return; 5958 + 5959 + id = swap_cgroup_record(entry, 0); 5960 + rcu_read_lock(); 5961 + memcg = mem_cgroup_lookup(id); 5962 + if (memcg) { 5963 + if (!mem_cgroup_is_root(memcg)) 5964 + page_counter_uncharge(&memcg->memsw, 1); 5965 + mem_cgroup_swap_statistics(memcg, false); 5966 + css_put(&memcg->css); 5967 + } 5968 + rcu_read_unlock(); 5969 + } 5970 + 5971 + /* for remember boot option*/ 5972 + #ifdef CONFIG_MEMCG_SWAP_ENABLED 5973 + static int really_do_swap_account __initdata = 1; 5974 + #else 5975 + static int really_do_swap_account __initdata; 5976 + #endif 5977 + 5978 + static int __init enable_swap_account(char *s) 5979 + { 5980 + if (!strcmp(s, "1")) 5981 + really_do_swap_account = 1; 5982 + else if (!strcmp(s, "0")) 5983 + really_do_swap_account = 0; 5984 + return 1; 5985 + } 5986 + __setup("swapaccount=", enable_swap_account); 5987 + 5988 + static struct cftype memsw_cgroup_files[] = { 5989 + { 5990 + .name = "memsw.usage_in_bytes", 5991 + .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE), 5992 + .read_u64 = mem_cgroup_read_u64, 5993 + }, 5994 + { 5995 + .name = "memsw.max_usage_in_bytes", 5996 + .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE), 5997 + .write = mem_cgroup_reset, 5998 + .read_u64 = mem_cgroup_read_u64, 5999 + }, 6000 + { 6001 + .name = "memsw.limit_in_bytes", 6002 + .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT), 6003 + .write = mem_cgroup_write, 6004 + .read_u64 = mem_cgroup_read_u64, 6005 + }, 6006 + { 6007 + .name = "memsw.failcnt", 6008 + .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT), 6009 + .write = mem_cgroup_reset, 6010 + .read_u64 = mem_cgroup_read_u64, 6011 + }, 6012 + { }, /* terminate */ 6013 + }; 6014 + 6015 + static int __init mem_cgroup_swap_init(void) 6016 + { 6017 + if (!mem_cgroup_disabled() && really_do_swap_account) { 6018 + do_swap_account = 1; 6019 + WARN_ON(cgroup_add_legacy_cftypes(&memory_cgrp_subsys, 6020 + memsw_cgroup_files)); 6021 + } 6022 + return 0; 6023 + } 6024 + subsys_initcall(mem_cgroup_swap_init); 6025 + 6026 + #endif /* CONFIG_MEMCG_SWAP */