.
OBS-URL: https://build.opensuse.org/package/show/Base:System/procps?expand=0&rev=21
This commit is contained in:
parent
92418027be
commit
8c80aee0f6
@ -69,7 +69,7 @@
|
||||
- return snprintf(outbuf, COLWID, "%u", pcpu/10U);
|
||||
+ jiffies = jiffies_since_boot - pp->start_time;
|
||||
+ if(jiffies) pcpu = (total_time * 1000ULL) / jiffies;
|
||||
+ if (pcpu/10U => 100U) /* do not confuse the user by scale effects */
|
||||
+ if (pcpu/10U >= 100U) /* do not confuse the user by scale effects */
|
||||
+ return snprintf(outbuf, COLWID, "100");
|
||||
return snprintf(outbuf, COLWID, "%u.%u", pcpu/10U, pcpu%10U);
|
||||
}
|
||||
|
226
procps-3.2.7-oom.diff
Normal file
226
procps-3.2.7-oom.diff
Normal file
@ -0,0 +1,226 @@
|
||||
Index: procps-3.2.7/top.c
|
||||
===================================================================
|
||||
--- procps-3.2.7.orig/top.c
|
||||
+++ procps-3.2.7/top.c
|
||||
@@ -23,9 +23,9 @@
|
||||
#include <sys/resource.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
-#include <ctype.h>
|
||||
+// #include <ctype.h>
|
||||
#include <curses.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
@@ -223,8 +223,11 @@ SCB_NUM1(P_SHR, share)
|
||||
SCB_NUM1(P_FLT, maj_flt)
|
||||
SCB_NUM1(P_DRT, dt)
|
||||
SCB_NUMx(P_STA, state)
|
||||
|
||||
+SCB_NUM1(P_OOM, oom_score)
|
||||
+SCB_NUM1(P_OOA, oom_adj)
|
||||
+
|
||||
static int sort_P_CMD (const proc_t **P, const proc_t **Q)
|
||||
{
|
||||
/* if a process doesn't have a cmdline, we'll consider it a kernel thread
|
||||
-- since displayed tasks are given special treatment, we must too */
|
||||
@@ -315,8 +318,13 @@ static const char *tg2 (int x, int y)
|
||||
{
|
||||
return Cap_can_goto ? tgoto(cursor_address, x, y) : "";
|
||||
}
|
||||
|
||||
+/* isupper/islower/toupper/tolower that work for '[{', '\\|', ']}', '^~' */
|
||||
+#define isupper(x) (x < 'a'? 1: 0)
|
||||
+#define islower(x) (x >= 'a'? 1: 0)
|
||||
+#define toupper(x) (x < 'a'? x: x-32)
|
||||
+#define tolower(x) (x >= 'a'? x: x+32)
|
||||
|
||||
/*###### Exit/Interrput routines #######################################*/
|
||||
|
||||
// The usual program end -- called only by functions in this section.
|
||||
@@ -1220,8 +1228,9 @@ static proc_t **procs_refresh (proc_t **
|
||||
// (own identifiers as documentation and protection against changes)
|
||||
#define L_stat PROC_FILLSTAT
|
||||
#define L_statm PROC_FILLMEM
|
||||
#define L_status PROC_FILLSTATUS
|
||||
+#define L_oom PROC_FILLOOM
|
||||
#define L_CMDLINE L_EITHER | PROC_FILLARG
|
||||
#define L_EUSER PROC_FILLUSR
|
||||
#define L_RUSER L_status | PROC_FILLUSR
|
||||
#define L_GROUP L_status | PROC_FILLGRP
|
||||
@@ -1273,8 +1282,10 @@ static FLD_t Fieldstab[] = {
|
||||
{ "XxXx", " COMMAND", " %-*.*s", -1, -1, SF(CMD), "Command name/line", L_EITHER },
|
||||
{ "YyUu", " WCHAN ", " %-9.9s", -1, -1, SF(WCH), "Sleeping in Function", L_stat },
|
||||
// next entry's special: the 0's will be replaced with '.'!
|
||||
{ "ZzZz", " Flags ", " %08lx", -1, -1, SF(FLG), "Task Flags <sched.h>", L_stat },
|
||||
+ { "[{[{", " Badness", "%8d", -1, -1, SF(OOM), "oom_score (badness)", L_oom },
|
||||
+ { "\\|\\|", " Adj", " %3d", -1, -1, SF(OOA), "oom_adjustment (2^X)", L_oom },
|
||||
#if 0
|
||||
{ "..Qq", " A", " %4.4s", 4, SK_no, SF(PID), "Accessed Page count", L_stat },
|
||||
{ "..Nn", " TRS", " %4.4s", 4, SK_Kb, SF(PID), "Code in memory (kb)", L_stat },
|
||||
{ "..Rr", " WP", " %4.4s", 4, SK_no, SF(PID), "Unwritable Pages", L_stat },
|
||||
@@ -1285,8 +1296,10 @@ static FLD_t Fieldstab[] = {
|
||||
#endif
|
||||
};
|
||||
#undef SF
|
||||
|
||||
+/* Last valid lowercase letter (z is folowed by {|}~, Z by [\\]^) */
|
||||
+#define LAST_CHR '|'
|
||||
|
||||
/* All right, those-that-follow -- Listen Up!
|
||||
* For the above table keys and the following present/future rc file
|
||||
* compatibility support, you have Mr. Albert D. Cahalan to thank.
|
||||
@@ -1419,8 +1432,21 @@ static int rc_read_new (const char *cons
|
||||
RCW_t *ptr = &rc->win[i];
|
||||
cnt = sscanf(cp, "%3s\tfieldscur=%31s\n", ptr->winname, ptr->fieldscur);
|
||||
if (cnt != 2) return 5+100*i; // OK to have less than 4 windows
|
||||
if (WINNAMSIZ <= strlen(ptr->winname)) return -6;
|
||||
+ /* Handle upgrade */
|
||||
+ if (strlen(DEF_FIELDS) - strlen(ptr->fieldscur) == 2) {
|
||||
+ const int ln = strlen(ptr->fieldscur);
|
||||
+ const unsigned char last = ptr->fieldscur[ln-1];
|
||||
+ /* If last field is command, insert two new fields prior to it */
|
||||
+ if (last == 'x' || last == 'X') {
|
||||
+ ptr->fieldscur[ln-1] = '{';
|
||||
+ ptr->fieldscur[ln ] = '|';
|
||||
+ ptr->fieldscur[ln+1] = last;
|
||||
+ ptr->fieldscur[ln+2] = 0;
|
||||
+ } else
|
||||
+ strcat(ptr->fieldscur, "{|");
|
||||
+ }
|
||||
if (strlen(DEF_FIELDS) != strlen(ptr->fieldscur)) return -7;
|
||||
cp = strchr(cp, '\n');
|
||||
if (!cp++) return -(8+100*i);
|
||||
|
||||
@@ -1694,9 +1720,9 @@ static void confighlp (char *fields) {
|
||||
else lower[c&0x1f]++;
|
||||
}
|
||||
|
||||
c = 'a';
|
||||
- while (c <= 'z') {
|
||||
+ while (c <= LAST_CHR) {
|
||||
if (upper[c&0x1f] && lower[c&0x1f]) {
|
||||
lower[c&0x1f] = 0; // got both, so wipe out unseen column
|
||||
for (;;) {
|
||||
cp = strchr(fields, c);
|
||||
@@ -3198,9 +3224,14 @@ static void task_show (const WIN_t *q, c
|
||||
} else {
|
||||
MKCOL(lookup_wchan(p->wchan, p->XXXID));
|
||||
}
|
||||
break;
|
||||
-
|
||||
+ case P_OOM:
|
||||
+ MKCOL(p->oom_score);
|
||||
+ break;
|
||||
+ case P_OOA:
|
||||
+ MKCOL(p->oom_adj);
|
||||
+ break;
|
||||
} /* end: switch 'procflag' */
|
||||
|
||||
rp = scat(rp, cbuf+advance);
|
||||
} /* end: for 'maxpflgs' */
|
||||
Index: procps-3.2.7/top.h
|
||||
===================================================================
|
||||
--- procps-3.2.7.orig/top.h
|
||||
+++ procps-3.2.7/top.h
|
||||
@@ -250,9 +250,10 @@ enum pflag {
|
||||
P_PRI, P_NCE,
|
||||
P_CPN, P_CPU, P_TME, P_TM2,
|
||||
P_MEM, P_VRT, P_SWP, P_RES, P_COD, P_DAT, P_SHR,
|
||||
P_FLT, P_DRT,
|
||||
- P_STA, P_CMD, P_WCH, P_FLG
|
||||
+ P_STA, P_CMD, P_WCH, P_FLG,
|
||||
+ P_OOM, P_OOA,
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -350,15 +351,15 @@ typedef struct WIN_t {
|
||||
#define RCF_EYECATCHER "RCfile for "
|
||||
#define RCF_DEPRECATED "Id:a, "
|
||||
|
||||
// The default fields displayed and their order,
|
||||
-#define DEF_FIELDS "AEHIOQTWKNMbcdfgjplrsuvyzX"
|
||||
+#define DEF_FIELDS "AEHIOQTWKNMbcdfgjplrsuvyz{|X"
|
||||
// Pre-configured field groupss
|
||||
-#define JOB_FIELDS "ABcefgjlrstuvyzMKNHIWOPQDX"
|
||||
-#define MEM_FIELDS "ANOPQRSTUVbcdefgjlmyzWHIKX"
|
||||
-#define USR_FIELDS "ABDECGfhijlopqrstuvyzMKNWX"
|
||||
+#define JOB_FIELDS "ABcefgjlrstuvyzMKNHIWOPQD{|X"
|
||||
+#define MEM_FIELDS "ANOPQRSTUVbcdefgjlmyzWHIK{|X"
|
||||
+#define USR_FIELDS "ABDECGfhijlopqrstuvyzMKNW{|X"
|
||||
// Used by fields_sort, placed here for peace-of-mind
|
||||
-#define NUL_FIELDS "abcdefghijklmnopqrstuvwxyz"
|
||||
+#define NUL_FIELDS "abcdefghijklmnopqrstuvwxyz{|"
|
||||
|
||||
|
||||
// The default values for the local config file
|
||||
#define DEF_RCFILE { \
|
||||
Index: procps-3.2.7/proc/readproc.h
|
||||
===================================================================
|
||||
--- procps-3.2.7.orig/proc/readproc.h
|
||||
+++ procps-3.2.7/proc/readproc.h
|
||||
@@ -138,9 +138,11 @@ typedef struct proc_t {
|
||||
fuid, fgid, // status fs (used for file access only)
|
||||
tpgid, // stat terminal process group id
|
||||
exit_signal, // stat might not be SIGCHLD
|
||||
processor; // stat current (or most recent?) CPU
|
||||
- char **cgroup; // cgroup current cgroup, looks like a classic filepath
|
||||
+ int oom_score, // oom_score (badness for OOM killer)
|
||||
+ oom_adj; // oom_adj (adjustment to OOM score)
|
||||
+ char **cgroup; // cgroup current cgroup, looks like a classic filepath
|
||||
} proc_t;
|
||||
|
||||
// PROCTAB: data structure holding the persistent information readproc needs
|
||||
// from openproc(). The setup is intentionally similar to the dirent interface
|
||||
@@ -240,8 +242,9 @@ extern proc_t * get_proc_stats(pid_t pid
|
||||
|
||||
#define PROC_LOOSE_TASKS 0x0200 // threat threads as if they were processes
|
||||
|
||||
#define PROC_FILLCGROUP 0x0400 // alloc and fill in `cgroup`
|
||||
+#define PROC_FILLOOM 0x0800 // alloc and fill in oom_score, oom_adj
|
||||
|
||||
// Obsolete, consider only processes with one of the passed:
|
||||
#define PROC_PID 0x1000 // process id numbers ( 0 terminated)
|
||||
#define PROC_UID 0x4000 // user id numbers ( length needed )
|
||||
Index: procps-3.2.7/proc/readproc.c
|
||||
===================================================================
|
||||
--- procps-3.2.7.orig/proc/readproc.c
|
||||
+++ procps-3.2.7/proc/readproc.c
|
||||
@@ -331,8 +331,19 @@ ENTER(0x220);
|
||||
LEAVE(0x220);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
+static void oomscore2proc(const char* S, proc_t *restrict P)
|
||||
+{
|
||||
+ sscanf(S, "%d", &P->oom_score);
|
||||
+}
|
||||
+
|
||||
+static void oomadj2proc(const char* S, proc_t *restrict P)
|
||||
+{
|
||||
+ sscanf(S, "%d", &P->oom_adj);
|
||||
+}
|
||||
+
|
||||
+///////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Reads /proc/*/stat files, being careful not to trip over processes with
|
||||
// names like ":-) 1 2 3 4 5 6".
|
||||
static void stat2proc(const char* S, proc_t *restrict P) {
|
||||
@@ -616,8 +627,15 @@ static proc_t* simple_readproc(PROCTAB *
|
||||
p->environ = file2strvec(path, "environ");
|
||||
else
|
||||
p->environ = NULL;
|
||||
|
||||
+ if (unlikely(flags & PROC_FILLOOM)) {
|
||||
+ if (likely( file2str(path, "oom_score", sbuf, sizeof sbuf) != -1 ))
|
||||
+ oomscore2proc(sbuf, p);
|
||||
+ if (likely( file2str(path, "oom_adj", sbuf, sizeof sbuf) != -1 ))
|
||||
+ oomadj2proc(sbuf, p);
|
||||
+ } /* struct has been zeroed out before, so no worries about clearing garbage here */
|
||||
+
|
||||
if(linux_version_code>=LINUX_VERSION(2,6,24) && (flags & PROC_FILLCGROUP)) {
|
||||
p->cgroup = file2strvec(path, "cgroup"); /* read /proc/#/cgroup */
|
||||
if(p->cgroup && *p->cgroup) {
|
||||
int i = strlen(*p->cgroup);
|
@ -1,17 +0,0 @@
|
||||
Index: procps-3.2.8/ps/output.c
|
||||
===================================================================
|
||||
--- procps-3.2.8.orig/ps/output.c
|
||||
+++ procps-3.2.8/ps/output.c
|
||||
@@ -463,11 +463,11 @@ static int pr_pcpu(char *restrict const
|
||||
double uptime_secs;
|
||||
total_time = pp->utime + pp->stime;
|
||||
if(include_dead_children) total_time += (pp->cutime + pp->cstime);
|
||||
jiffies = jiffies_since_boot - pp->start_time;
|
||||
if(jiffies) pcpu = (total_time * 1000ULL) / jiffies;
|
||||
- if (pcpu/10U => 100U) /* do not confuse the user by scale effects */
|
||||
+ if (pcpu/10U >= 100U) /* do not confuse the user by scale effects */
|
||||
return snprintf(outbuf, COLWID, "100");
|
||||
return snprintf(outbuf, COLWID, "%u.%u", pcpu/10U, pcpu%10U);
|
||||
}
|
||||
/* this is a "per-mill" format, like %cpu with no decimal point */
|
||||
static int pr_cp(char *restrict const outbuf, const proc_t *restrict const pp){
|
@ -1,5 +1,5 @@
|
||||
--- pmap.1
|
||||
+++ pmap.1 2009-05-11 12:14:59.377902682 +0200
|
||||
+++ pmap.1 2009-05-11 10:14:59.377902682 +0000
|
||||
@@ -1,39 +1,60 @@
|
||||
-'\" t
|
||||
-.\" (The preceding line is a note to broken versions of man to tell
|
||||
@ -91,8 +91,8 @@
|
||||
+The procps package is maintained by Albert Calahan. Please send
|
||||
+bug reports to <albert@users.sf.net>.
|
||||
--- pmap.c
|
||||
+++ pmap.c 2009-06-16 16:28:36.169902773 +0200
|
||||
@@ -1,372 +1,405 @@
|
||||
+++ pmap.c 2010-03-02 15:16:14.000127413 +0000
|
||||
@@ -1,372 +1,421 @@
|
||||
/*
|
||||
- * Copyright 2002 by Albert Cahalan; all rights reserved.
|
||||
- * This file may be used subject to the terms and conditions of the
|
||||
@ -201,9 +201,6 @@
|
||||
+#define OBJECTSIZE 1024
|
||||
|
||||
- if(shmdt(addr)) perror("shmdt");
|
||||
-
|
||||
-out_destroy:
|
||||
- if(shmctl(shmid, IPC_RMID, NULL)) perror("IPC_RMID");
|
||||
+struct smap {
|
||||
+ unsigned long size;
|
||||
+ unsigned long rss;
|
||||
@ -214,6 +211,8 @@
|
||||
+ unsigned long private_dirty;
|
||||
+ unsigned long referenced;
|
||||
+ unsigned long swap;
|
||||
+ unsigned long kernelpagesize;
|
||||
+ unsigned long mmupagesize;
|
||||
+};
|
||||
+
|
||||
+static unsigned long long range_low;
|
||||
@ -247,7 +246,8 @@
|
||||
+ "display this help\n");
|
||||
+}
|
||||
|
||||
- return;
|
||||
-out_destroy:
|
||||
- if(shmctl(shmid, IPC_RMID, NULL)) perror("IPC_RMID");
|
||||
+static int get_smap_data(struct smap *smap)
|
||||
+{
|
||||
+ unsigned long long data;
|
||||
@ -360,10 +360,25 @@
|
||||
+ if (!dopage)
|
||||
+ goto out;
|
||||
+
|
||||
+ /* get kernel page size */
|
||||
+ if (!fgets(buff, BUFFERSIZE, smaps_fp))
|
||||
+ return 1;
|
||||
+
|
||||
+ assigned = sscanf(buff, "KernelPageSize: %lld", &data);
|
||||
+ if (assigned != 1)
|
||||
+ return 1;
|
||||
+ smap->kernelpagesize = data;
|
||||
+
|
||||
+ /* get MMU page size */
|
||||
+ if (!fgets(buff, BUFFERSIZE, smaps_fp))
|
||||
+ return 1;
|
||||
+
|
||||
+ assigned = sscanf(buff, "MMUPageSize: %lld", &data);
|
||||
+ if (assigned != 1)
|
||||
+ return 1;
|
||||
+ smap->mmupagesize = data;
|
||||
|
||||
- return;
|
||||
+out:
|
||||
+ return 0;
|
||||
}
|
||||
@ -419,8 +434,7 @@
|
||||
|
||||
-static const char *mapping_name(proc_t *p, unsigned KLONG addr, unsigned KLONG len, const char *mapbuf, unsigned showpath, unsigned dev_major, unsigned dev_minor, unsigned long long inode){
|
||||
- const char *cp;
|
||||
+ printf("%c%c%c%c ", read_perm, write_perm, exec_perm, access_type);
|
||||
|
||||
-
|
||||
- if(!dev_major && dev_minor==shm_minor && strstr(mapbuf,"/SYSV")){
|
||||
- static char shmbuf[64];
|
||||
- snprintf(shmbuf, sizeof shmbuf, " [ shmid=0x%Lx ]", inode);
|
||||
@ -443,8 +457,7 @@
|
||||
- if( (p->start_stack >= addr) && (p->start_stack <= addr+len) ) cp = " [ stack ]";
|
||||
- return cp;
|
||||
-}
|
||||
+ if (show_devices)
|
||||
+ printf("%0*llx %02lx:%02lx ", WDT, offset, major, minor);
|
||||
+ printf("%c%c%c%c ", read_perm, write_perm, exec_perm, access_type);
|
||||
|
||||
-static int one_proc(proc_t *p){
|
||||
- char buf[32];
|
||||
@ -582,7 +595,9 @@
|
||||
- else printf(" total %8ldK\n", (total_shared + total_private_writeable + total_private_readonly) >> 10);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
+ if (show_devices)
|
||||
+ printf("%0*llx %02lx:%02lx ", WDT, offset, major, minor);
|
||||
|
||||
- return 0;
|
||||
+ printf("%s\n", obj_buff);
|
||||
}
|
||||
|
@ -1,3 +1,26 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 2 16:24:46 CET 2010 - werner@suse.de
|
||||
|
||||
- Add three changes from SLES11-SP1 (change for bnc#576073 is
|
||||
the same as for bnc#513542)
|
||||
- Include patch for fate##307524 into major patch of pmap
|
||||
- Inlcude patch for gcc 4.5 into major patch for accuracy
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Feb 3 11:22:54 CET 2010 - kukuk@suse.de
|
||||
|
||||
- Adjust pmap for new kernel [bnc#576073]
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 20 13:58:43 CET 2010 - mmarek@suse.cz
|
||||
|
||||
- Tune some kernel.sched_* variables on s390(x) (bnc#557307).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Aug 27 15:28:22 UTC 2009 - garloff@novell.com
|
||||
|
||||
- Add support for displaying oom_score (fate##307524).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Feb 22 22:25:48 CET 2010 - seife@opensuse.org
|
||||
|
||||
|
@ -35,6 +35,7 @@ Source: http://procps.sourceforge.net/procps-%version.tar.bz2
|
||||
Source1: boot.sysctl
|
||||
Source2: systat.xinetd
|
||||
Source3: sysctl.conf
|
||||
Source4: sysctl.conf.s390
|
||||
Patch: procps-3.2.3-make.diff
|
||||
Patch1: procps-3.2.2-100cpus.diff
|
||||
Patch2: procps-3.2.5-eof.diff
|
||||
@ -65,7 +66,7 @@ Patch28: procps-3.2.6-xen.dif
|
||||
Patch29: procps-3.2.8-fdleak.dif
|
||||
Patch30: procps-3.2.8-sysctlerr.dif
|
||||
Patch31: procps-3.2.8-columns.dif
|
||||
Patch32: procps-3.2.8-gcc45.diff
|
||||
Patch32: procps-3.2.7-oom.diff
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
|
||||
%description
|
||||
@ -136,7 +137,10 @@ make DESTDIR=$RPM_BUILD_ROOT install
|
||||
install -d $RPM_BUILD_ROOT/etc/init.d $RPM_BUILD_ROOT/etc/xinetd.d
|
||||
install -m 755 %SOURCE1 $RPM_BUILD_ROOT/etc/init.d
|
||||
install -m 644 %SOURCE2 $RPM_BUILD_ROOT/etc/xinetd.d/systat
|
||||
install -m 644 %SOURCE3 $RPM_BUILD_ROOT/etc
|
||||
case "$RPM_ARCH" in
|
||||
s390*) install -m 644 %SOURCE4 $RPM_BUILD_ROOT/etc/sysctl.conf ;;
|
||||
*) install -m 644 %SOURCE3 $RPM_BUILD_ROOT/etc/sysctl.conf ;;
|
||||
esac
|
||||
# clean unwanted files (coreutils)
|
||||
rm -f $RPM_BUILD_ROOT/bin/kill
|
||||
rm -f $RPM_BUILD_ROOT/usr/bin/uptime
|
||||
|
5
sysctl.conf.s390
Normal file
5
sysctl.conf.s390
Normal file
@ -0,0 +1,5 @@
|
||||
# performance tuning for s390(x)
|
||||
kernel.sched_min_granularity_ns = 10000000
|
||||
kernel.sched_wakeup_granularity_ns = 15000000
|
||||
kernel.sched_latency_ns = 80000000
|
||||
kernel.sched_tunable_scaling = 0
|
Loading…
x
Reference in New Issue
Block a user