voidgetrusage(structtask_struct*p,intwho,structrusage*r){structtask_struct*t;unsignedlongflags;u64tgutime,tgstime,utime,stime;unsignedlongmaxrss=0;memset((char*)r,0,sizeof(*r));utime=stime=0;if(who==RUSAGE_THREAD){task_cputime_adjusted(current,&utime,&stime);accumulate_thread_rusage(p,r);maxrss=p->signal->maxrss;gotoout;}if(!lock_task_sighand(p,&flags))return;switch(who){caseRUSAGE_BOTH:caseRUSAGE_CHILDREN:utime=p->signal->cutime;stime=p->signal->cstime;r->ru_nvcsw=p->signal->cnvcsw;r->ru_nivcsw=p->signal->cnivcsw;r->ru_minflt=p->signal->cmin_flt;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;caseRUSAGE_SELF:thread_group_cputime_adjusted(p,&tgutime,&tgstime);utime+=tgutime;stime+=tgstime;r->ru_nvcsw+=p->signal->nvcsw;r->ru_nivcsw+=p->signal->nivcsw;r->ru_minflt+=p->signal->min_flt;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);}while_each_thread(p,t);break;default:BUG();}unlock_task_sighand(p,&flags);out:r->ru_utime=ns_to_timeval(utime);r->ru_stime=ns_to_timeval(stime);if(who!=RUSAGE_CHILDREN){structmm_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 */}
// Customed getrusage for the kernel
SYSCALL_DEFINE2(my_getrusage,pid_t,p_pid,structrusage__user*,u_rusage){structtask_struct*p;structrusage*k_rusage;p=pid_task(find_get_pid(p_pid),PIDTYPE_PID);if(p==NULL){printk(KERN_ALERT"Could not find a process by pid %d",p_pid);return-EFAULT;}else{printk(KERN_ALERT"PID[%d]@[%s]",p->pid,p->comm);}k_rusage=kmalloc(sizeof(structrusage),GFP_KERNEL);if(k_rusage==NULL){printk(KERN_ALERT"Could not allocate memory for k_rusage");return-EFAULT;}getrusage(p,RUSAGE_SELF,k_rusage);if(copy_to_user(u_rusage,k_rusage,sizeof(structrusage))!=0){printk(KERN_ALERT"Could not copy usage to user");return-EFAULT;}return0;}
#include<stdio.h>#include<stdlib.h>#include<linux/kernel.h>#include<sys/syscall.h>#include<sys/resource.h>#include<unistd.h>#define MY_GETRUSAGE 295
voidprintUsage(structrusage*usage);intmain(){pid_tpid;structrusage*usage=NULL;printf("Enter the pid of the process: \n");scanf("%d",&pid);printf("The pid received is %d\n",pid);usage=malloc(sizeof(structrusage));if(usage==NULL){printf("Error in allocating memory to 'usage'\n");return-1;}syscall(MY_GETRUSAGE,pid,usage);if(usage==NULL){printf("Error in the system call\n");}else{printf("The system call was successful\n");printUsage(usage);}return0;}voidprintUsage(structrusage*usage){printf("\nfunction printUsage() called\n");printf("%-15s %-15s %-20s %-20s %-15s %-15s\n","[User Time]","[System Time]","[Page Faults|MIN]","[Page Faults|MAX]","[Block IN]","[Block OUT]");printf("%-15.3f %-15.3f %-20ld %-20ld %-15ld %-15ld\n",usage->ru_utime.tv_sec+usage->ru_utime.tv_usec*1.0,usage->ru_stime.tv_sec+usage->ru_stime.tv_usec*1.0,usage->ru_minflt,usage->ru_majflt,usage->ru_inblock,usage->ru_oublock);}