[parisc-linux] [kaos@ocs.com.au: [RFC] 2.4.0-test6-pre2 Merge softirq, local_irq_count, local_bh_count]
Matthew Wilcox
matthew@wil.cx
Fri, 4 Aug 2000 10:26:45 -0400
we're not merged yet, which is why he didn't cc us. this patch may
be integrated the next time we get round to merging with Linus' tree
and we should be ready for it.
----- Forwarded message from Keith Owens <kaos@ocs.com.au> -----
Delivered-To: thepuffi-willy@thepuffingroup.com
X-Mailer: exmh version 2.1.1 10/15/1999
From: Keith Owens <kaos@ocs.com.au>
To: linux-arm-kernel@lists.arm.linux.org.uk, linuxppc-dev@lists.linuxppc.org,
linux-mips@fnet.fr, sparclinux@vger.rutgers.edu,
ultralinux@vger.rutgers.edu, linux-alpha@vger.rutgers.edu,
linux-kernel@vger.rutgers.edu, linux-ia64@linuxia64.org,
linux-vm@vm.marist.edu
Subject: [RFC] 2.4.0-test6-pre2 Merge softirq, local_irq_count, local_bh_count
Date: Fri, 04 Aug 2000 15:46:39 +1000
Precedence: bulk
X-Loop: majordomo@vger.rutgers.edu
This patch hits every arch. It is being cross mailed to every arch
mailing list that has not already confirmed that the patch works.
Please trim replies to the relevant mailing list.
Also please cc: kaos@ocs.com.au on replies, I am not on every list.
---
At the moment (2.4.0-test6-pre2) all architectures have a common
definition for softirq_state, it occupies its own cache line with a lot
of unused padding. The definitions for local_irq_count and
local_bh_count are all over the place, some architectures use a cache
aligned structure, some use arrays of integers (lets you play cache
ping/pong), some even use atomic_t.
Each arch defines its own set of mapping macros to get to
local_irq_count and local_bh_count. To add insult to injury, not all
architectures use the mapping macros, there are bits of code scattered
around that use hard coded array lookups which are not optimized for
SMP vs non-SMP.
ftp://ftp.ocs.com.au/pub/2.4.0-test6-pre2-softirq-bh-merge.gz is a
merge of softirq, local_irq_count and local_bh_count into one cache
aligned structure. The aim was :-
* Put all these fields in a per-cpu cache line. They are hit by the
same code paths and are only ever updated from one cpu. Softirq was
already cache aligned but the other fields were not, in most cases we
were using multiple cache lines for this data. On most archs this
will save a cache line. In the worst case we use the same number of
lines but still get a code cleanup.
* Replace all the explicit references like __local_irq_count[cpu] with
wrapper macros. Some arch's had already done this but there was
quite a bit of crud left.
* Replace multiple arch definitions and export of irq_stat with a
common one, optimized for SMP or non-SMP. I know that gcc should do
this, but proving it will always optimize was too messy so I went for
the safe case and hand optimized the definitions. Besides, s390 is
completely different (the story of my life ;).
* Create a standard definition for the wrappers that can be used by
almost all architectures. Only s390 and sparc64 are special cases
but every arch had its own slightly incompatible definition.
* Add a per-cpu syscall_count, ready for performance reporting on soft
interrupts as well as hard interrupts. This field is not being set
at the moment but will be easy to update once the above patch is
accepted.
I have updated all architectures, but have only been able to test this
patch on ix86 and IA64. Could the other arch maintainers try this
patch, it is almost guaranteed to contain some Assembler errors. If
your arch supports SMP, please try both UP and SMP.
I want to know if the patch works or not on each arch so I can send the
patch to Linus. So I would appreciate feedback on tests, whether
successful or not. m68k and super-h have already replied, nobody else
has confirmed one way or the other.
All architectures except s390 and sparc64 use the same definitions, see
include/linux/irq_cpustat.h. For all but s390, sparc64 and m68k,
please check the Assembler changes, the common code should be fine.
S390 No irq_stat structure, the equivalent fields are stored in
S390_lowcore. That moved cpu_data, ipl_device and the SMP info
area up by 16 bytes. There was no need for local_bh_count and
local_irq_count to be atomic. Please check the changes to
__LC_ in lowcore.h. Also the use of lowcore instead of
irq_stat[NR_CPUS] means that asm-s390/hardirq.h is quite
different from the other archs, it has its own unique
definitions for all the wrapper macros.
sparc64 For UP, it uses the common code, local_irq_count is an int in
irq_stat. For SMP, local_irq_count is a brlock in cpu_data.
asm-sparc64/hardirq.h defines a special SMP mapping for
local_irq_count.
m68k The change to arch/m68k/atari/ataints.c is a complete guess.
There were no examples of how to reference SYMBOL+8 from asm in
atari.
Files patched:
arch/alpha/kernel/alpha_ksyms.c
arch/alpha/kernel/entry.S
arch/alpha/kernel/irq_alpha.c
arch/alpha/kernel/irq_smp.c
arch/alpha/kernel/smp.c
arch/arm/kernel/armksyms.c
arch/arm/kernel/entry-common.S
arch/arm/kernel/irq.c
arch/i386/kernel/entry.S
arch/i386/kernel/i386_ksyms.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/irq.c
arch/i386/kernel/traps.c
arch/ia64/kernel/entry.S
arch/ia64/kernel/ia64_ksyms.c
arch/ia64/kernel/irq.c
arch/m68k/atari/ataints.c
arch/m68k/kernel/entry.S
arch/m68k/kernel/ints.c
arch/m68k/kernel/m68k_ksyms.c
arch/mips/baget/irq.c
arch/mips/dec/irq.c
arch/mips/kernel/entry.S
arch/mips/kernel/irq.c
arch/mips/kernel/mips_ksyms.c
arch/mips/kernel/scall_o32.S
arch/mips/orion/irq.c
arch/mips/sgi/kernel/indy_int.c
arch/mips64/kernel/entry.S
arch/mips64/kernel/scall_64.S
arch/mips64/kernel/scall_o32.S
arch/mips64/sgi-ip22/ip22-int.c
arch/mips64/sgi-ip27/ip27-irq.c
arch/ppc/kernel/entry.S
arch/ppc/kernel/irq.c
arch/ppc/kernel/local_irq.h
arch/ppc/kernel/ppc_ksyms.c
arch/s390/kernel/entry.S
arch/s390/kernel/irq.c
arch/s390/kernel/process.c
arch/s390/kernel/s390io.c
arch/s390/mm/fault.c
arch/sh/kernel/entry.S
arch/sh/kernel/irq.c
arch/sparc/kernel/irq.c
arch/sparc/kernel/rtrap.S
arch/sparc/kernel/sparc_ksyms.c
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/rtrap.S
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/sparc64_ksyms.c
include/asm-alpha/hardirq.h
include/asm-alpha/smp.h
include/asm-alpha/softirq.h
include/asm-arm/hardirq.h
include/asm-i386/hardirq.h
include/asm-ia64/hardirq.h
include/asm-m68k/hardirq.h
include/asm-m68k/softirq.h
include/asm-m68k/system.h
include/asm-mips/hardirq.h
include/asm-mips64/hardirq.h
include/asm-mips64/processor.h
include/asm-mips64/smp.h
include/asm-ppc/hardirq.h
include/asm-ppc/softirq.h
include/asm-s390/hardirq.h
include/asm-s390/irq.h
include/asm-s390/lowcore.h
include/asm-s390/softirq.h
include/asm-sh/hardirq.h
include/asm-sh/softirq.h
include/asm-sparc/hardirq.h
include/asm-sparc/irq.h
include/asm-sparc/softirq.h
include/asm-sparc64/hardirq.h
include/asm-sparc64/smp.h
include/asm-sparc64/softirq.h
include/linux/interrupt.h
include/linux/irq_cpustat.h
kernel/ksyms.c
kernel/sched.c
kernel/softirq.c
net/netsyms.c
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/
----- End forwarded message -----
--
Revolutions do not require corporate support.