mm: polish virtual memory accounting
* add VM_STACK as alias for VM_GROWSUP/DOWN depending on architecture * always account VMAs with flag VM_STACK as stack (as it was before) * cleanup classifying helpers * update comments and documentation Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com> Tested-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
d977d56ce5
commit
30bdbb7800
@@ -240,8 +240,8 @@ Table 1-2: Contents of the status files (as of 4.1)
|
|||||||
RssFile size of resident file mappings
|
RssFile size of resident file mappings
|
||||||
RssShmem size of resident shmem memory (includes SysV shm,
|
RssShmem size of resident shmem memory (includes SysV shm,
|
||||||
mapping of tmpfs and shared anonymous mappings)
|
mapping of tmpfs and shared anonymous mappings)
|
||||||
VmData size of data, stack, and text segments
|
VmData size of private data segments
|
||||||
VmStk size of data, stack, and text segments
|
VmStk size of stack segments
|
||||||
VmExe size of text segment
|
VmExe size of text segment
|
||||||
VmLib size of shared library code
|
VmLib size of shared library code
|
||||||
VmPTE size of page table entries
|
VmPTE size of page table entries
|
||||||
|
|||||||
@@ -201,11 +201,13 @@ extern unsigned int kobjsize(const void *objp);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_GROWSUP
|
#ifdef CONFIG_STACK_GROWSUP
|
||||||
#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
|
#define VM_STACK VM_GROWSUP
|
||||||
#else
|
#else
|
||||||
#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
|
#define VM_STACK VM_GROWSDOWN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define VM_STACK_FLAGS (VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special vmas that are non-mergable, non-mlock()able.
|
* Special vmas that are non-mergable, non-mlock()able.
|
||||||
* Note: mm/huge_memory.c VM_NO_THP depends on this definition.
|
* Note: mm/huge_memory.c VM_NO_THP depends on this definition.
|
||||||
|
|||||||
@@ -424,9 +424,9 @@ struct mm_struct {
|
|||||||
unsigned long total_vm; /* Total pages mapped */
|
unsigned long total_vm; /* Total pages mapped */
|
||||||
unsigned long locked_vm; /* Pages that have PG_mlocked set */
|
unsigned long locked_vm; /* Pages that have PG_mlocked set */
|
||||||
unsigned long pinned_vm; /* Refcount permanently increased */
|
unsigned long pinned_vm; /* Refcount permanently increased */
|
||||||
unsigned long data_vm; /* VM_WRITE & ~VM_SHARED/GROWSDOWN */
|
unsigned long data_vm; /* VM_WRITE & ~VM_SHARED & ~VM_STACK */
|
||||||
unsigned long exec_vm; /* VM_EXEC & ~VM_WRITE */
|
unsigned long exec_vm; /* VM_EXEC & ~VM_WRITE & ~VM_STACK */
|
||||||
unsigned long stack_vm; /* VM_GROWSUP/DOWN */
|
unsigned long stack_vm; /* VM_STACK */
|
||||||
unsigned long def_flags;
|
unsigned long def_flags;
|
||||||
unsigned long start_code, end_code, start_data, end_data;
|
unsigned long start_code, end_code, start_data, end_data;
|
||||||
unsigned long start_brk, brk, start_stack;
|
unsigned long start_brk, brk, start_stack;
|
||||||
|
|||||||
@@ -216,20 +216,35 @@ static inline bool is_cow_mapping(vm_flags_t flags)
|
|||||||
return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
|
return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These three helpers classifies VMAs for virtual memory accounting.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Executable code area - executable, not writable, not stack
|
||||||
|
*/
|
||||||
static inline bool is_exec_mapping(vm_flags_t flags)
|
static inline bool is_exec_mapping(vm_flags_t flags)
|
||||||
{
|
{
|
||||||
return (flags & (VM_EXEC | VM_WRITE)) == VM_EXEC;
|
return (flags & (VM_EXEC | VM_WRITE | VM_STACK)) == VM_EXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stack area - atomatically grows in one direction
|
||||||
|
*
|
||||||
|
* VM_GROWSUP / VM_GROWSDOWN VMAs are always private anonymous:
|
||||||
|
* do_mmap() forbids all other combinations.
|
||||||
|
*/
|
||||||
static inline bool is_stack_mapping(vm_flags_t flags)
|
static inline bool is_stack_mapping(vm_flags_t flags)
|
||||||
{
|
{
|
||||||
return (flags & (VM_STACK_FLAGS & (VM_GROWSUP | VM_GROWSDOWN))) != 0;
|
return (flags & VM_STACK) == VM_STACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data area - private, writable, not stack
|
||||||
|
*/
|
||||||
static inline bool is_data_mapping(vm_flags_t flags)
|
static inline bool is_data_mapping(vm_flags_t flags)
|
||||||
{
|
{
|
||||||
return (flags & ((VM_STACK_FLAGS & (VM_GROWSUP | VM_GROWSDOWN)) |
|
return (flags & (VM_WRITE | VM_SHARED | VM_STACK)) == VM_WRITE;
|
||||||
VM_WRITE | VM_SHARED)) == VM_WRITE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mm/util.c */
|
/* mm/util.c */
|
||||||
|
|||||||
Reference in New Issue
Block a user