|
@@ -1338,6 +1338,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
|
|
unsigned long flags;
|
|
|
cputime_t utime, stime;
|
|
|
struct task_cputime cputime;
|
|
|
+ unsigned long maxrss = 0;
|
|
|
|
|
|
memset((char *) r, 0, sizeof *r);
|
|
|
utime = stime = cputime_zero;
|
|
@@ -1346,6 +1347,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
|
|
utime = task_utime(current);
|
|
|
stime = task_stime(current);
|
|
|
accumulate_thread_rusage(p, r);
|
|
|
+ maxrss = p->signal->maxrss;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -1363,6 +1365,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
|
|
r->ru_majflt = p->signal->cmaj_flt;
|
|
|
r->ru_inblock = p->signal->cinblock;
|
|
|
r->ru_oublock = p->signal->coublock;
|
|
|
+ maxrss = p->signal->cmaxrss;
|
|
|
|
|
|
if (who == RUSAGE_CHILDREN)
|
|
|
break;
|
|
@@ -1377,6 +1380,8 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
|
|
r->ru_majflt += p->signal->maj_flt;
|
|
|
r->ru_inblock += p->signal->inblock;
|
|
|
r->ru_oublock += p->signal->oublock;
|
|
|
+ if (maxrss < p->signal->maxrss)
|
|
|
+ maxrss = p->signal->maxrss;
|
|
|
t = p;
|
|
|
do {
|
|
|
accumulate_thread_rusage(t, r);
|
|
@@ -1392,6 +1397,15 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
|
|
|
out:
|
|
|
cputime_to_timeval(utime, &r->ru_utime);
|
|
|
cputime_to_timeval(stime, &r->ru_stime);
|
|
|
+
|
|
|
+ if (who != RUSAGE_CHILDREN) {
|
|
|
+ struct mm_struct *mm = get_task_mm(p);
|
|
|
+ if (mm) {
|
|
|
+ setmax_mm_hiwater_rss(&maxrss, mm);
|
|
|
+ mmput(mm);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ r->ru_maxrss = maxrss * (PAGE_SIZE / 1024); /* convert pages to KBs */
|
|
|
}
|
|
|
|
|
|
int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
|