mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
52383431b3
Currently to allocate a page that should be charged to kmemcg (e.g. threadinfo), we pass __GFP_KMEMCG flag to the page allocator. The page allocated is then to be freed by free_memcg_kmem_pages. Apart from looking asymmetrical, this also requires intrusion to the general allocation path. So let's introduce separate functions that will alloc/free pages charged to kmemcg. The new functions are called alloc_kmem_pages and free_kmem_pages. They should be used when the caller actually would like to use kmalloc, but has to fall back to the page allocator for the allocation is large. They only differ from alloc_pages and free_pages in that besides allocating or freeing pages they also charge them to the kmem resource counter of the current memory cgroup. [sfr@canb.auug.org.au: export kmalloc_order() to modules] Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Acked-by: Greg Thelen <gthelen@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.cz> Cc: Glauber Costa <glommer@gmail.com> Cc: Christoph Lameter <cl@linux-foundation.org> Cc: Pekka Enberg <penberg@kernel.org> Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
43 lines
1.7 KiB
C
43 lines
1.7 KiB
C
/*
|
|
* The order of these masks is important. Matching masks will be seen
|
|
* first and the left over flags will end up showing by themselves.
|
|
*
|
|
* For example, if we have GFP_KERNEL before GFP_USER we wil get:
|
|
*
|
|
* GFP_KERNEL|GFP_HARDWALL
|
|
*
|
|
* Thus most bits set go first.
|
|
*/
|
|
#define show_gfp_flags(flags) \
|
|
(flags) ? __print_flags(flags, "|", \
|
|
{(unsigned long)GFP_TRANSHUGE, "GFP_TRANSHUGE"}, \
|
|
{(unsigned long)GFP_HIGHUSER_MOVABLE, "GFP_HIGHUSER_MOVABLE"}, \
|
|
{(unsigned long)GFP_HIGHUSER, "GFP_HIGHUSER"}, \
|
|
{(unsigned long)GFP_USER, "GFP_USER"}, \
|
|
{(unsigned long)GFP_TEMPORARY, "GFP_TEMPORARY"}, \
|
|
{(unsigned long)GFP_KERNEL, "GFP_KERNEL"}, \
|
|
{(unsigned long)GFP_NOFS, "GFP_NOFS"}, \
|
|
{(unsigned long)GFP_ATOMIC, "GFP_ATOMIC"}, \
|
|
{(unsigned long)GFP_NOIO, "GFP_NOIO"}, \
|
|
{(unsigned long)__GFP_HIGH, "GFP_HIGH"}, \
|
|
{(unsigned long)__GFP_WAIT, "GFP_WAIT"}, \
|
|
{(unsigned long)__GFP_IO, "GFP_IO"}, \
|
|
{(unsigned long)__GFP_COLD, "GFP_COLD"}, \
|
|
{(unsigned long)__GFP_NOWARN, "GFP_NOWARN"}, \
|
|
{(unsigned long)__GFP_REPEAT, "GFP_REPEAT"}, \
|
|
{(unsigned long)__GFP_NOFAIL, "GFP_NOFAIL"}, \
|
|
{(unsigned long)__GFP_NORETRY, "GFP_NORETRY"}, \
|
|
{(unsigned long)__GFP_COMP, "GFP_COMP"}, \
|
|
{(unsigned long)__GFP_ZERO, "GFP_ZERO"}, \
|
|
{(unsigned long)__GFP_NOMEMALLOC, "GFP_NOMEMALLOC"}, \
|
|
{(unsigned long)__GFP_MEMALLOC, "GFP_MEMALLOC"}, \
|
|
{(unsigned long)__GFP_HARDWALL, "GFP_HARDWALL"}, \
|
|
{(unsigned long)__GFP_THISNODE, "GFP_THISNODE"}, \
|
|
{(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \
|
|
{(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"}, \
|
|
{(unsigned long)__GFP_NOTRACK, "GFP_NOTRACK"}, \
|
|
{(unsigned long)__GFP_NO_KSWAPD, "GFP_NO_KSWAPD"}, \
|
|
{(unsigned long)__GFP_OTHER_NODE, "GFP_OTHER_NODE"} \
|
|
) : "GFP_NOWAIT"
|
|
|