LCOV - code coverage report
Current view: top level - kernel - tsacct.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 24 73 32.9 %
Date: 2015-04-12 14:34:49 Functions: 4 6 66.7 %

          Line data    Source code
       1             : /*
       2             :  * tsacct.c - System accounting over taskstats interface
       3             :  *
       4             :  * Copyright (C) Jay Lan,       <jlan@sgi.com>
       5             :  *
       6             :  *
       7             :  * This program is free software; you can redistribute it and/or modify
       8             :  * it under the terms of the GNU General Public License as published by
       9             :  * the Free Software Foundation; either version 2 of the License, or
      10             :  * (at your option) any later version.
      11             :  *
      12             :  * This program is distributed in the hope that it will be useful,
      13             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15             :  * GNU General Public License for more details.
      16             :  *
      17             :  */
      18             : 
      19             : #include <linux/kernel.h>
      20             : #include <linux/sched.h>
      21             : #include <linux/tsacct_kern.h>
      22             : #include <linux/acct.h>
      23             : #include <linux/jiffies.h>
      24             : #include <linux/mm.h>
      25             : 
      26             : /*
      27             :  * fill in basic accounting fields
      28             :  */
      29           0 : void bacct_add_tsk(struct user_namespace *user_ns,
      30             :                    struct pid_namespace *pid_ns,
      31             :                    struct taskstats *stats, struct task_struct *tsk)
      32             : {
      33             :         const struct cred *tcred;
      34             :         cputime_t utime, stime, utimescaled, stimescaled;
      35             :         u64 delta;
      36             : 
      37             :         BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);
      38             : 
      39             :         /* calculate task elapsed time in nsec */
      40           0 :         delta = ktime_get_ns() - tsk->start_time;
      41             :         /* Convert to micro seconds */
      42           0 :         do_div(delta, NSEC_PER_USEC);
      43           0 :         stats->ac_etime = delta;
      44             :         /* Convert to seconds for btime */
      45           0 :         do_div(delta, USEC_PER_SEC);
      46           0 :         stats->ac_btime = get_seconds() - delta;
      47           0 :         if (thread_group_leader(tsk)) {
      48           0 :                 stats->ac_exitcode = tsk->exit_code;
      49           0 :                 if (tsk->flags & PF_FORKNOEXEC)
      50           0 :                         stats->ac_flag |= AFORK;
      51             :         }
      52           0 :         if (tsk->flags & PF_SUPERPRIV)
      53           0 :                 stats->ac_flag |= ASU;
      54           0 :         if (tsk->flags & PF_DUMPCORE)
      55           0 :                 stats->ac_flag |= ACORE;
      56           0 :         if (tsk->flags & PF_SIGNALED)
      57           0 :                 stats->ac_flag |= AXSIG;
      58           0 :         stats->ac_nice        = task_nice(tsk);
      59           0 :         stats->ac_sched       = tsk->policy;
      60           0 :         stats->ac_pid         = task_pid_nr_ns(tsk, pid_ns);
      61             :         rcu_read_lock();
      62           0 :         tcred = __task_cred(tsk);
      63           0 :         stats->ac_uid         = from_kuid_munged(user_ns, tcred->uid);
      64           0 :         stats->ac_gid         = from_kgid_munged(user_ns, tcred->gid);
      65           0 :         stats->ac_ppid        = pid_alive(tsk) ?
      66           0 :                 task_tgid_nr_ns(rcu_dereference(tsk->real_parent), pid_ns) : 0;
      67             :         rcu_read_unlock();
      68             : 
      69             :         task_cputime(tsk, &utime, &stime);
      70           0 :         stats->ac_utime = cputime_to_usecs(utime);
      71           0 :         stats->ac_stime = cputime_to_usecs(stime);
      72             : 
      73             :         task_cputime_scaled(tsk, &utimescaled, &stimescaled);
      74           0 :         stats->ac_utimescaled = cputime_to_usecs(utimescaled);
      75           0 :         stats->ac_stimescaled = cputime_to_usecs(stimescaled);
      76             : 
      77           0 :         stats->ac_minflt = tsk->min_flt;
      78           0 :         stats->ac_majflt = tsk->maj_flt;
      79             : 
      80           0 :         strncpy(stats->ac_comm, tsk->comm, sizeof(stats->ac_comm));
      81           0 : }
      82             : 
      83             : 
      84             : #ifdef CONFIG_TASK_XACCT
      85             : 
      86             : #define KB 1024
      87             : #define MB (1024*KB)
      88             : #define KB_MASK (~(KB-1))
      89             : /*
      90             :  * fill in extended accounting fields
      91             :  */
      92           0 : void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
      93             : {
      94           0 :         struct mm_struct *mm;
      95             : 
      96             :         /* convert pages-usec to Mbyte-usec */
      97           0 :         stats->coremem = p->acct_rss_mem1 * PAGE_SIZE / MB;
      98           0 :         stats->virtmem = p->acct_vm_mem1 * PAGE_SIZE / MB;
      99           0 :         mm = get_task_mm(p);
     100           0 :         if (mm) {
     101             :                 /* adjust to KB unit */
     102           0 :                 stats->hiwater_rss   = get_mm_hiwater_rss(mm) * PAGE_SIZE / KB;
     103           0 :                 stats->hiwater_vm    = get_mm_hiwater_vm(mm)  * PAGE_SIZE / KB;
     104           0 :                 mmput(mm);
     105             :         }
     106           0 :         stats->read_char     = p->ioac.rchar & KB_MASK;
     107           0 :         stats->write_char    = p->ioac.wchar & KB_MASK;
     108           0 :         stats->read_syscalls = p->ioac.syscr & KB_MASK;
     109           0 :         stats->write_syscalls        = p->ioac.syscw & KB_MASK;
     110             : #ifdef CONFIG_TASK_IO_ACCOUNTING
     111           0 :         stats->read_bytes    = p->ioac.read_bytes & KB_MASK;
     112           0 :         stats->write_bytes   = p->ioac.write_bytes & KB_MASK;
     113           0 :         stats->cancelled_write_bytes = p->ioac.cancelled_write_bytes & KB_MASK;
     114             : #else
     115             :         stats->read_bytes    = 0;
     116             :         stats->write_bytes   = 0;
     117             :         stats->cancelled_write_bytes = 0;
     118             : #endif
     119           0 : }
     120             : #undef KB
     121             : #undef MB
     122             : 
     123      144172 : static void __acct_update_integrals(struct task_struct *tsk,
     124             :                                     cputime_t utime, cputime_t stime)
     125             : {
     126      144172 :         if (likely(tsk->mm)) {
     127             :                 cputime_t time, dtime;
     128             :                 struct timeval value;
     129             :                 unsigned long flags;
     130             :                 u64 delta;
     131             : 
     132             :                 local_irq_save(flags);
     133      138711 :                 time = stime + utime;
     134      138711 :                 dtime = time - tsk->acct_timexpd;
     135      138711 :                 jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
     136      138711 :                 delta = value.tv_sec;
     137      138711 :                 delta = delta * USEC_PER_SEC + value.tv_usec;
     138             : 
     139      138711 :                 if (delta == 0)
     140             :                         goto out;
     141      133684 :                 tsk->acct_timexpd = time;
     142      267368 :                 tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);
     143      133684 :                 tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
     144             :         out:
     145      138711 :                 local_irq_restore(flags);
     146             :         }
     147      144172 : }
     148             : 
     149             : /**
     150             :  * acct_update_integrals - update mm integral fields in task_struct
     151             :  * @tsk: task_struct for accounting
     152             :  */
     153        5063 : void acct_update_integrals(struct task_struct *tsk)
     154             : {
     155             :         cputime_t utime, stime;
     156             : 
     157             :         task_cputime(tsk, &utime, &stime);
     158        5063 :         __acct_update_integrals(tsk, utime, stime);
     159        5063 : }
     160             : 
     161             : /**
     162             :  * acct_account_cputime - update mm integral after cputime update
     163             :  * @tsk: task_struct for accounting
     164             :  */
     165      139109 : void acct_account_cputime(struct task_struct *tsk)
     166             : {
     167      139109 :         __acct_update_integrals(tsk, tsk->utime, tsk->stime);
     168      139109 : }
     169             : 
     170             : /**
     171             :  * acct_clear_integrals - clear the mm integral fields in task_struct
     172             :  * @tsk: task_struct whose accounting fields are cleared
     173             :  */
     174        2993 : void acct_clear_integrals(struct task_struct *tsk)
     175             : {
     176        2993 :         tsk->acct_timexpd = 0;
     177        2993 :         tsk->acct_rss_mem1 = 0;
     178        2993 :         tsk->acct_vm_mem1 = 0;
     179        2993 : }
     180             : #endif

Generated by: LCOV version 1.11