linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Artur Skawina <skawina@geocities.com>
To: linux-kernel@vger.rutgers.edu
Cc: Kurt Garloff <kurt@garloff.de>
Subject: [RFC] increasing and masquerading HZ
Date: Tue, 20 Jul 1999 05:32:11 +0200	[thread overview]
Message-ID: <3793EDBB.6B7D7E12@geocities.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 735 bytes --]

The attached patch increases HZ to 800 for kernels compiled for 686
It tries to hide the HZ change from userspace. The places I found were:

o /proc/stat
o /proc/<pid>/stat
o /proc/<pid>/cpu
o BSD Process Accounting
o siginfo
o sys_times

Not handled:
o the ip routing sysctls [defined in jiffies...:( ]

also note there are drivers that assume HZ==100 (initio scsi for one).


The numbers I've got so far doesn't look very good however,
a 3% drop in performance (HZ=1024) is a bit much.


[I did this patch from scratch so that the chance of spotting all
 places requiring updates would be greater. turned up to be a good
 thing - it handles a few more cases than the previously mentioned
 patch by Kurt Garloff]

What did I miss? :)

[-- Attachment #2: linux-2.3.5as-hzmasq --]
[-- Type: text/plain, Size: 7466 bytes --]

diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/arch/i386/Makefile linux-2.3.5as/arch/i386/Makefile
--- /img/linux-2.3.5/arch/i386/Makefile	Thu May 20 01:59:04 1999
+++ linux-2.3.5as/arch/i386/Makefile	Tue Jul 20 02:13:13 1999
 endif
 
 ifdef CONFIG_M686
-CFLAGS := $(CFLAGS) -DCPU=686
+CFLAGS := $(CFLAGS) -DCPU=686 -DHZ=800
 AFLAGS := $(AFLAGS) -DCPU=686
 endif
 
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/arch/i386/kernel/irq.c linux-2.3.5as/arch/i386/kernel/irq.c
--- /img/linux-2.3.5/arch/i386/kernel/irq.c	Wed May 12 19:30:30 1999
+++ linux-2.3.5as/arch/i386/kernel/irq.c	Tue Jul 20 01:39:25 1999
@@ -1104,7 +1108,7 @@ __initfunc(void init_IRQ(void))
 	request_region(0xa0,0x20,"pic2");
 
 	/*
-	 * Set the clock to 100 Hz, we already have a valid
+	 * Set the clock to HZ Hz, we already have a valid
 	 * vector now:
 	 */
 	outb_p(0x34,0x43);		/* binary, mode 2, LSB/MSB, ch 0 */
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/fs/proc/array.c linux-2.3.5as/fs/proc/array.c
--- /img/linux-2.3.5/fs/proc/array.c	Sat May 15 13:08:42 1999
+++ linux-2.3.5as/fs/proc/array.c	Tue Jul 20 00:58:23 1999
@@ -240,19 +241,19 @@ static int get_kstat(char * buffer)
 #ifdef __SMP__
 	len = sprintf(buffer,
 		"cpu  %u %u %u %lu\n",
-		kstat.cpu_user,
-		kstat.cpu_nice,
-		kstat.cpu_system,
-		jiffies*smp_num_cpus - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system));
+		HZTOUSER(kstat.cpu_user),
+		HZTOUSER(kstat.cpu_nice),
+		HZTOUSER(kstat.cpu_system),
+		HZTOUSER(jiffies*smp_num_cpus - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system)));
 	for (i = 0 ; i < smp_num_cpus; i++)
 		len += sprintf(buffer + len, "cpu%d %u %u %u %lu\n",
 			i,
-			kstat.per_cpu_user[cpu_logical_map(i)],
-			kstat.per_cpu_nice[cpu_logical_map(i)],
-			kstat.per_cpu_system[cpu_logical_map(i)],
-			jiffies - (  kstat.per_cpu_user[cpu_logical_map(i)] \
+			HZTOUSER(kstat.per_cpu_user[cpu_logical_map(i)]),
+			HZTOUSER(kstat.per_cpu_nice[cpu_logical_map(i)]),
+			HZTOUSER(kstat.per_cpu_system[cpu_logical_map(i)]),
+			HZTOUSER(jiffies - (  kstat.per_cpu_user[cpu_logical_map(i)] \
 			           + kstat.per_cpu_nice[cpu_logical_map(i)] \
-			           + kstat.per_cpu_system[cpu_logical_map(i)]));
+			           + kstat.per_cpu_system[cpu_logical_map(i)])));
 	len += sprintf(buffer + len,
 		"disk %u %u %u %u\n"
 		"disk_rio %u %u %u %u\n"
@@ -273,10 +274,10 @@ static int get_kstat(char * buffer)
 		"page %u %u\n"
 		"swap %u %u\n"
 		"intr %u",
-		kstat.cpu_user,
-		kstat.cpu_nice,
-		kstat.cpu_system,
-		ticks - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system),
+		HZTOUSER(kstat.cpu_user),
+		HZTOUSER(kstat.cpu_nice),
+		HZTOUSER(kstat.cpu_system),
+		HZTOUSER(ticks - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system)),
 #endif
 		kstat.dk_drive[0], kstat.dk_drive[1],
 		kstat.dk_drive[2], kstat.dk_drive[3],
@@ -910,15 +911,15 @@ static int get_stat(int pid, char * buff
 		tsk->cmin_flt,
 		tsk->maj_flt,
 		tsk->cmaj_flt,
-		tsk->times.tms_utime,
-		tsk->times.tms_stime,
-		tsk->times.tms_cutime,
-		tsk->times.tms_cstime,
+		HZTOUSER(tsk->times.tms_utime),
+		HZTOUSER(tsk->times.tms_stime),
+		HZTOUSER(tsk->times.tms_cutime),
+		HZTOUSER(tsk->times.tms_cstime),
 		priority,
 		nice,
 		0UL /* removed */,
 		tsk->it_real_value,
-		tsk->start_time,
+		HZTOUSER(tsk->start_time),
 		vsize,
 		tsk->mm ? tsk->mm->rss : 0, /* you might want to shift this left 3 */
 		tsk->rlim ? tsk->rlim[RLIMIT_RSS].rlim_cur : 0,
@@ -1229,14 +1230,14 @@ static int get_pidcpu(int pid, char * bu
 
 	len = sprintf(buffer,
 		"cpu  %lu %lu\n",
-		tsk->times.tms_utime,
-		tsk->times.tms_stime);
+		HZTOUSER(tsk->times.tms_utime),
+		HZTOUSER(tsk->times.tms_stime));
 		
 	for (i = 0 ; i < smp_num_cpus; i++)
 		len += sprintf(buffer + len, "cpu%d %lu %lu\n",
 			i,
-			tsk->per_cpu_utime[cpu_logical_map(i)],
-			tsk->per_cpu_stime[cpu_logical_map(i)]);
+			HZTOUSER(tsk->per_cpu_utime[cpu_logical_map(i)]),
+			HZTOUSER(tsk->per_cpu_stime[cpu_logical_map(i)]));
 
 	return len;
 }
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/include/asm-i386/param.h linux-2.3.5as/include/asm-i386/param.h
--- /img/linux-2.3.5/include/asm-i386/param.h	Tue Aug  1 15:08:17 1995
+++ linux-2.3.5as/include/asm-i386/param.h	Tue Jul 20 02:14:21 1999
@@ -1,8 +1,18 @@
 #ifndef _ASMi386_PARAM_H
 #define _ASMi386_PARAM_H
 
+#include <linux/config.h>
+
 #ifndef HZ
 #define HZ 100
+#endif
+
+#if HZ!=100
+/*#define HZTOUSER(hz) (((hz)*100)/HZ) would be better, but could overflow*/
+#define HZTOUSER(hz)    ((hz)/(HZ/100))
+/*#define HZFROMUSER(hz)  ((hz)*(HZ/100)) hmm, these will be small values, right?*/
+#define HZFROMUSER(hz)  (((hz)*HZ)/100)
+#define HZ_MASQUERADING (HZ/100)    /* defined if masquerading, HZ/HZ_MASQUERADING==100 */
 #endif
 
 #define EXEC_PAGESIZE	4096
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/include/linux/param.h linux-2.3.5as/include/linux/param.h
--- /img/linux-2.3.5/include/linux/param.h	Tue Aug 15 13:25:06 1995
+++ linux-2.3.5as/include/linux/param.h	Tue Jul 20 02:14:42 1999
@@ -3,4 +3,10 @@
 
 #include <asm/param.h>
 
+/* if userspace sees the same HZ as the kernel then these are noops */
+#ifndef HZ_MASQUERADING
+#define HZTOUSER(hz)    (hz)
+#define HZFROMUSER(hz)  (hz)
+#endif
+
 #endif
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/kernel/acct.c linux-2.3.5as/kernel/acct.c
--- /img/linux-2.3.5/kernel/acct.c	Sat May  1 16:36:01 1999
+++ linux-2.3.5as/kernel/acct.c	Tue Jul 20 00:59:49 1999
@@ -292,9 +292,9 @@ static int do_acct_process(long exitcode
 	ac.ac_comm[ACCT_COMM - 1] = '\0';
 
 	ac.ac_btime = CT_TO_SECS(current->start_time) + (xtime.tv_sec - (jiffies / HZ));
-	ac.ac_etime = encode_comp_t(jiffies - current->start_time);
-	ac.ac_utime = encode_comp_t(current->times.tms_utime);
-	ac.ac_stime = encode_comp_t(current->times.tms_stime);
+	ac.ac_etime = encode_comp_t(HZTOUSER(jiffies - current->start_time));
+	ac.ac_utime = encode_comp_t(HZTOUSER(current->times.tms_utime));
+	ac.ac_stime = encode_comp_t(HZTOUSER(current->times.tms_stime));
 	ac.ac_uid = current->uid;
 	ac.ac_gid = current->gid;
 	ac.ac_tty = (current->tty) ? kdev_t_to_nr(current->tty->device) : 0;
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/kernel/signal.c linux-2.3.5as/kernel/signal.c
--- /img/linux-2.3.5/kernel/signal.c	Tue Jun  1 10:21:01 1999
+++ linux-2.3.5as/kernel/signal.c	Tue Jul 20 00:36:17 1999
@@ -583,8 +583,8 @@ notify_parent(struct task_struct *tsk, i
 	info.si_pid = tsk->pid;
 
 	/* FIXME: find out whether or not this is supposed to be c*time. */
-	info.si_utime = tsk->times.tms_utime;
-	info.si_stime = tsk->times.tms_stime;
+	info.si_utime = HZTOUSER(tsk->times.tms_utime);
+	info.si_stime = HZTOUSER(tsk->times.tms_stime);
 
 	why = SI_KERNEL;	/* shouldn't happen */
 	switch (tsk->state) {
diff -urNp --exclude-from /usr/src/lkdontdiff /img/linux-2.3.5/kernel/sys.c linux-2.3.5as/kernel/sys.c
--- /img/linux-2.3.5/kernel/sys.c	Sat May 15 13:08:47 1999
+++ linux-2.3.5as/kernel/sys.c	Tue Jul 20 00:41:43 1999
@@ -614,7 +616,13 @@ asmlinkage long sys_times(struct tms * t
 	if (tbuf)
 		if (copy_to_user(tbuf, &current->times, sizeof(struct tms)))
 			return -EFAULT;
-	return jiffies;
+#if HZ_MASQUERADING
+	tbuf->tms_utime  /= HZ_MASQUERADING;
+	tbuf->tms_stime  /= HZ_MASQUERADING;
+	tbuf->tms_cutime /= HZ_MASQUERADING;
+	tbuf->tms_cstime /= HZ_MASQUERADING;
+#endif
+	return HZTOUSER(jiffies);
 }
 
 /*

             reply	other threads:[~1999-07-20  3:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-07-20  3:32 Artur Skawina [this message]
1999-07-20  8:55 ` [RFC] increasing and masquerading HZ Kurt Garloff
1999-07-20 11:21   ` Artur Skawina

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3793EDBB.6B7D7E12@geocities.com \
    --to=skawina@geocities.com \
    --cc=kurt@garloff.de \
    --cc=linux-kernel@vger.rutgers.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).