Skip to contentSkip to conversation

VM fixes + RSS limits 2.4.0-test13-pre5

PATCH Peter Chubb 1 participant 1 message Jan 8, 2001

Subsystems (20)
lore
Share & tools
lore
#0 lore raw
Quoted 5 lines · Ingo
Quoted 4 lines · Rik van Riel
Quoted 2 lines · Mike Sklar

If I wanted to adjust the rlim_cur value of a running processes, is there any sort of interface for that?

Quoted 7 lines
Quoted 4 lines

Hmmm, I don't think there is an interface to adjust the per-process ulimit settings on-the-fly ...

Does anybody know if there's an interface for this ?

If you don't mean "kill -TERM", no there isn't. It would be evil to the process anyway.

The RSS limits patch I sent to linux-kernel some time ago provided an experimental /proc interface to allow exactly this.
The patch against 2.2.16 is still on our FTP server at

ftp://ftp-au.aurema.com/private/aurpjc31/linux-2216-rsslimit.diff.bz2

Here's the patch against 2.4.0. The main differences between this and Rik's patch are:
-- you choose soft or hard limits at kernel config time with my patch; with Rik's you get both (rlim_cur is soft' rlim_max is hard')
-- Rik's patch does some extra stuff to the VM code as well as
the RSS limits
-- Rik's patch doesn't affect swap behaviour (except in so far
as processes over their RSS limit will tend to swap, which reduces memory pressure on all other processes); my patch means that processes over RSS limit suffer somewhat
-- My patch puts the limit into the struct mm for slightly more
cache-friendly behaviour, and to allow later interfacing with per-user resource-management software (it should be possible to write a kernel module to adjust RSS limits to implement per-user limits without affecting per-process RLIMIT values)
-- My patch has a /proc interface to allow setting
rlimit[RLIMIT_RSS]
-- my patch implements the rss accounting fields so that time -v
gives reasonable output

Index: linux-2.4.0/CREDITS
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/CREDITS,v
retrieving revision 1.1.1.5

CREDITS +18 -0
diff -u -b -u -r1.1.1.5 CREDITS
@@ -491,6 +491,24 @@
 S: Stanford, California 94305
 S: USA
 
+N: Kingsley Cheung
+E: [email protected]
+D: Page fault calculation
+D: /proc/<pid>/rss support
+D: kswapd improvements regarding process RSS limits 
+S: Aurema Pty Limited
+S: PO Box 305, Strawberry Hills NSW 2012, 
+S: Australia 
+
+N: Peter Chubb
+E: [email protected]
+D: Page fault calculation
+D: /proc/<pid>/rss support
+D: kswapd improvements regarding process RSS limits 
+S: Aurema Pty Limited
+S: PO Box 305, Strawberry Hills NSW 2012, 
+S: Australia 
+
 N: Juan Jose Ciarlante
 W: http://juanjox.kernelnotes.org/
 E: [email protected]

Index: linux-2.4.0/Documentation/Configure.help
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/Documentation/Configure.help,v retrieving revision 1.1.1.6

Documentation/Configure.help +44 -0

50 lines not on this page · raw message

Index: linux-2.4.0/arch/alpha/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/alpha/config.in,v retrieving revision 1.1.1.5

arch/alpha/config.in +4 -0
diff -u -b -u -r1.1.1.5 config.in
@@ -231,6 +231,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\

Index: linux-2.4.0/arch/alpha/kernel/osf_sys.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/alpha/kernel/osf_sys.c,v retrieving revision 1.1.1.1

arch/alpha/kernel/osf_sys.c +12 -0
diff -u -b -u -r1.1.1.1 osf_sys.c
@@ -1164,6 +1164,10 @@
 		r.ru_minflt = current->min_flt;
 		r.ru_majflt = current->maj_flt;
 		r.ru_nswap = current->nswap;
+		r.ru_maxrss =  current->maxrss;
+		r.ru_ixrss = 0;
+		r.ru_idrss = current->irss;
+		r.ru_isrss = 0;
 		break;
 	case RUSAGE_CHILDREN:
 		r.ru_utime.tv_sec = CT_TO_SECS(current->times.tms_cutime);
@@ -1173,6 +1177,10 @@
 		r.ru_minflt = current->cmin_flt;
 		r.ru_majflt = current->cmaj_flt;
 		r.ru_nswap = current->cnswap;
+		r.ru_maxrss = current->cmaxrss;
+		r.ru_ixrss = 0;
+		r.ru_idrss = current->cirss;
+		r.ru_isrss = 0;
 		break;
 	default:
 		r.ru_utime.tv_sec = CT_TO_SECS(current->times.tms_utime +
@@ -1186,6 +1194,10 @@
 		r.ru_minflt = current->min_flt + current->cmin_flt;
 		r.ru_majflt = current->maj_flt + current->cmaj_flt;
 		r.ru_nswap = current->nswap + current->cnswap;
+		r.ru_maxrss = current->maxrss  >  current->cmaxrss ? current->maxrss : current->cmaxrss;
+		r.ru_ixrss = 0;
+		r.ru_idrss = current->irss + current>cirss;
+		r.ru_isrss = 0;
 		break;
 	}
 

Index: linux-2.4.0/arch/arm/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/arm/config.in,v retrieving revision 1.1.1.3

arch/arm/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -251,6 +251,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 tristate 'NWFPE math emulation' CONFIG_NWFPE
 choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\

Index: linux-2.4.0/arch/arm/mm/fault-common.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/arm/mm/fault-common.c,v retrieving revision 1.1.1.2

arch/arm/mm/fault-common.c +6 -0
diff -u -b -u -r1.1.1.2 fault-common.c
@@ -100,9 +100,15 @@
 	switch (fault) {
 	case 2:
 		tsk->maj_flt++;
+#if CONFIG_PROC_RSS
+		update_flt_rate(&(tsk->maj_flt_rate), &(tsk->maj_flt_time));
+#endif		
 		return fault;
 	case 1:
 		tsk->min_flt++;
+#if CONFIG_PROC_RSS
+		update_flt_rate(&(tsk->min_flt_rate), &(tsk->min_flt_time));
+#endif		
 	case 0:
 		return fault;
 	}

Index: linux-2.4.0/arch/i386/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/i386/config.in,v retrieving revision 1.1.1.5

arch/i386/config.in +4 -0
diff -u -b -u -r1.1.1.5 config.in
@@ -226,6 +226,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\

Index: linux-2.4.0/arch/i386/mm/fault.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/i386/mm/fault.c,v retrieving revision 1.1.1.3

arch/i386/mm/fault.c +11 -0
diff -u -b -u -r1.1.1.3 fault.c
@@ -4,6 +4,7 @@
  *  Copyright (C) 1995  Linus Torvalds
  */
 
+#include <linux/config.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -18,6 +19,10 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 
+#ifdef CONFIG_PROC_RSS
+#include <linux/rss.h>
+#endif
+
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/pgalloc.h>
@@ -196,9 +201,15 @@
 	switch (handle_mm_fault(mm, vma, address, write)) {
 	case 1:
 		tsk->min_flt++;
+#if CONFIG_PROC_RSS
+		update_flt_rate(&(tsk->maj_flt_rate), &(tsk->maj_flt_time));
+#endif		
 		break;
 	case 2:
 		tsk->maj_flt++;
+#if CONFIG_PROC_RSS
+		update_flt_rate(&(tsk->min_flt_rate), &(tsk->min_flt_time));
+#endif		
 		break;
 	case 0:
 		goto do_sigbus;

Index: linux-2.4.0/arch/ia64/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/ia64/config.in,v retrieving revision 1.1.1.4

arch/ia64/config.in +4 -0
diff -u -b -u -r1.1.1.4 config.in
@@ -93,6 +93,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
 

Index: linux-2.4.0/arch/ia64/ia32/binfmt_elf32.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/ia64/ia32/binfmt_elf32.c,v retrieving revision 1.1.1.3

arch/ia64/ia32/binfmt_elf32.c +2 -1
diff -u -b -u -r1.1.1.3 binfmt_elf32.c
@@ -204,7 +204,8 @@
 
 	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
 		if (bprm->page[i]) {
-			current->mm->rss++;
+			if (++(current->mm->rss) > current->mm->maxrss)
+				current->mm->maxrss = current->mm->rss;
 			put_dirty_page(current,bprm->page[i],stack_base);
 		}
 		stack_base += PAGE_SIZE;

Index: linux-2.4.0/arch/m68k/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/m68k/config.in,v retrieving revision 1.1.1.4

arch/m68k/config.in +4 -0
diff -u -b -u -r1.1.1.4 config.in
@@ -91,6 +91,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\

Index: linux-2.4.0/arch/m68k/atari/stram.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/m68k/atari/stram.c,v retrieving revision 1.1.1.2

arch/m68k/atari/stram.c +2 -1
diff -u -b -u -r1.1.1.2 stram.c
@@ -642,7 +642,8 @@
 	set_pte(dir, pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
 	swap_free(entry);
 	get_page(page);
-	++vma->vm_mm->rss;
+	if (++vma->vm_mm->rss > vma->vm_mm->maxrss)
+		vma->vm_mm->maxrss = vma->vm_mm->rss;
 }
 
 static inline void unswap_pmd(struct vm_area_struct * vma, pmd_t *dir,

Index: linux-2.4.0/arch/mips/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/mips/config.in,v retrieving revision 1.1.1.2

arch/mips/config.in +4 -0
diff -u -b -u -r1.1.1.2 config.in
@@ -168,6 +168,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 
 source drivers/parport/Config.in
 

Index: linux-2.4.0/arch/mips64/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/mips64/config.in,v retrieving revision 1.1.1.3

arch/mips64/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -104,6 +104,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 tristate 'Kernel support for 64-bit ELF binaries' CONFIG_BINFMT_ELF
 bool 'Kernel support for Linux/MIPS 32-bit binary compatibility' CONFIG_MIPS32_COMPAT
 if [ "$CONFIG_MIPS32_COMPAT" = "y" ]; then

Index: linux-2.4.0/arch/ppc/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/ppc/config.in,v retrieving revision 1.1.1.3

arch/ppc/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -118,6 +118,10 @@
 
 bool 'Networking support' CONFIG_NET
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 

Index: linux-2.4.0/arch/s390/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/s390/config.in,v retrieving revision 1.1.1.3

arch/s390/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -44,6 +44,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
 
 endmenu

Index: linux-2.4.0/arch/sh/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/sh/config.in,v retrieving revision 1.1.1.3

arch/sh/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -129,6 +129,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    choice 'Kernel core (/proc/kcore) format' \
 	"ELF		CONFIG_KCORE_ELF	\

Index: linux-2.4.0/arch/sparc/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/sparc/config.in,v retrieving revision 1.1.1.4

arch/sparc/config.in +4 -0
diff -u -b -u -r1.1.1.4 config.in
@@ -59,6 +59,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    define_bool CONFIG_KCORE_ELF y
 fi

Index: linux-2.4.0/arch/sparc64/config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/arch/sparc64/config.in,v retrieving revision 1.1.1.3

arch/sparc64/config.in +4 -0
diff -u -b -u -r1.1.1.3 config.in
@@ -51,6 +51,10 @@
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'RSS Softlimits (EXPERIMENTAL)' CONFIG_RSS_SOFTLIMIT
+  bool 'RSS Hardlimits (EXPERIMENTAL)' CONFIG_RSS_HARDLIMIT
+fi
 if [ "$CONFIG_PROC_FS" = "y" ]; then
    define_bool CONFIG_KCORE_ELF y
 fi

Index: linux-2.4.0/drivers/acpi/include/acgcc.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/include/acgcc.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/include/acgcc.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Name: acgcc.h - GCC specific defines, etc.
- *       $Revision: 1.1.1.2 $
+ *       $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/include/aclinux.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/include/aclinux.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/include/aclinux.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Name: aclinux.h - OS specific defines, etc.
- *       $Revision: 1.1.1.2 $
+ *       $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/include/actbl1.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/include/actbl1.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/include/actbl1.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Name: actbl1.h - ACPI 1.0 tables
- *       $Revision: 1.1.1.2 $
+ *       $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/include/actbl2.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/include/actbl2.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/include/actbl2.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Name: actbl2.h - ACPI Specification Revision 2.0 Tables
- *       $Revision: 1.1.1.2 $
+ *       $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/include/actbl71.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/include/actbl71.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/include/actbl71.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -3,7 +3,7 @@
  * Name: actbl71.h - IA-64 Extensions to the ACPI Spec Rev. 0.71
  *                   This file includes tables specific to this
  *                   specification revision.
- *       $Revision: 1.1.1.2 $
+ *       $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/namespace/nsinit.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/namespace/nsinit.c,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/namespace/nsinit.c +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Module Name: nsinit - namespace initialization
- *              $Revision: 1.1.1.2 $
+ *              $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/tables/tbconvrt.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/tables/tbconvrt.c,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/tables/tbconvrt.c +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Module Name: tbconvrt - ACPI Table conversion utilities
- *              $Revision: 1.1.1.2 $
+ *              $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/acpi/tables/tbxfroot.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/acpi/tables/tbxfroot.c,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/acpi/tables/tbxfroot.c +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Module Name: tbxfroot - Find the root ACPI table (RSDT)
- *              $Revision: 1.1.1.2 $
+ *              $Revision: 1.1.1.1 $
  *
  *****************************************************************************/
 

Index: linux-2.4.0/drivers/scsi/README.osst
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/scsi/README.osst,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/scsi/README.osst +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -189,7 +189,7 @@
 #!/bin/sh
 # Script to create OnStream SC-x0 device nodes (major 206)
 # Usage: Makedevs.sh [nos [path to dev]]
-# $Id: README.osst,v 1.1.1.2 2001/01/07 21:45:39 peterc Exp $
+# $Id: README.osst,v 1.1.1.1 2001/01/04 23:22:35 peterc Exp $
 major=206
 nrs=4
 dir=/dev

Index: linux-2.4.0/drivers/scsi/osst.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.c,v retrieving revision 1.1.1.2

drivers/scsi/osst.c +2 -2
diff -u -b -u -r1.1.1.2 osst.c
@@ -16,14 +16,14 @@
   Copyright 1992 - 2000 Kai Makisara
 		 email [email protected]
 
-  $Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.c,v 1.1.1.2 2001/01/07 21:45:39 peterc Exp $
+  $Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.c,v 1.1.1.1 2001/01/04 23:22:39 peterc Exp $
 
   Microscopic alterations - Rik Ling, 2000/12/21
   Last modified: Wed Feb  2 22:04:05 2000 by [email protected]
   Some small formal changes - aeb, 950809
 */
 
-static const char * cvsid = "$Id: osst.c,v 1.1.1.2 2001/01/07 21:45:39 peterc Exp $";
+static const char * cvsid = "$Id: osst.c,v 1.1.1.1 2001/01/04 23:22:39 peterc Exp $";
 const char * osst_version = "0.9.4.3";
 
 /* The "failure to reconnect" firmware bug */

Index: linux-2.4.0/drivers/scsi/osst.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/scsi/osst.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -1,5 +1,5 @@
 /*
- *	$Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.h,v 1.1.1.2 2001/01/07 21:45:39 peterc Exp $
+ *	$Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst.h,v 1.1.1.1 2001/01/04 23:22:39 peterc Exp $
  */
 
 #include <asm/byteorder.h>

Index: linux-2.4.0/drivers/scsi/osst_options.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst_options.h,v retrieving revision 1.1.1.2
retrieving revision 1.1.1.1

drivers/scsi/osst_options.h +1 -1
diff -u -b -u -r1.1.1.2 -r1.1.1.1
@@ -8,7 +8,7 @@
    Changed (and renamed) for OnStream SCSI drives [email protected]
    2000-06-21
 
-   $Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst_options.h,v 1.1.1.2 2001/01/07 21:45:39 peterc Exp $
+   $Header: /wrk/CVSROOT/linux-2.4/drivers/scsi/osst_options.h,v 1.1.1.1 2001/01/04 23:22:39 peterc Exp $
 */
 
 #ifndef _OSST_OPTIONS_H

Index: linux-2.4.0/fs/Config.in
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/fs/Config.in,v
retrieving revision 1.1.1.2

fs/Config.in +4 -0
diff -u -b -u -r1.1.1.2 Config.in
@@ -43,6 +43,10 @@
 
 bool '/proc file system support' CONFIG_PROC_FS
 
+if [ "$CONFIG_PROC_FS" = "y" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
+  bool 'Support for /proc/pid/rss? (EXPERIMENTAL)' CONFIG_PROC_RSS
+fi
+
 dep_bool '/dev file system support (EXPERIMENTAL)' CONFIG_DEVFS_FS $CONFIG_EXPERIMENTAL
 dep_bool '  Automatically mount at boot' CONFIG_DEVFS_MOUNT $CONFIG_DEVFS_FS
 dep_bool '  Debug devfs' CONFIG_DEVFS_DEBUG $CONFIG_DEVFS_FS

Index: linux-2.4.0/fs/exec.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/fs/exec.c,v
retrieving revision 1.1.1.6

fs/exec.c +2 -1
diff -u -b -u -r1.1.1.6 exec.c
@@ -321,7 +321,8 @@
 		struct page *page = bprm->page[i];
 		if (page) {
 			bprm->page[i] = NULL;
-			current->mm->rss++;
+			if (++current->mm->rss > current->mm->maxrss)
+				current->mm->maxrss = current->mm->rss;
 			put_dirty_page(current,page,stack_base);
 		}
 		stack_base += PAGE_SIZE;

Index: linux-2.4.0/fs/proc/Makefile
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/fs/proc/Makefile,v retrieving revision 1.1.1.2

fs/proc/Makefile +2 -3
diff -u -b -u -r1.1.1.2 Makefile
@@ -14,8 +14,7 @@
 obj-y    := inode.o root.o base.o generic.o array.o \
 		kmsg.o proc_tty.o proc_misc.o kcore.o procfs_syms.o
 
-ifeq ($(CONFIG_PROC_DEVICETREE),y)
-obj-y += proc_devtree.o
-endif
+obj-$(CONFIG_PROC_DEVICETREE) += proc_devtree.o
+obj-$(CONFIG_PROC_RSS) += rss.o
 
 include $(TOPDIR)/Rules.make

Index: linux-2.4.0/fs/proc/base.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/fs/proc/base.c,v
retrieving revision 1.1.1.3

fs/proc/base.c +26 -0
diff -u -b -u -r1.1.1.3 base.c
@@ -11,6 +11,8 @@
  *  go into icache. We cache the reference to task_struct upon lookup too.
  *  Eventually it should become a filesystem in its own. We don't use the
  *  rest of procfs anymore.
+ *
+ *  Added support for /proc/<pid>/rss, 20.01.2000, Kingsley Cheung *
  */
 
 #include <asm/uaccess.h>
@@ -39,6 +41,10 @@
 int proc_pid_status(struct task_struct*,char*);
 int proc_pid_statm(struct task_struct*,char*);
 int proc_pid_cpu(struct task_struct*,char*);
+#ifdef CONFIG_PROC_RSS
+int proc_pid_rss_read(struct task_struct*,char*);
+ssize_t proc_pid_rss_write(struct task_struct*,struct file*,char*,size_t,loff_t*);
+#endif
 
 static int proc_fd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
 {
@@ -309,6 +315,14 @@
 	read:		proc_info_read,
 };
 
+#ifdef CONFIG_PROC_RSS
+static struct file_operations proc_rss_file_operations = {
+	read:		proc_info_read,
+	write:		proc_pid_rss_write,
+};
+#endif
+
+
 #define MAY_PTRACE(p) \
 (p==current||(p->p_pptr==current&&(p->ptrace & PT_PTRACED)&&p->state==TASK_STOPPED))
 
@@ -495,6 +509,9 @@
 	PROC_PID_STATM,
 	PROC_PID_MAPS,
 	PROC_PID_CPU,
+#ifdef CONFIG_PROC_RSS
+	PROC_PID_RSS,
+#endif /* CONFIG_PROC_RSS */
 	PROC_PID_FD_DIR = 0x8000,	/* 0x8000-0xffff */
 };
 
@@ -514,6 +531,9 @@
   E(PROC_PID_CWD,	"cwd",		S_IFLNK|S_IRWXUGO),
   E(PROC_PID_ROOT,	"root",		S_IFLNK|S_IRWXUGO),
   E(PROC_PID_EXE,	"exe",		S_IFLNK|S_IRWXUGO),
+#ifdef CONFIG_PROC_RSS
+  E(PROC_PID_RSS,	"rss",		S_IFREG|S_IRUGO|S_IWUSR),
+#endif
   {0,0,NULL,0}
 };
 #undef E
@@ -860,6 +880,12 @@
 			inode->i_op = &proc_mem_inode_operations;
 			inode->i_fop = &proc_mem_operations;
 			break;
+#ifdef CONFIG_PROC_RSS
+		case PROC_PID_RSS:
+			inode->i_fop = &proc_info_file_operations;
+			inode->u.proc_i.op.proc_read = proc_pid_rss_read;
+			break;
+#endif
 		default:
 			printk("procfs: impossible type (%d)",p->type);
 			iput(inode);

Index: linux-2.4.0/include/linux/sched.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/include/linux/sched.h,v retrieving revision 1.1.1.6

include/linux/sched.h +11 -1
diff -u -b -u -r1.1.1.6 sched.h
@@ -216,7 +216,9 @@
 	unsigned long start_code, end_code, start_data, end_data;
 	unsigned long start_brk, brk, start_stack;
 	unsigned long arg_start, arg_end, env_start, env_end;
-	unsigned long rss, total_vm, locked_vm;
+	unsigned long rss;
+	unsigned long maxrss, rss_limit;
+	unsigned long total_vm, locked_vm;
 	unsigned long def_flags;
 	unsigned long cpu_vm_mask;
 	unsigned long swap_cnt;	/* number of pages to swap on next pass */
@@ -351,6 +353,14 @@
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
 	unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
 	int swappable:1;
+/* #if CONFIG_PROC_RSS keep same size, but do we remove ifdefs in fork too? */
+/* major and minor page fault rates and time of occurence */
+	unsigned long maj_flt_rate, min_flt_rate;  /* in pages per second */
+	unsigned long maj_flt_time, min_flt_time;  /* in seconds */
+/* #endif */
+/* rss statistics -- maxrss is in the struct mm */
+	unsigned long irss;
+	unsigned long cmaxrss, cirss;
 /* process credentials */
 	uid_t uid,euid,suid,fsuid;
 	gid_t gid,egid,sgid,fsgid;

Index: linux-2.4.0/include/linux/swap.h
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/include/linux/swap.h,v retrieving revision 1.1.1.4

include/linux/swap.h +3 -0
diff -u -b -u -r1.1.1.4 swap.h
@@ -109,6 +109,9 @@
 extern int inactive_shortage(void);
 extern void wakeup_kswapd(int);
 extern int try_to_free_pages(unsigned int gfp_mask);
+#ifdef CONFIG_RSS_HARDLIMIT 
+extern int try_to_swap_out_page(unsigned int gfp_mask);
+#endif
 
 /* linux/mm/page_io.c */
 extern void rw_swap_page(int, struct page *, int);

Index: linux-2.4.0/kernel/exit.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/kernel/exit.c,v
retrieving revision 1.1.1.5

kernel/exit.c +10 -0
diff -u -b -u -r1.1.1.5 exit.c
@@ -49,6 +49,8 @@
 		current->cmin_flt += p->min_flt + p->cmin_flt;
 		current->cmaj_flt += p->maj_flt + p->cmaj_flt;
 		current->cnswap += p->nswap + p->cnswap;
+		if (p->cmaxrss > current->cmaxrss)
+			current->cmaxrss = p->cmaxrss;
 		/*
 		 * Potentially available timeslices are retrieved
 		 * here - this way the parent does not get penalized
@@ -308,6 +310,14 @@
 		if (mm != tsk->active_mm) BUG();
 		/* more a memory barrier than a real lock */
 		task_lock(tsk);
+		/* 
+		 * can't do this at wait() time, because mm is gone by then.
+		 */
+		if (tsk->p_pptr) {
+			if (mm->maxrss > tsk->p_pptr->cmaxrss)
+				tsk->p_pptr->cmaxrss = mm->maxrss;
+		}
+
 		tsk->mm = NULL;
 		task_unlock(tsk);
 		enter_lazy_tlb(mm, current, smp_processor_id());

Index: linux-2.4.0/kernel/fork.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/kernel/fork.c,v
retrieving revision 1.1.1.5

kernel/fork.c +7 -0
diff -u -b -u -r1.1.1.5 fork.c
@@ -202,6 +202,7 @@
 	atomic_set(&mm->mm_users, 1);
 	atomic_set(&mm->mm_count, 1);
 	init_MUTEX(&mm->mmap_sem);
+	mm->maxrss = mm->rss;
 	mm->page_table_lock = SPIN_LOCK_UNLOCKED;
 	mm->pgd = pgd_alloc();
 	if (mm->pgd)
@@ -284,6 +285,12 @@
 	tsk->min_flt = tsk->maj_flt = 0;
 	tsk->cmin_flt = tsk->cmaj_flt = 0;
 	tsk->nswap = tsk->cnswap = 0;
+	tsk->irss = 0;
+	tsk->cmaxrss = tsk->cirss = 0;
+#if CONFIG_PROC_RSS
+	tsk->maj_flt_time = tsk->min_flt_time = tsk->start_time / HZ;
+	tsk->maj_flt_rate = tsk->min_flt_rate = 0;
+#endif
 
 	tsk->mm = NULL;
 	tsk->active_mm = NULL;

Index: linux-2.4.0/kernel/sys.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/kernel/sys.c,v
retrieving revision 1.1.1.2

kernel/sys.c +16 -0
diff -u -b -u -r1.1.1.2 sys.c
@@ -1077,6 +1077,10 @@
 			return -EPERM;
 	}
 	*old_rlim = new_rlim;
+
+	if (resource == RLIMIT_RSS && current->mm != &init_mm)
+		current->mm->rss_limit = (new_rlim.rlim_cur == RLIM_INFINITY) ? ULONG_MAX : (new_rlim.rlim_cur >> PAGE_SHIFT);
+
 	return 0;
 }
 
@@ -1111,6 +1115,10 @@
 			r.ru_minflt = p->min_flt;
 			r.ru_majflt = p->maj_flt;
 			r.ru_nswap = p->nswap;
+			r.ru_maxrss = p->mm->maxrss;
+			r.ru_ixrss = 0;
+			r.ru_idrss = p->irss;
+			r.ru_isrss = 0;
 			break;
 		case RUSAGE_CHILDREN:
 			r.ru_utime.tv_sec = CT_TO_SECS(p->times.tms_cutime);
@@ -1120,6 +1128,10 @@
 			r.ru_minflt = p->cmin_flt;
 			r.ru_majflt = p->cmaj_flt;
 			r.ru_nswap = p->cnswap;
+			r.ru_maxrss = p->cmaxrss;
+			r.ru_ixrss = 0;
+			r.ru_idrss = p->cirss;
+			r.ru_isrss = 0;
 			break;
 		default:
 			r.ru_utime.tv_sec = CT_TO_SECS(p->times.tms_utime + p->times.tms_cutime);
@@ -1129,6 +1141,10 @@
 			r.ru_minflt = p->min_flt + p->cmin_flt;
 			r.ru_majflt = p->maj_flt + p->cmaj_flt;
 			r.ru_nswap = p->nswap + p->cnswap;
+			r.ru_maxrss = p->mm->maxrss  >  p->cmaxrss ? p->mm->maxrss : p->cmaxrss;
+			r.ru_ixrss = 0;
+			r.ru_idrss = p->irss + p->cirss;
+			r.ru_isrss = 0;
 			break;
 	}
 	return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;

Index: linux-2.4.0/kernel/timer.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/kernel/timer.c,v
retrieving revision 1.1.1.3

kernel/timer.c +3 -0
diff -u -b -u -r1.1.1.3 timer.c
@@ -567,6 +567,9 @@
 {
 	p->per_cpu_utime[cpu] += user;
 	p->per_cpu_stime[cpu] += system;
+	if (p->mm)
+		p->irss += p->mm->rss;
+	
 	do_process_times(p, user, system);
 	do_it_virt(p, user);
 	do_it_prof(p);

Index: linux-2.4.0/mm/filemap.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/mm/filemap.c,v
retrieving revision 1.1.1.6

mm/filemap.c +4 -0
diff -u -b -u -r1.1.1.6 filemap.c
@@ -1967,8 +1967,12 @@
 
 	/* Make sure this doesn't exceed the process's max rss. */
 	error = -EIO;
+#if defined(CONFIG_RSS_HARDLIMIT) || defined(CONFIG_RSS_SOFTLIMIT)
+	rlim_rss = vma->vm_mm->rss_limit;
+#else
 	rlim_rss = current->rlim ?  current->rlim[RLIMIT_RSS].rlim_cur :
 				LONG_MAX; /* default: see resource.h */
+#endif
 	if ((vma->vm_mm->rss + (end - start)) > rlim_rss)
 		return error;
 

Index: linux-2.4.0/mm/memory.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/mm/memory.c,v
retrieving revision 1.1.1.6

mm/memory.c +19 -5
diff -u -b -u -r1.1.1.6 memory.c
@@ -872,7 +872,8 @@
 	 */
 	if (pte_same(*page_table, pte)) {
 		if (PageReserved(old_page))
-			++mm->rss;
+			if (++mm->rss > mm->maxrss)
+				mm->maxrss = mm->rss;
 		break_cow(vma, old_page, new_page, address, page_table);
 
 		/* Free the old page.. */
@@ -1019,9 +1020,15 @@
 	struct vm_area_struct * vma, unsigned long address,
 	pte_t * page_table, swp_entry_t entry, int write_access)
 {
-	struct page *page = lookup_swap_cache(entry);
+	struct page *page;
 	pte_t pte;
 
+#ifdef CONFIG_RSS_HARDLIMIT
+	if (mm->rss >= mm->rss_limit)
+		try_to_shrink_rss(mm, GFP_USER);
+#endif
+
+	page = lookup_swap_cache(entry);
 	if (!page) {
 		lock_kernel();
 		swapin_readahead(entry);
@@ -1034,7 +1041,8 @@
 		flush_icache_page(vma, page);
 	}
 
-	mm->rss++;
+	if (++mm->rss > mm->maxrss)
+		mm->maxrss = mm->rss;
 
 	pte = mk_pte(page, vma->vm_page_prot);
 
@@ -1062,13 +1070,18 @@
 {
 	struct page *page = NULL;
 	pte_t entry = pte_wrprotect(mk_pte(ZERO_PAGE(addr), vma->vm_page_prot));
+#ifdef CONFIG_RSS_HARDLIMIT
+	if (mm->rss > mm->rss_limit)
+		try_to_shrink_rss(mm, GFP_USER);
+#endif
 	if (write_access) {
 		page = alloc_page(GFP_HIGHUSER);
 		if (!page)
 			return -1;
 		clear_user_highpage(page, addr);
 		entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
-		mm->rss++;
+		if (++mm->rss > mm->maxrss)
+			mm->maxrss = mm->rss;
 		flush_page_to_ram(page);
 	}
 	set_pte(page_table, entry);
@@ -1107,7 +1120,8 @@
 		return 0;
 	if (new_page == NOPAGE_OOM)
 		return -1;
-	++mm->rss;
+	if (++mm->rss > mm->maxrss)
+		mm->maxrss = mm->rss;
 	/*
 	 * This silly early PAGE_DIRTY setting removes a race
 	 * due to the bad i386 page protection. But it's valid

Index: linux-2.4.0/mm/swapfile.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/mm/swapfile.c,v
retrieving revision 1.1.1.3

mm/swapfile.c +2 -1
diff -u -b -u -r1.1.1.3 swapfile.c
@@ -231,7 +231,8 @@
 	set_pte(dir, pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
 	swap_free(entry);
 	get_page(page);
-	++vma->vm_mm->rss;
+	if (++vma->vm_mm->rss > vma->vm_mm->maxrss)
+		vma->vm_mm->maxrss = vma->vm_mm->rss;
 }
 
 static inline void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,

Index: linux-2.4.0/mm/vmscan.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/mm/vmscan.c,v
retrieving revision 1.1.1.6

mm/vmscan.c +100 -0

113 lines not on this page · raw message

Index: linux-2.4.0/fs/proc/rss.c
===================================================================
RCS file: /wrk/CVSROOT/linux-2.4/fs/proc/rss.c
retrieving revision 1.1

fs/proc/rss.c new file +239 -0

239 lines not on this page · raw message

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/