@@ -33,7 +33,8 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)
unsigned long text, lib, swap, anon, file, shmem;
unsigned long hiwater_vm, total_vm, hiwater_rss, total_rss;
- anon = get_mm_counter(mm, MM_ANONPAGES);
+ anon = get_mm_counter(mm, MM_ANONPAGES) +
+ get_mm_counter(mm, MM_DRIVERPAGES);
file = get_mm_counter(mm, MM_FILEPAGES);
shmem = get_mm_counter(mm, MM_SHMEMPAGES);
@@ -94,7 +95,8 @@ unsigned long task_statm(struct mm_struct *mm,
*text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
>> PAGE_SHIFT;
*data = mm->data_vm + mm->stack_vm;
- *resident = *shared + get_mm_counter(mm, MM_ANONPAGES);
+ *resident = *shared + get_mm_counter(mm, MM_ANONPAGES) +
+ get_mm_counter(mm, MM_DRIVERPAGES);
return mm->total_vm;
}
@@ -2003,7 +2003,8 @@ static inline unsigned long get_mm_rss(struct mm_struct *mm)
{
return get_mm_counter(mm, MM_FILEPAGES) +
get_mm_counter(mm, MM_ANONPAGES) +
- get_mm_counter(mm, MM_SHMEMPAGES);
+ get_mm_counter(mm, MM_SHMEMPAGES) +
+ get_mm_counter(mm, MM_DRIVERPAGES);
}
static inline unsigned long get_mm_hiwater_rss(struct mm_struct *mm)
@@ -45,6 +45,7 @@ enum {
MM_ANONPAGES, /* Resident anonymous pages */
MM_SWAPENTS, /* Anonymous swap entries */
MM_SHMEMPAGES, /* Resident shared memory pages */
+ MM_DRIVERPAGES, /* pages allocated by a driver on behalf of a task */
NR_MM_COUNTERS
};
@@ -135,6 +135,7 @@ static const char * const resident_page_types[] = {
NAMED_ARRAY_INDEX(MM_ANONPAGES),
NAMED_ARRAY_INDEX(MM_SWAPENTS),
NAMED_ARRAY_INDEX(MM_SHMEMPAGES),
+ NAMED_ARRAY_INDEX(MM_DRIVERPAGES),
};
DEFINE_PER_CPU(unsigned long, process_counts) = 0;
This adds a mm counter for pages allocated by a driver on behalf of a userspace task. Especially with DRM drivers there can be large amounts of pages that are never mapped into userspace and thus are not tracked by the usual ANONPAGES mmap accounting, as those pages are only ever touched by the device. They can make up a significant portion of the tasks resident memory size, but are currently not visible in any of the memory statistics visible to userspace and the OOM handling. Add the counter to allow tracking such memory, which allows to make more sensible decisions in the OOM handling as well as allowing userspace some better insight into the real system memory usage. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- fs/proc/task_mmu.c | 6 ++++-- include/linux/mm.h | 3 ++- include/linux/mm_types_task.h | 1 + kernel/fork.c | 1 + 4 files changed, 8 insertions(+), 3 deletions(-)