Blame view

fs/proc/array.c 12.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  /*
   *  linux/fs/proc/array.c
   *
   *  Copyright (C) 1992  by Linus Torvalds
   *  based on ideas by Darren Senn
   *
   * Fixes:
   * Michael. K. Johnson: stat,statm extensions.
   *                      <johnsonm@stolaf.edu>
   *
   * Pauline Middelink :  Made cmdline,envline only break at '\0's, to
   *                      make sure SET_PROCTITLE works. Also removed
   *                      bad '!' which forced address recalculation for
   *                      EVERY character on the current page.
   *                      <middelin@polyware.iaf.nl>
   *
   * Danny ter Haar    :	added cpuinfo
   *			<dth@cistron.nl>
   *
   * Alessandro Rubini :  profile extension.
   *                      <rubini@ipvvis.unipv.it>
   *
   * Jeff Tranter      :  added BogoMips field to cpuinfo
   *                      <Jeff_Tranter@Mitel.COM>
   *
   * Bruno Haible      :  remove 4K limit for the maps file
   *			<haible@ma2s2.mathematik.uni-karlsruhe.de>
   *
   * Yves Arrouye      :  remove removal of trailing spaces in get_array.
   *			<Yves.Arrouye@marin.fdn.fr>
   *
   * Jerome Forissier  :  added per-CPU time information to /proc/stat
   *                      and /proc/<pid>/cpu extension
   *                      <forissier@isia.cma.fr>
   *			- Incorporation and non-SMP safe operation
   *			of forissier patch in 2.1.78 by
   *			Hans Marcus <crowbar@concepts.nl>
   *
   * aeb@cwi.nl        :  /proc/partitions
   *
   *
   * Alan Cox	     :  security fixes.
   *			<Alan.Cox@linux.org>
   *
   * Al Viro           :  safe handling of mm_struct
   *
   * Gerhard Wichert   :  added BIGMEM support
   * Siemens AG           <Gerhard.Wichert@pdb.siemens.de>
   *
   * Al Viro & Jeff Garzik :  moved most of the thing into base.c and
   *			 :  proc_misc.c. The rest may eventually go into
   *			 :  base.c too.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
63
  #include <linux/types.h>
  #include <linux/errno.h>
  #include <linux/time.h>
  #include <linux/kernel.h>
  #include <linux/kernel_stat.h>
  #include <linux/tty.h>
  #include <linux/string.h>
  #include <linux/mman.h>
  #include <linux/proc_fs.h>
  #include <linux/ioport.h>
8ea026066   Ingo Molnar   [PATCH] sched: fi...
64
65
  #include <linux/uaccess.h>
  #include <linux/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
  #include <linux/mm.h>
  #include <linux/hugetlb.h>
  #include <linux/pagemap.h>
  #include <linux/swap.h>
  #include <linux/slab.h>
  #include <linux/smp.h>
  #include <linux/signal.h>
  #include <linux/highmem.h>
  #include <linux/file.h>
  #include <linux/times.h>
  #include <linux/cpuset.h>
4fb3a5386   Dipankar Sarma   [PATCH] files: fi...
77
  #include <linux/rcupdate.h>
258904546   Shailabh Nagar   [PATCH] per-task-...
78
  #include <linux/delayacct.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  #include <asm/pgtable.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
  #include <asm/processor.h>
  #include "internal.h"
  
  /* Gcc optimizes away "strlen(x)" for constant x */
  #define ADDBUF(buffer, string) \
  do { memcpy(buffer, string, strlen(string)); \
       buffer += strlen(string); } while (0)
8ea026066   Ingo Molnar   [PATCH] sched: fi...
88
  static inline char *task_name(struct task_struct *p, char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
  {
  	int i;
8ea026066   Ingo Molnar   [PATCH] sched: fi...
91
  	char *name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	char tcomm[sizeof(p->comm)];
  
  	get_task_comm(tcomm, p);
  
  	ADDBUF(buf, "Name:\t");
  	name = tcomm;
  	i = sizeof(tcomm);
  	do {
  		unsigned char c = *name;
  		name++;
  		i--;
  		*buf = c;
  		if (!c)
  			break;
  		if (c == '\\') {
  			buf[1] = c;
  			buf += 2;
  			continue;
  		}
  		if (c == '
  ') {
  			buf[0] = '\\';
  			buf[1] = 'n';
  			buf += 2;
  			continue;
  		}
  		buf++;
  	} while (i);
  	*buf = '
  ';
  	return buf+1;
  }
  
  /*
   * The task state array is a strange "bitmap" of
   * reasons to sleep. Thus "running" is zero, and
   * you can test for combinations of others with
   * simple bit tests.
   */
  static const char *task_state_array[] = {
  	"R (running)",		/*  0 */
  	"S (sleeping)",		/*  1 */
  	"D (disk sleep)",	/*  2 */
  	"T (stopped)",		/*  4 */
  	"T (tracing stop)",	/*  8 */
  	"Z (zombie)",		/* 16 */
  	"X (dead)"		/* 32 */
  };
8ea026066   Ingo Molnar   [PATCH] sched: fi...
140
  static inline const char *get_task_state(struct task_struct *tsk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  {
  	unsigned int state = (tsk->state & (TASK_RUNNING |
  					    TASK_INTERRUPTIBLE |
  					    TASK_UNINTERRUPTIBLE |
  					    TASK_STOPPED |
  					    TASK_TRACED)) |
  			(tsk->exit_state & (EXIT_ZOMBIE |
  					    EXIT_DEAD));
  	const char **p = &task_state_array[0];
  
  	while (state) {
  		p++;
  		state >>= 1;
  	}
  	return *p;
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
157
  static inline char *task_state(struct task_struct *p, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
  {
  	struct group_info *group_info;
  	int g;
badf16621   Dipankar Sarma   [PATCH] files: br...
161
  	struct fdtable *fdt = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162

b0fa9db6a   Oleg Nesterov   [PATCH] proc: dro...
163
  	rcu_read_lock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
  	buffer += sprintf(buffer,
  		"State:\t%s
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
171
172
173
174
175
176
177
178
179
  		"Tgid:\t%d
  "
  		"Pid:\t%d
  "
  		"PPid:\t%d
  "
  		"TracerPid:\t%d
  "
  		"Uid:\t%d\t%d\t%d\t%d
  "
  		"Gid:\t%d\t%d\t%d\t%d
  ",
  		get_task_state(p),
8ea026066   Ingo Molnar   [PATCH] sched: fi...
180
181
  		p->tgid, p->pid,
  		pid_alive(p) ? rcu_dereference(p->real_parent)->tgid : 0,
b0fa9db6a   Oleg Nesterov   [PATCH] proc: dro...
182
  		pid_alive(p) && p->ptrace ? rcu_dereference(p->parent)->pid : 0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  		p->uid, p->euid, p->suid, p->fsuid,
  		p->gid, p->egid, p->sgid, p->fsgid);
b0fa9db6a   Oleg Nesterov   [PATCH] proc: dro...
185

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
  	task_lock(p);
badf16621   Dipankar Sarma   [PATCH] files: br...
187
188
  	if (p->files)
  		fdt = files_fdtable(p->files);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
192
  	buffer += sprintf(buffer,
  		"FDSize:\t%d
  "
  		"Groups:\t",
badf16621   Dipankar Sarma   [PATCH] files: br...
193
  		fdt ? fdt->max_fds : 0);
4fb3a5386   Dipankar Sarma   [PATCH] files: fi...
194
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
197
198
  
  	group_info = p->group_info;
  	get_group_info(group_info);
  	task_unlock(p);
8ea026066   Ingo Molnar   [PATCH] sched: fi...
199
200
  	for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++)
  		buffer += sprintf(buffer, "%d ", GROUP_AT(group_info, g));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
204
205
206
  	put_group_info(group_info);
  
  	buffer += sprintf(buffer, "
  ");
  	return buffer;
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
207
  static char *render_sigset_t(const char *header, sigset_t *set, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
  {
  	int i, len;
  
  	len = strlen(header);
  	memcpy(buffer, header, len);
  	buffer += len;
  
  	i = _NSIG;
  	do {
  		int x = 0;
  
  		i -= 4;
  		if (sigismember(set, i+1)) x |= 1;
  		if (sigismember(set, i+2)) x |= 2;
  		if (sigismember(set, i+3)) x |= 4;
  		if (sigismember(set, i+4)) x |= 8;
  		*buffer++ = (x < 10 ? '0' : 'a' - 10) + x;
  	} while (i >= 4);
  
  	*buffer++ = '
  ';
  	*buffer = 0;
  	return buffer;
  }
  
  static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign,
  				    sigset_t *catch)
  {
  	struct k_sigaction *k;
  	int i;
  
  	k = p->sighand->action;
  	for (i = 1; i <= _NSIG; ++i, ++k) {
  		if (k->sa.sa_handler == SIG_IGN)
  			sigaddset(ign, i);
  		else if (k->sa.sa_handler != SIG_DFL)
  			sigaddset(catch, i);
  	}
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
247
  static inline char *task_sig(struct task_struct *p, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
  {
5e6b3f42e   Oleg Nesterov   [PATCH] proc: con...
249
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
254
255
256
257
258
259
  	sigset_t pending, shpending, blocked, ignored, caught;
  	int num_threads = 0;
  	unsigned long qsize = 0;
  	unsigned long qlim = 0;
  
  	sigemptyset(&pending);
  	sigemptyset(&shpending);
  	sigemptyset(&blocked);
  	sigemptyset(&ignored);
  	sigemptyset(&caught);
5e6b3f42e   Oleg Nesterov   [PATCH] proc: con...
260
261
  	rcu_read_lock();
  	if (lock_task_sighand(p, &flags)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
263
264
265
266
267
268
  		pending = p->pending.signal;
  		shpending = p->signal->shared_pending.signal;
  		blocked = p->blocked;
  		collect_sigign_sigcatch(p, &ignored, &caught);
  		num_threads = atomic_read(&p->signal->count);
  		qsize = atomic_read(&p->user->sigpending);
  		qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur;
5e6b3f42e   Oleg Nesterov   [PATCH] proc: con...
269
  		unlock_task_sighand(p, &flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
  	}
5e6b3f42e   Oleg Nesterov   [PATCH] proc: con...
271
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
  
  	buffer += sprintf(buffer, "Threads:\t%d
  ", num_threads);
  	buffer += sprintf(buffer, "SigQ:\t%lu/%lu
  ", qsize, qlim);
  
  	/* render them all */
  	buffer = render_sigset_t("SigPnd:\t", &pending, buffer);
  	buffer = render_sigset_t("ShdPnd:\t", &shpending, buffer);
  	buffer = render_sigset_t("SigBlk:\t", &blocked, buffer);
  	buffer = render_sigset_t("SigIgn:\t", &ignored, buffer);
  	buffer = render_sigset_t("SigCgt:\t", &caught, buffer);
  
  	return buffer;
  }
  
  static inline char *task_cap(struct task_struct *p, char *buffer)
  {
      return buffer + sprintf(buffer, "CapInh:\t%016x
  "
  			    "CapPrm:\t%016x
  "
  			    "CapEff:\t%016x
  ",
  			    cap_t(p->cap_inheritable),
  			    cap_t(p->cap_permitted),
  			    cap_t(p->cap_effective));
  }
b663a79c1   Maxim Uvarov   taskstats: add co...
300
301
302
303
304
305
306
307
308
309
  static inline char *task_context_switch_counts(struct task_struct *p,
  						char *buffer)
  {
  	return buffer + sprintf(buffer, "voluntary_ctxt_switches:\t%lu
  "
  			    "nonvoluntary_ctxt_switches:\t%lu
  ",
  			    p->nvcsw,
  			    p->nivcsw);
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
310
  int proc_pid_status(struct task_struct *task, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
  {
8ea026066   Ingo Molnar   [PATCH] sched: fi...
312
  	char *orig = buffer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
314
315
316
  	struct mm_struct *mm = get_task_mm(task);
  
  	buffer = task_name(task, buffer);
  	buffer = task_state(task, buffer);
8ea026066   Ingo Molnar   [PATCH] sched: fi...
317

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
320
321
322
323
324
  	if (mm) {
  		buffer = task_mem(mm, buffer);
  		mmput(mm);
  	}
  	buffer = task_sig(task, buffer);
  	buffer = task_cap(task, buffer);
  	buffer = cpuset_task_status_allowed(task, buffer);
347a8dc3b   Martin Schwidefsky   [PATCH] s390: cle...
325
  #if defined(CONFIG_S390)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  	buffer = task_show_regs(task, buffer);
  #endif
b663a79c1   Maxim Uvarov   taskstats: add co...
328
  	buffer = task_context_switch_counts(task, buffer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
  	return buffer - orig;
  }
b27f03d4b   Ingo Molnar   sched: make use o...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
  static clock_t task_utime(struct task_struct *p)
  {
  	clock_t utime = cputime_to_clock_t(p->utime),
  		total = utime + cputime_to_clock_t(p->stime);
  	u64 temp;
  
  	/*
  	 * Use CFS's precise accounting:
  	 */
  	temp = (u64)nsec_to_clock_t(p->se.sum_exec_runtime);
  
  	if (total) {
  		temp *= utime;
  		do_div(temp, total);
  	}
  	utime = (clock_t)temp;
  
  	return utime;
  }
  
  static clock_t task_stime(struct task_struct *p)
  {
5926c50b8   Ingo Molnar   [PATCH] sched: re...
353
  	clock_t stime;
b27f03d4b   Ingo Molnar   sched: make use o...
354
355
356
357
358
359
360
361
362
363
  
  	/*
  	 * Use CFS's precise accounting. (we subtract utime from
  	 * the total, to make sure the total observed by userspace
  	 * grows monotonically - apps rely on that):
  	 */
  	stime = nsec_to_clock_t(p->se.sum_exec_runtime) - task_utime(p);
  
  	return stime;
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
364
  static int do_task_stat(struct task_struct *task, char *buffer, int whole)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
366
367
368
369
370
371
  {
  	unsigned long vsize, eip, esp, wchan = ~0UL;
  	long priority, nice;
  	int tty_pgrp = -1, tty_nr = 0;
  	sigset_t sigign, sigcatch;
  	char state;
  	int res;
8ea026066   Ingo Molnar   [PATCH] sched: fi...
372
  	pid_t ppid = 0, pgid = -1, sid = -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
374
375
376
377
  	int num_threads = 0;
  	struct mm_struct *mm;
  	unsigned long long start_time;
  	unsigned long cmin_flt = 0, cmaj_flt = 0;
  	unsigned long  min_flt = 0,  maj_flt = 0;
b27f03d4b   Ingo Molnar   sched: make use o...
378
379
  	cputime_t cutime, cstime;
  	clock_t utime, stime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
  	unsigned long rsslim = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
  	char tcomm[sizeof(task->comm)];
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
382
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
385
386
387
388
389
390
391
392
393
394
395
396
  
  	state = *get_task_state(task);
  	vsize = eip = esp = 0;
  	mm = get_task_mm(task);
  	if (mm) {
  		vsize = task_vsize(mm);
  		eip = KSTK_EIP(task);
  		esp = KSTK_ESP(task);
  	}
  
  	get_task_comm(tcomm, task);
  
  	sigemptyset(&sigign);
  	sigemptyset(&sigcatch);
b27f03d4b   Ingo Molnar   sched: make use o...
397
398
  	cutime = cstime = cputime_zero;
  	utime = stime = 0;
3cfd0885f   Alan Cox   [PATCH] tty: stop...
399

a593d6ede   Oleg Nesterov   [PATCH] proc: con...
400
401
402
  	rcu_read_lock();
  	if (lock_task_sighand(task, &flags)) {
  		struct signal_struct *sig = task->signal;
915935041   Oleg Nesterov   [PATCH] do_task_s...
403
404
  
  		if (sig->tty) {
ab521dc0f   Eric W. Biederman   [PATCH] tty: upda...
405
  			tty_pgrp = pid_nr(sig->tty->pgrp);
915935041   Oleg Nesterov   [PATCH] do_task_s...
406
  			tty_nr = new_encode_dev(tty_devnum(sig->tty));
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
407
408
409
  		}
  
  		num_threads = atomic_read(&sig->count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
410
  		collect_sigign_sigcatch(task, &sigign, &sigcatch);
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
411
412
413
414
415
  		cmin_flt = sig->cmin_flt;
  		cmaj_flt = sig->cmaj_flt;
  		cutime = sig->cutime;
  		cstime = sig->cstime;
  		rsslim = sig->rlim[RLIMIT_RSS].rlim_cur;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
  		/* add up live thread stats at the group level */
  		if (whole) {
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
418
  			struct task_struct *t = task;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
421
  			do {
  				min_flt += t->min_flt;
  				maj_flt += t->maj_flt;
b27f03d4b   Ingo Molnar   sched: make use o...
422
423
  				utime += task_utime(t);
  				stime += task_stime(t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
425
  				t = next_thread(t);
  			} while (t != task);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426

a593d6ede   Oleg Nesterov   [PATCH] proc: con...
427
428
  			min_flt += sig->min_flt;
  			maj_flt += sig->maj_flt;
b27f03d4b   Ingo Molnar   sched: make use o...
429
430
  			utime += cputime_to_clock_t(sig->utime);
  			stime += cputime_to_clock_t(sig->stime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
  		}
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
432

1ec320afd   Cedric Le Goater   [PATCH] add proce...
433
  		sid = signal_session(sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
  		pgid = process_group(task);
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
435
436
437
  		ppid = rcu_dereference(task->real_parent)->tgid;
  
  		unlock_task_sighand(task, &flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
  	}
a593d6ede   Oleg Nesterov   [PATCH] proc: con...
439
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
440

8ea026066   Ingo Molnar   [PATCH] sched: fi...
441
  	if (!whole || num_threads < 2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
443
444
445
  		wchan = get_wchan(task);
  	if (!whole) {
  		min_flt = task->min_flt;
  		maj_flt = task->maj_flt;
b27f03d4b   Ingo Molnar   sched: make use o...
446
447
  		utime = task_utime(task);
  		stime = task_stime(task);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
449
450
451
452
453
454
455
456
  	}
  
  	/* scale priority and nice values from timeslices to -20..20 */
  	/* to make it look like a "normal" Unix priority/nice value  */
  	priority = task_prio(task);
  	nice = task_nice(task);
  
  	/* Temporary variable needed for gcc-2.96 */
  	/* convert timespec -> nsec*/
924b42d5a   Tomas Janousek   Use boot based ti...
457
458
459
  	start_time =
  		(unsigned long long)task->real_start_time.tv_sec * NSEC_PER_SEC
  				+ task->real_start_time.tv_nsec;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460
461
  	/* convert nsec -> ticks */
  	start_time = nsec_to_clock_t(start_time);
8ea026066   Ingo Molnar   [PATCH] sched: fi...
462
  	res = sprintf(buffer, "%d (%s) %c %d %d %d %d %d %u %lu \
4dee26b7e   Roman Zippel   [PATCH] hrtimers:...
463
  %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \
97dc32cdb   William Cohen   reduce size of ta...
464
465
  %lu %lu %lu %lu %lu %lu %lu %lu %d %d %u %u %llu
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
468
469
470
471
472
473
474
475
476
477
478
  		task->pid,
  		tcomm,
  		state,
  		ppid,
  		pgid,
  		sid,
  		tty_nr,
  		tty_pgrp,
  		task->flags,
  		min_flt,
  		cmin_flt,
  		maj_flt,
  		cmaj_flt,
b27f03d4b   Ingo Molnar   sched: make use o...
479
480
  		utime,
  		stime,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
481
482
483
484
485
  		cputime_to_clock_t(cutime),
  		cputime_to_clock_t(cstime),
  		priority,
  		nice,
  		num_threads,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
487
  		start_time,
  		vsize,
4294621f4   Hugh Dickins   [PATCH] mm: rss =...
488
  		mm ? get_mm_rss(mm) : 0,
8ea026066   Ingo Molnar   [PATCH] sched: fi...
489
  		rsslim,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
  		mm ? mm->start_code : 0,
  		mm ? mm->end_code : 0,
  		mm ? mm->start_stack : 0,
  		esp,
  		eip,
  		/* The signal information here is obsolete.
  		 * It must be decimal for Linux 2.0 compatibility.
  		 * Use /proc/#/status for real-time signals.
  		 */
  		task->pending.signal.sig[0] & 0x7fffffffUL,
  		task->blocked.sig[0] & 0x7fffffffUL,
  		sigign      .sig[0] & 0x7fffffffUL,
  		sigcatch    .sig[0] & 0x7fffffffUL,
  		wchan,
  		0UL,
  		0UL,
  		task->exit_signal,
  		task_cpu(task),
  		task->rt_priority,
258904546   Shailabh Nagar   [PATCH] per-task-...
509
510
  		task->policy,
  		(unsigned long long)delayacct_blkio_ticks(task));
8ea026066   Ingo Molnar   [PATCH] sched: fi...
511
  	if (mm)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
514
  		mmput(mm);
  	return res;
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
515
  int proc_tid_stat(struct task_struct *task, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
517
518
  {
  	return do_task_stat(task, buffer, 0);
  }
8ea026066   Ingo Molnar   [PATCH] sched: fi...
519
  int proc_tgid_stat(struct task_struct *task, char *buffer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
523
524
525
526
527
  {
  	return do_task_stat(task, buffer, 1);
  }
  
  int proc_pid_statm(struct task_struct *task, char *buffer)
  {
  	int size = 0, resident = 0, shared = 0, text = 0, lib = 0, data = 0;
  	struct mm_struct *mm = get_task_mm(task);
8ea026066   Ingo Molnar   [PATCH] sched: fi...
528

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
530
531
532
  	if (mm) {
  		size = task_statm(mm, &shared, &text, &data, &resident);
  		mmput(mm);
  	}
8ea026066   Ingo Molnar   [PATCH] sched: fi...
533
534
  	return sprintf(buffer, "%d %d %d %d %d %d %d
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
  		       size, resident, shared, text, lib, data, 0);
  }