Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29820
b: refs/heads/master
c: 0e46481
h: refs/heads/master
v: v3
  • Loading branch information
KaiGai Kohei authored and Linus Torvalds committed Jun 25, 2006
1 parent e696d85 commit a8eaa74
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6bc392741d661eb84be503d1fdf14b6746615e4c
refs/heads/master: 0e4648141af02331f21aabcd34940c70f09a2d04
4 changes: 4 additions & 0 deletions trunk/include/linux/acct.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,16 @@ struct vfsmount;
struct super_block;
extern void acct_auto_close_mnt(struct vfsmount *m);
extern void acct_auto_close(struct super_block *sb);
extern void acct_init_pacct(struct pacct_struct *pacct);
extern void acct_collect();
extern void acct_process(long exitcode);
extern void acct_update_integrals(struct task_struct *tsk);
extern void acct_clear_integrals(struct task_struct *tsk);
#else
#define acct_auto_close_mnt(x) do { } while (0)
#define acct_auto_close(x) do { } while (0)
#define acct_init_pacct(x) do { } while (0)
#define acct_collect() do { } while (0)
#define acct_process(x) do { } while (0)
#define acct_update_integrals(x) do { } while (0)
#define acct_clear_integrals(task) do { } while (0)
Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,10 @@ struct sighand_struct {
spinlock_t siglock;
};

struct pacct_struct {
unsigned long ac_mem;
};

/*
* NOTE! "signal_struct" does not have it's own
* locking, because a shared signal_struct always
Expand Down Expand Up @@ -449,6 +453,9 @@ struct signal_struct {
struct key *session_keyring; /* keyring inherited over fork */
struct key *process_keyring; /* keyring private to this process */
#endif
#ifdef CONFIG_BSD_PROCESS_ACCT
struct pacct_struct pacct; /* per-process accounting information */
#endif
};

/* Context switch must be unlocked if interrupts are to be enabled */
Expand Down
51 changes: 36 additions & 15 deletions trunk/kernel/acct.c
Original file line number Diff line number Diff line change
Expand Up @@ -421,9 +421,9 @@ static u32 encode_float(u64 value)
*/
static void do_acct_process(long exitcode, struct file *file)
{
struct pacct_struct *pacct = &current->signal->pacct;
acct_t ac;
mm_segment_t fs;
unsigned long vsize;
unsigned long flim;
u64 elapsed;
u64 run_time;
Expand Down Expand Up @@ -505,20 +505,9 @@ static void do_acct_process(long exitcode, struct file *file)
ac.ac_flag |= ACORE;
if (current->flags & PF_SIGNALED)
ac.ac_flag |= AXSIG;

vsize = 0;
if (current->mm) {
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
vma = current->mm->mmap;
while (vma) {
vsize += vma->vm_end - vma->vm_start;
vma = vma->vm_next;
}
up_read(&current->mm->mmap_sem);
}
vsize = vsize / 1024;
ac.ac_mem = encode_comp_t(vsize);
spin_lock(&current->sighand->siglock);
ac.ac_mem = encode_comp_t(pacct->ac_mem);
spin_unlock(&current->sighand->siglock);
ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */
ac.ac_rw = encode_comp_t(ac.ac_io / 1024);
ac.ac_minflt = encode_comp_t(current->signal->min_flt +
Expand All @@ -545,6 +534,38 @@ static void do_acct_process(long exitcode, struct file *file)
set_fs(fs);
}

/**
* acct_init_pacct - initialize a new pacct_struct
*/
void acct_init_pacct(struct pacct_struct *pacct)
{
memset(pacct, 0, sizeof(struct pacct_struct));
}

/**
* acct_collect - collect accounting information into pacct_struct
*/
void acct_collect(void)
{
struct pacct_struct *pacct = &current->signal->pacct;
unsigned long vsize = 0;

if (current->mm) {
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
vma = current->mm->mmap;
while (vma) {
vsize += vma->vm_end - vma->vm_start;
vma = vma->vm_next;
}
up_read(&current->mm->mmap_sem);
}

spin_lock(&current->sighand->siglock);
pacct->ac_mem = vsize / 1024;
spin_unlock(&current->sighand->siglock);
}

/**
* acct_process - now just a wrapper around do_acct_process
* @exitcode: task exit code
Expand Down
4 changes: 3 additions & 1 deletion trunk/kernel/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -894,7 +894,7 @@ fastcall NORET_TYPE void do_exit(long code)
if (group_dead) {
hrtimer_cancel(&tsk->signal->real_timer);
exit_itimers(tsk->signal);
acct_process(code);
acct_collect();
}
if (unlikely(tsk->robust_list))
exit_robust_list(tsk);
Expand All @@ -906,6 +906,8 @@ fastcall NORET_TYPE void do_exit(long code)
audit_free(tsk);
exit_mm(tsk);

if (group_dead)
acct_process(code);
exit_sem(tsk);
__exit_files(tsk);
__exit_fs(tsk);
Expand Down
1 change: 1 addition & 0 deletions trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
tsk->it_prof_expires =
secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur);
}
acct_init_pacct(&sig->pacct);

return 0;
}
Expand Down

0 comments on commit a8eaa74

Please sign in to comment.