unsigned long task_statm(struct mm_struct *mm, unsigned long *shared, unsigned long *text, unsigned long *data, unsigned long *resident) { struct vm_area_struct *vma; struct vm_region *region; struct rb_node *p; unsigned long size = kobjsize(mm); down_read(&mm->mmap_sem); for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { vma = rb_entry(p, struct vm_area_struct, vm_rb); size += kobjsize(vma); region = vma->vm_region; if (region) { size += kobjsize(region); size += region->vm_end - region->vm_start; } } *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> PAGE_SHIFT; *data = (PAGE_ALIGN(mm->start_stack) - (mm->start_data & PAGE_MASK)) >> PAGE_SHIFT; up_read(&mm->mmap_sem); size >>= PAGE_SHIFT; size += *text + *data; *resident = size; return size; }
unsigned long task_vsize(struct mm_struct *mm) { struct mm_tblock_struct *tbp; unsigned long vsize = 0; for (tbp = &mm->context.tblock; tbp; tbp = tbp->next) { if (tbp->rblock) vsize += kobjsize(tbp->rblock->kblock); } return vsize; }
int task_statm(struct mm_struct *mm, int *shared, int *text, int *data, int *resident) { struct mm_tblock_struct *tbp; int size = kobjsize(mm); for (tbp = &mm->context.tblock; tbp; tbp = tbp->next) { if (tbp->next) size += kobjsize(tbp->next); if (tbp->rblock) { size += kobjsize(tbp->rblock); size += kobjsize(tbp->rblock->kblock); } } size += (*text = mm->end_code - mm->start_code); size += (*data = mm->start_stack - mm->start_data); *resident = size; return size; }
/* * Logic: we've got two memory sums for each process, "shared", and * "non-shared". Shared memory may get counted more than once, for * each process that owns it. Non-shared memory is counted * accurately. */ void task_mem(struct seq_file *m, struct mm_struct *mm) { struct vm_area_struct *vma; struct vm_region *region; struct rb_node *p; unsigned long bytes = 0, sbytes = 0, slack = 0, size; down_read(&mm->mmap_sem); for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { vma = rb_entry(p, struct vm_area_struct, vm_rb); bytes += kobjsize(vma); region = vma->vm_region; if (region) { size = kobjsize(region); size += region->vm_end - region->vm_start; } else { size = vma->vm_end - vma->vm_start; } if (atomic_read(&mm->mm_count) > 1 || vma->vm_flags & VM_MAYSHARE) { sbytes += size; } else { bytes += size; if (region) slack = region->vm_end - vma->vm_end; } } if (atomic_read(&mm->mm_count) > 1) sbytes += kobjsize(mm); else bytes += kobjsize(mm); if (current->fs && atomic_read(¤t->fs->users) > 1) sbytes += kobjsize(current->fs); else bytes += kobjsize(current->fs); if (current->files && atomic_read(¤t->files->count) > 1) sbytes += kobjsize(current->files); else bytes += kobjsize(current->files); if (current->sighand && atomic_read(¤t->sighand->count) > 1) sbytes += kobjsize(current->sighand); else bytes += kobjsize(current->sighand); bytes += kobjsize(current); /* includes kernel stack */ seq_printf(m, "Mem:\t%8lu bytes\n" "Slack:\t%8lu bytes\n" "Shared:\t%8lu bytes\n", bytes, slack, sbytes); up_read(&mm->mmap_sem); }
/* * Logic: we've got two memory sums for each process, "shared", and * "non-shared". Shared memory may get counted more then once, for * each process that owns it. Non-shared memory is counted * accurately. */ char *task_mem(struct mm_struct *mm, char *buffer) { unsigned long bytes = 0, sbytes = 0, slack = 0; struct mm_tblock_struct *tblock; down_read(&mm->mmap_sem); for (tblock = &mm->context.tblock; tblock; tblock = tblock->next) { if (!tblock->rblock) continue; bytes += kobjsize(tblock); if (atomic_read(&mm->mm_count) > 1 || tblock->rblock->refcount > 1) { sbytes += kobjsize(tblock->rblock->kblock); sbytes += kobjsize(tblock->rblock); } else { bytes += kobjsize(tblock->rblock->kblock); bytes += kobjsize(tblock->rblock); slack += kobjsize(tblock->rblock->kblock) - tblock->rblock->size; } } if (atomic_read(&mm->mm_count) > 1) sbytes += kobjsize(mm); else bytes += kobjsize(mm); if (current->fs && atomic_read(¤t->fs->count) > 1) sbytes += kobjsize(current->fs); else bytes += kobjsize(current->fs); if (current->files && atomic_read(¤t->files->count) > 1) sbytes += kobjsize(current->files); else bytes += kobjsize(current->files); if (current->sighand && atomic_read(¤t->sighand->count) > 1) sbytes += kobjsize(current->sighand); else bytes += kobjsize(current->sighand); bytes += kobjsize(current); /* includes kernel stack */ buffer += sprintf(buffer, "Mem:\t%8lu bytes\n" "Slack:\t%8lu bytes\n" "Shared:\t%8lu bytes\n", bytes, slack, sbytes); up_read(&mm->mmap_sem); return buffer; }