Skip to content

Commit 30bdbb7

Browse files
koct9itorvalds
authored andcommitted
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 <[email protected]> Tested-by: Sudip Mukherjee <[email protected]> Cc: Cyrill Gorcunov <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent d977d56 commit 30bdbb7

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

Documentation/filesystems/proc.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,8 @@ Table 1-2: Contents of the status files (as of 4.1)
240240
RssFile size of resident file mappings
241241
RssShmem size of resident shmem memory (includes SysV shm,
242242
mapping of tmpfs and shared anonymous mappings)
243-
VmData size of data, stack, and text segments
244-
VmStk size of data, stack, and text segments
243+
VmData size of private data segments
244+
VmStk size of stack segments
245245
VmExe size of text segment
246246
VmLib size of shared library code
247247
VmPTE size of page table entries

include/linux/mm.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,13 @@ extern unsigned int kobjsize(const void *objp);
201201
#endif
202202

203203
#ifdef CONFIG_STACK_GROWSUP
204-
#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
204+
#define VM_STACK VM_GROWSUP
205205
#else
206-
#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
206+
#define VM_STACK VM_GROWSDOWN
207207
#endif
208208

209+
#define VM_STACK_FLAGS (VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
210+
209211
/*
210212
* Special vmas that are non-mergable, non-mlock()able.
211213
* Note: mm/huge_memory.c VM_NO_THP depends on this definition.

include/linux/mm_types.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,9 @@ struct mm_struct {
424424
unsigned long total_vm; /* Total pages mapped */
425425
unsigned long locked_vm; /* Pages that have PG_mlocked set */
426426
unsigned long pinned_vm; /* Refcount permanently increased */
427-
unsigned long data_vm; /* VM_WRITE & ~VM_SHARED/GROWSDOWN */
428-
unsigned long exec_vm; /* VM_EXEC & ~VM_WRITE */
429-
unsigned long stack_vm; /* VM_GROWSUP/DOWN */
427+
unsigned long data_vm; /* VM_WRITE & ~VM_SHARED & ~VM_STACK */
428+
unsigned long exec_vm; /* VM_EXEC & ~VM_WRITE & ~VM_STACK */
429+
unsigned long stack_vm; /* VM_STACK */
430430
unsigned long def_flags;
431431
unsigned long start_code, end_code, start_data, end_data;
432432
unsigned long start_brk, brk, start_stack;

mm/internal.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,20 +216,35 @@ static inline bool is_cow_mapping(vm_flags_t flags)
216216
return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
217217
}
218218

219+
/*
220+
* These three helpers classifies VMAs for virtual memory accounting.
221+
*/
222+
223+
/*
224+
* Executable code area - executable, not writable, not stack
225+
*/
219226
static inline bool is_exec_mapping(vm_flags_t flags)
220227
{
221-
return (flags & (VM_EXEC | VM_WRITE)) == VM_EXEC;
228+
return (flags & (VM_EXEC | VM_WRITE | VM_STACK)) == VM_EXEC;
222229
}
223230

231+
/*
232+
* Stack area - atomatically grows in one direction
233+
*
234+
* VM_GROWSUP / VM_GROWSDOWN VMAs are always private anonymous:
235+
* do_mmap() forbids all other combinations.
236+
*/
224237
static inline bool is_stack_mapping(vm_flags_t flags)
225238
{
226-
return (flags & (VM_STACK_FLAGS & (VM_GROWSUP | VM_GROWSDOWN))) != 0;
239+
return (flags & VM_STACK) == VM_STACK;
227240
}
228241

242+
/*
243+
* Data area - private, writable, not stack
244+
*/
229245
static inline bool is_data_mapping(vm_flags_t flags)
230246
{
231-
return (flags & ((VM_STACK_FLAGS & (VM_GROWSUP | VM_GROWSDOWN)) |
232-
VM_WRITE | VM_SHARED)) == VM_WRITE;
247+
return (flags & (VM_WRITE | VM_SHARED | VM_STACK)) == VM_WRITE;
233248
}
234249

235250
/* mm/util.c */

0 commit comments

Comments
 (0)