The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kernel/tsacct.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 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         struct timespec uptime, ts;
   35         u64 ac_etime;
   36 
   37         BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);
   38 
   39         /* calculate task elapsed time in timespec */
   40         do_posix_clock_monotonic_gettime(&uptime);
   41         ts = timespec_sub(uptime, tsk->start_time);
   42         /* rebase elapsed time to usec (should never be negative) */
   43         ac_etime = timespec_to_ns(&ts);
   44         do_div(ac_etime, NSEC_PER_USEC);
   45         stats->ac_etime = ac_etime;
   46         stats->ac_btime = get_seconds() - ts.tv_sec;
   47         if (thread_group_leader(tsk)) {
   48                 stats->ac_exitcode = tsk->exit_code;
   49                 if (tsk->flags & PF_FORKNOEXEC)
   50                         stats->ac_flag |= AFORK;
   51         }
   52         if (tsk->flags & PF_SUPERPRIV)
   53                 stats->ac_flag |= ASU;
   54         if (tsk->flags & PF_DUMPCORE)
   55                 stats->ac_flag |= ACORE;
   56         if (tsk->flags & PF_SIGNALED)
   57                 stats->ac_flag |= AXSIG;
   58         stats->ac_nice   = task_nice(tsk);
   59         stats->ac_sched  = tsk->policy;
   60         stats->ac_pid    = task_pid_nr_ns(tsk, pid_ns);
   61         rcu_read_lock();
   62         tcred = __task_cred(tsk);
   63         stats->ac_uid    = from_kuid_munged(user_ns, tcred->uid);
   64         stats->ac_gid    = from_kgid_munged(user_ns, tcred->gid);
   65         stats->ac_ppid   = pid_alive(tsk) ?
   66                 task_tgid_nr_ns(rcu_dereference(tsk->real_parent), pid_ns) : 0;
   67         rcu_read_unlock();
   68         stats->ac_utime = cputime_to_usecs(tsk->utime);
   69         stats->ac_stime = cputime_to_usecs(tsk->stime);
   70         stats->ac_utimescaled = cputime_to_usecs(tsk->utimescaled);
   71         stats->ac_stimescaled = cputime_to_usecs(tsk->stimescaled);
   72         stats->ac_minflt = tsk->min_flt;
   73         stats->ac_majflt = tsk->maj_flt;
   74 
   75         strncpy(stats->ac_comm, tsk->comm, sizeof(stats->ac_comm));
   76 }
   77 
   78 
   79 #ifdef CONFIG_TASK_XACCT
   80 
   81 #define KB 1024
   82 #define MB (1024*KB)
   83 #define KB_MASK (~(KB-1))
   84 /*
   85  * fill in extended accounting fields
   86  */
   87 void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
   88 {
   89         struct mm_struct *mm;
   90 
   91         /* convert pages-usec to Mbyte-usec */
   92         stats->coremem = p->acct_rss_mem1 * PAGE_SIZE / MB;
   93         stats->virtmem = p->acct_vm_mem1 * PAGE_SIZE / MB;
   94         mm = get_task_mm(p);
   95         if (mm) {
   96                 /* adjust to KB unit */
   97                 stats->hiwater_rss   = get_mm_hiwater_rss(mm) * PAGE_SIZE / KB;
   98                 stats->hiwater_vm    = get_mm_hiwater_vm(mm)  * PAGE_SIZE / KB;
   99                 mmput(mm);
  100         }
  101         stats->read_char        = p->ioac.rchar & KB_MASK;
  102         stats->write_char       = p->ioac.wchar & KB_MASK;
  103         stats->read_syscalls    = p->ioac.syscr & KB_MASK;
  104         stats->write_syscalls   = p->ioac.syscw & KB_MASK;
  105 #ifdef CONFIG_TASK_IO_ACCOUNTING
  106         stats->read_bytes       = p->ioac.read_bytes & KB_MASK;
  107         stats->write_bytes      = p->ioac.write_bytes & KB_MASK;
  108         stats->cancelled_write_bytes = p->ioac.cancelled_write_bytes & KB_MASK;
  109 #else
  110         stats->read_bytes       = 0;
  111         stats->write_bytes      = 0;
  112         stats->cancelled_write_bytes = 0;
  113 #endif
  114 }
  115 #undef KB
  116 #undef MB
  117 
  118 /**
  119  * acct_update_integrals - update mm integral fields in task_struct
  120  * @tsk: task_struct for accounting
  121  */
  122 void acct_update_integrals(struct task_struct *tsk)
  123 {
  124         if (likely(tsk->mm)) {
  125                 cputime_t time, dtime;
  126                 struct timeval value;
  127                 unsigned long flags;
  128                 u64 delta;
  129 
  130                 local_irq_save(flags);
  131                 time = tsk->stime + tsk->utime;
  132                 dtime = time - tsk->acct_timexpd;
  133                 jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
  134                 delta = value.tv_sec;
  135                 delta = delta * USEC_PER_SEC + value.tv_usec;
  136 
  137                 if (delta == 0)
  138                         goto out;
  139                 tsk->acct_timexpd = time;
  140                 tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);
  141                 tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
  142         out:
  143                 local_irq_restore(flags);
  144         }
  145 }
  146 
  147 /**
  148  * acct_clear_integrals - clear the mm integral fields in task_struct
  149  * @tsk: task_struct whose accounting fields are cleared
  150  */
  151 void acct_clear_integrals(struct task_struct *tsk)
  152 {
  153         tsk->acct_timexpd = 0;
  154         tsk->acct_rss_mem1 = 0;
  155         tsk->acct_vm_mem1 = 0;
  156 }
  157 #endif

Cache object: 4d5a94fa322d51647199ee83459b7e49


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.