* [PATCH v3 0/4] Use macros rather than hardcoding section names
@ 2009-09-20 18:43 Tim Abbott
2009-09-20 18:43 ` [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts Tim Abbott
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 18:43 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Sam Ravnborg, Tim Abbott
This patch series cleans up the kernel's explicit references to
.data.page_aligned, .bss.page_aligned, and .data.init_task in C and
assembly code to instead use the standard macros for that purpose.
Version 3 differs from version 2 in two ways:
- The .data.init_task patch also updates the score architecture
- The powerpc __page_aligned_data patch was removed (since Benjamin
Herrenschmidt said he was taking it).
Version 2 differed from version 1 in that it added the kbuild patch,
fixing breakage in the x86 linker script caused indirectly by
including linux/linkage.h in x86's asm/cache.h.
This cleanup is in preparation for being able to change the names of
the .data.page_aligned and .bss.page_aligned sections to be
compatible with -ffunction-sections -fdata-sections (a prerequisite
for Ksplice).
Joe Perches (1):
Use new __init_task_data macro in arch init_task.c files.
Tim Abbott (3):
kbuild: Don't define ALIGN and ENTRY when preprocessing linker
scripts.
Use macros for .bss.page_aligned section.
Use macros for .data.page_aligned section.
arch/arm/kernel/init_task.c | 5 ++---
arch/avr32/kernel/init_task.c | 5 ++---
arch/avr32/mm/init.c | 4 +---
arch/cris/kernel/process.c | 5 ++---
arch/frv/kernel/init_task.c | 5 ++---
arch/h8300/kernel/init_task.c | 5 ++---
arch/ia64/kernel/init_task.c | 3 ++-
arch/m32r/kernel/init_task.c | 5 ++---
arch/m68k/kernel/process.c | 6 +++---
arch/m68knommu/kernel/init_task.c | 5 ++---
arch/microblaze/kernel/init_task.c | 5 ++---
arch/mips/kernel/init_task.c | 5 ++---
arch/mn10300/kernel/init_task.c | 5 ++---
arch/parisc/kernel/init_task.c | 4 ++--
arch/powerpc/kernel/init_task.c | 5 ++---
arch/powerpc/kernel/machine_kexec_64.c | 5 +++--
arch/powerpc/kernel/vdso.c | 3 ++-
arch/powerpc/kernel/vdso32/vdso32_wrapper.S | 3 ++-
arch/powerpc/kernel/vdso64/vdso64_wrapper.S | 3 ++-
arch/s390/kernel/init_task.c | 5 ++---
arch/s390/kernel/vdso.c | 2 +-
arch/s390/kernel/vdso32/vdso32_wrapper.S | 3 ++-
arch/s390/kernel/vdso64/vdso64_wrapper.S | 3 ++-
arch/score/kernel/init_task.c | 5 ++---
arch/sh/kernel/init_task.c | 5 ++---
arch/sh/kernel/irq.c | 6 ++----
arch/sparc/kernel/init_task.c | 5 ++---
arch/um/kernel/init_task.c | 5 ++---
arch/x86/include/asm/cache.h | 4 +++-
arch/x86/kernel/head_32.S | 4 ++--
arch/x86/kernel/head_64.S | 2 +-
arch/x86/kernel/init_task.c | 5 ++---
arch/xtensa/kernel/head.S | 2 +-
arch/xtensa/kernel/init_task.c | 5 ++---
include/linux/linkage.h | 2 ++
scripts/Makefile.build | 3 ++-
36 files changed, 71 insertions(+), 81 deletions(-)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts.
2009-09-20 18:43 [PATCH v3 0/4] Use macros rather than hardcoding section names Tim Abbott
@ 2009-09-20 18:43 ` Tim Abbott
2009-09-20 21:16 ` Sam Ravnborg
2009-09-20 18:43 ` [PATCH v3 2/4] Use new __init_task_data macro in arch init_task.c files Tim Abbott
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 18:43 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Sam Ravnborg, Tim Abbott
Adding a reference to <linux/linkage.h> to x86's <asm/cache.h> causes
the x86 linker script to have syntax errors, because the ALIGN and
ENTRY keywords get redefined to the assembly implementations of those.
One could fix this by adjusting the include structure, but I think any
solution based on that approach would be fragile.
Currently, it is impossible when writing a header to do something
different for assembly files and linker scripts, even though there are
clearly cases where one wants them to define macros differently for
the two (ENTRY being an excellent example). So I think the right
solution here is to introduce a new preprocessor definition,
tentatively called __LINKER_SCRIPT__ that is set along with
__ASSEMBLY__ for linker scripts, and to use that to not define ALIGN
and ENTRY in linker scripts. I suspect we'll find other uses for this
mechanism in the future.
Signed-off-by: Tim Abbott <tabbott@ksplice.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
---
include/linux/linkage.h | 2 ++
scripts/Makefile.build | 3 ++-
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/include/linux/linkage.h b/include/linux/linkage.h
index 691f591..be874bb 100644
--- a/include/linux/linkage.h
+++ b/include/linux/linkage.h
@@ -57,6 +57,7 @@
#ifdef __ASSEMBLY__
+#ifndef __LINKER_SCRIPT__
#define ALIGN __ALIGN
#define ALIGN_STR __ALIGN_STR
@@ -66,6 +67,7 @@
ALIGN; \
name:
#endif
+#endif /* __LINKER_SCRIPT__ */
#ifndef WEAK
#define WEAK(name) \
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 5c4b7a4..e51e213 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -269,7 +269,8 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always)
# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS $@
- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $<
+ cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -D__LINKER_SCRIPT__ \
+ -o $@ $<
$(obj)/%.lds: $(src)/%.lds.S FORCE
$(call if_changed_dep,cpp_lds_S)
--
1.6.3.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/4] Use new __init_task_data macro in arch init_task.c files.
2009-09-20 18:43 [PATCH v3 0/4] Use macros rather than hardcoding section names Tim Abbott
2009-09-20 18:43 ` [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts Tim Abbott
@ 2009-09-20 18:43 ` Tim Abbott
2009-09-20 18:43 ` [PATCH v3 3/4] Use macros for .bss.page_aligned section Tim Abbott
2009-09-20 18:43 ` [PATCH v3 4/4] Use macros for .data.page_aligned section Tim Abbott
3 siblings, 0 replies; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 18:43 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Sam Ravnborg, Joe Perches, Tim Abbott
From: Joe Perches <joe@perches.com>
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Tim Abbott <tabbott@ksplice.com>
Acked-by: Paul Mundt <lethal@linux-sh.org>
---
arch/arm/kernel/init_task.c | 5 ++---
arch/avr32/kernel/init_task.c | 5 ++---
arch/cris/kernel/process.c | 5 ++---
arch/frv/kernel/init_task.c | 5 ++---
arch/h8300/kernel/init_task.c | 5 ++---
arch/ia64/kernel/init_task.c | 3 ++-
arch/m32r/kernel/init_task.c | 5 ++---
arch/m68k/kernel/process.c | 6 +++---
arch/m68knommu/kernel/init_task.c | 5 ++---
arch/microblaze/kernel/init_task.c | 5 ++---
arch/mips/kernel/init_task.c | 5 ++---
arch/mn10300/kernel/init_task.c | 5 ++---
arch/parisc/kernel/init_task.c | 4 ++--
arch/powerpc/kernel/init_task.c | 5 ++---
arch/powerpc/kernel/machine_kexec_64.c | 5 +++--
arch/s390/kernel/init_task.c | 5 ++---
arch/score/kernel/init_task.c | 5 ++---
arch/sh/kernel/init_task.c | 5 ++---
arch/sparc/kernel/init_task.c | 5 ++---
arch/um/kernel/init_task.c | 5 ++---
arch/x86/kernel/init_task.c | 5 ++---
arch/xtensa/kernel/init_task.c | 5 ++---
22 files changed, 46 insertions(+), 62 deletions(-)
diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c
index 3f47086..e7cbb50 100644
--- a/arch/arm/kernel/init_task.c
+++ b/arch/arm/kernel/init_task.c
@@ -24,9 +24,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
*
* The things we do for performance..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/avr32/kernel/init_task.c b/arch/avr32/kernel/init_task.c
index 57ec9f2..6b2343e 100644
--- a/arch/avr32/kernel/init_task.c
+++ b/arch/avr32/kernel/init_task.c
@@ -18,9 +18,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
/*
* Initial thread structure. Must be aligned on an 8192-byte boundary.
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
index 51dcd04..c99aeab 100644
--- a/arch/cris/kernel/process.c
+++ b/arch/cris/kernel/process.c
@@ -45,9 +45,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/frv/kernel/init_task.c b/arch/frv/kernel/init_task.c
index 1d3df1d..3c3e0b3 100644
--- a/arch/frv/kernel/init_task.c
+++ b/arch/frv/kernel/init_task.c
@@ -19,9 +19,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c
index 089c65e..54c1062 100644
--- a/arch/h8300/kernel/init_task.c
+++ b/arch/h8300/kernel/init_task.c
@@ -31,7 +31,6 @@ EXPORT_SYMBOL(init_task);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c
index c475fc2..e253ab8 100644
--- a/arch/ia64/kernel/init_task.c
+++ b/arch/ia64/kernel/init_task.c
@@ -33,7 +33,8 @@ union {
struct thread_info thread_info;
} s;
unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
-} init_task_mem asm ("init_task") __attribute__((section(".data.init_task"))) = {{
+} init_task_mem asm ("init_task") __init_task_data =
+ {{
.task = INIT_TASK(init_task_mem.s.task),
.thread_info = INIT_THREAD_INFO(init_task_mem.s.task)
}};
diff --git a/arch/m32r/kernel/init_task.c b/arch/m32r/kernel/init_task.c
index fce57e5..6c42d5f 100644
--- a/arch/m32r/kernel/init_task.c
+++ b/arch/m32r/kernel/init_task.c
@@ -20,9 +20,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index 72bad65..41230c5 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -42,9 +42,9 @@
*/
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-union thread_union init_thread_union
-__attribute__((section(".data.init_task"), aligned(THREAD_SIZE)))
- = { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data
+ __attribute__((aligned(THREAD_SIZE))) =
+ { INIT_THREAD_INFO(init_task) };
/* initial task structure */
struct task_struct init_task = INIT_TASK(init_task);
diff --git a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c
index 45e97a2..cbf9dc3 100644
--- a/arch/m68knommu/kernel/init_task.c
+++ b/arch/m68knommu/kernel/init_task.c
@@ -31,7 +31,6 @@ EXPORT_SYMBOL(init_task);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
diff --git a/arch/microblaze/kernel/init_task.c b/arch/microblaze/kernel/init_task.c
index 67da225..b5d711f 100644
--- a/arch/microblaze/kernel/init_task.c
+++ b/arch/microblaze/kernel/init_task.c
@@ -19,9 +19,8 @@
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
-{ INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
struct task_struct init_task = INIT_TASK(init_task);
EXPORT_SYMBOL(init_task);
diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c
index 5b457a4..6d6ca53 100644
--- a/arch/mips/kernel/init_task.c
+++ b/arch/mips/kernel/init_task.c
@@ -21,9 +21,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
*
* The things we do for performance..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"),
- __aligned__(THREAD_SIZE))) =
+union thread_union init_thread_union __init_task_data
+ __attribute__((__aligned__(THREAD_SIZE))) =
{ INIT_THREAD_INFO(init_task) };
/*
diff --git a/arch/mn10300/kernel/init_task.c b/arch/mn10300/kernel/init_task.c
index 80d423b..a481b04 100644
--- a/arch/mn10300/kernel/init_task.c
+++ b/arch/mn10300/kernel/init_task.c
@@ -27,9 +27,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c
index 82974b2..d020eae 100644
--- a/arch/parisc/kernel/init_task.c
+++ b/arch/parisc/kernel/init_task.c
@@ -43,8 +43,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((aligned(128))) __attribute__((__section__(".data.init_task"))) =
+union thread_union init_thread_union __init_task_data
+ __attribute__((aligned(128))) =
{ INIT_THREAD_INFO(init_task) };
#if PT_NLEVELS == 3
diff --git a/arch/powerpc/kernel/init_task.c b/arch/powerpc/kernel/init_task.c
index ffc4253..2375b7e 100644
--- a/arch/powerpc/kernel/init_task.c
+++ b/arch/powerpc/kernel/init_task.c
@@ -16,9 +16,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index 49e705f..040bd1d 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -13,6 +13,7 @@
#include <linux/kexec.h>
#include <linux/smp.h>
#include <linux/thread_info.h>
+#include <linux/init_task.h>
#include <linux/errno.h>
#include <asm/page.h>
@@ -249,8 +250,8 @@ static void kexec_prepare_cpus(void)
* We could use a smaller stack if we don't care about anything using
* current, but that audit has not been performed.
*/
-static union thread_union kexec_stack
- __attribute__((__section__(".data.init_task"))) = { };
+static union thread_union kexec_stack __init_task_data =
+ { };
/* Our assembly helper, in kexec_stub.S */
extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start,
diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c
index fe787f9..4d1c9fb 100644
--- a/arch/s390/kernel/init_task.c
+++ b/arch/s390/kernel/init_task.c
@@ -25,9 +25,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/score/kernel/init_task.c b/arch/score/kernel/init_task.c
index ff952f6..baa03ee 100644
--- a/arch/score/kernel/init_task.c
+++ b/arch/score/kernel/init_task.c
@@ -34,9 +34,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"), __aligned__(THREAD_SIZE))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/sh/kernel/init_task.c b/arch/sh/kernel/init_task.c
index 1719957..11f2ea5 100644
--- a/arch/sh/kernel/init_task.c
+++ b/arch/sh/kernel/init_task.c
@@ -17,9 +17,8 @@ struct pt_regs fake_swapper_regs;
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c
index 28125c5..5fe3d65 100644
--- a/arch/sparc/kernel/init_task.c
+++ b/arch/sparc/kernel/init_task.c
@@ -18,6 +18,5 @@ EXPORT_SYMBOL(init_task);
* If this is not aligned on a 8k boundry, then you should change code
* in etrap.S which assumes it.
*/
-union thread_union init_thread_union
- __attribute__((section (".data.init_task")))
- = { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
diff --git a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c
index b25121b..8aa77b6 100644
--- a/arch/um/kernel/init_task.c
+++ b/arch/um/kernel/init_task.c
@@ -30,9 +30,8 @@ EXPORT_SYMBOL(init_task);
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
union thread_union cpu0_irqstack
__attribute__((__section__(".data.init_irqstack"))) =
diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c
index 270ff83..3a54dcb 100644
--- a/arch/x86/kernel/init_task.c
+++ b/arch/x86/kernel/init_task.c
@@ -20,9 +20,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry..
*/
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
- { INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
/*
* Initial task structure.
diff --git a/arch/xtensa/kernel/init_task.c b/arch/xtensa/kernel/init_task.c
index c4302f0..cd122fb 100644
--- a/arch/xtensa/kernel/init_task.c
+++ b/arch/xtensa/kernel/init_task.c
@@ -23,9 +23,8 @@
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
-{ INIT_THREAD_INFO(init_task) };
+union thread_union init_thread_union __init_task_data =
+ { INIT_THREAD_INFO(init_task) };
struct task_struct init_task = INIT_TASK(init_task);
--
1.6.3.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 3/4] Use macros for .bss.page_aligned section.
2009-09-20 18:43 [PATCH v3 0/4] Use macros rather than hardcoding section names Tim Abbott
2009-09-20 18:43 ` [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts Tim Abbott
2009-09-20 18:43 ` [PATCH v3 2/4] Use new __init_task_data macro in arch init_task.c files Tim Abbott
@ 2009-09-20 18:43 ` Tim Abbott
2009-09-20 18:43 ` [PATCH v3 4/4] Use macros for .data.page_aligned section Tim Abbott
3 siblings, 0 replies; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 18:43 UTC (permalink / raw)
To: Linux Kernel Mailing List
Cc: Sam Ravnborg, Tim Abbott, Thomas Gleixner, Ingo Molnar,
H. Peter Anvin, Chris Zankel
This patch changes the remaining direct references to
.bss.page_aligned in C and assembly code to use the macros in
include/linux/linkage.h.
Signed-off-by: Tim Abbott <tabbott@ksplice.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Cc: Chris Zankel <chris@zankel.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
---
arch/sh/kernel/irq.c | 6 ++----
arch/x86/kernel/head_32.S | 2 +-
arch/x86/kernel/head_64.S | 2 +-
arch/xtensa/kernel/head.S | 2 +-
4 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c
index 60f8af4..7cb933b 100644
--- a/arch/sh/kernel/irq.c
+++ b/arch/sh/kernel/irq.c
@@ -165,11 +165,9 @@ asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs)
}
#ifdef CONFIG_IRQSTACKS
-static char softirq_stack[NR_CPUS * THREAD_SIZE]
- __attribute__((__section__(".bss.page_aligned")));
+static char softirq_stack[NR_CPUS * THREAD_SIZE] __page_aligned_bss;
-static char hardirq_stack[NR_CPUS * THREAD_SIZE]
- __attribute__((__section__(".bss.page_aligned")));
+static char hardirq_stack[NR_CPUS * THREAD_SIZE] __page_aligned_bss;
/*
* allocate per-cpu stacks for hardirq and for softirq processing
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index b766e8c..1dac239 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -608,7 +608,7 @@ ENTRY(initial_code)
/*
* BSS section
*/
-.section ".bss.page_aligned","wa"
+__PAGE_ALIGNED_BSS
.align PAGE_SIZE_asm
#ifdef CONFIG_X86_PAE
swapper_pg_pmd:
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index fa54f78..d0bc0a1 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -418,7 +418,7 @@ ENTRY(phys_base)
ENTRY(idt_table)
.skip IDT_ENTRIES * 16
- .section .bss.page_aligned, "aw", @nobits
+ __PAGE_ALIGNED_BSS
.align PAGE_SIZE
ENTRY(empty_zero_page)
.skip PAGE_SIZE
diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S
index d9ddc1b..d215adc 100644
--- a/arch/xtensa/kernel/head.S
+++ b/arch/xtensa/kernel/head.S
@@ -235,7 +235,7 @@ should_never_return:
* BSS section
*/
-.section ".bss.page_aligned", "w"
+__PAGE_ALIGNED_BSS
#ifdef CONFIG_MMU
ENTRY(swapper_pg_dir)
.fill PAGE_SIZE, 1, 0
--
1.6.3.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 4/4] Use macros for .data.page_aligned section.
2009-09-20 18:43 [PATCH v3 0/4] Use macros rather than hardcoding section names Tim Abbott
` (2 preceding siblings ...)
2009-09-20 18:43 ` [PATCH v3 3/4] Use macros for .bss.page_aligned section Tim Abbott
@ 2009-09-20 18:43 ` Tim Abbott
2009-09-21 7:57 ` Martin Schwidefsky
3 siblings, 1 reply; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 18:43 UTC (permalink / raw)
To: Linux Kernel Mailing List
Cc: Sam Ravnborg, Tim Abbott, Thomas Gleixner, Ingo Molnar,
H. Peter Anvin, Haavard Skinnemoen, Benjamin Herrenschmidt,
Paul Mackerras, Martin Schwidefsky
This patch changes the remaining direct references to
.data.page_aligned in C and assembly code to use the macros in
include/linux/linkage.h.
Signed-off-by: Tim Abbott <tabbott@ksplice.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
---
arch/avr32/mm/init.c | 4 +---
arch/powerpc/kernel/vdso.c | 3 ++-
arch/powerpc/kernel/vdso32/vdso32_wrapper.S | 3 ++-
arch/powerpc/kernel/vdso64/vdso64_wrapper.S | 3 ++-
arch/s390/kernel/vdso.c | 2 +-
arch/s390/kernel/vdso32/vdso32_wrapper.S | 3 ++-
arch/s390/kernel/vdso64/vdso64_wrapper.S | 3 ++-
arch/x86/include/asm/cache.h | 4 +++-
arch/x86/kernel/head_32.S | 2 +-
9 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/arch/avr32/mm/init.c b/arch/avr32/mm/init.c
index e819fa6..cc60d10 100644
--- a/arch/avr32/mm/init.c
+++ b/arch/avr32/mm/init.c
@@ -24,11 +24,9 @@
#include <asm/setup.h>
#include <asm/sections.h>
-#define __page_aligned __attribute__((section(".data.page_aligned")))
-
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
-pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned;
+pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_data;
struct page *empty_zero_page;
EXPORT_SYMBOL(empty_zero_page);
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index a0abce2..3faaf29 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -1,3 +1,4 @@
+
/*
* Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp.
* <benh@kernel.crashing.org>
@@ -74,7 +75,7 @@ static int vdso_ready;
static union {
struct vdso_data data;
u8 page[PAGE_SIZE];
-} vdso_data_store __attribute__((__section__(".data.page_aligned")));
+} vdso_data_store __page_aligned_data;
struct vdso_data *vdso_data = &vdso_data_store.data;
/* Format of the patch table */
diff --git a/arch/powerpc/kernel/vdso32/vdso32_wrapper.S b/arch/powerpc/kernel/vdso32/vdso32_wrapper.S
index 556f0ca..6e8f507 100644
--- a/arch/powerpc/kernel/vdso32/vdso32_wrapper.S
+++ b/arch/powerpc/kernel/vdso32/vdso32_wrapper.S
@@ -1,7 +1,8 @@
#include <linux/init.h>
+#include <linux/linkage.h>
#include <asm/page.h>
- .section ".data.page_aligned"
+ __PAGE_ALIGNED_DATA
.globl vdso32_start, vdso32_end
.balign PAGE_SIZE
diff --git a/arch/powerpc/kernel/vdso64/vdso64_wrapper.S b/arch/powerpc/kernel/vdso64/vdso64_wrapper.S
index 0529cb9..b8553d6 100644
--- a/arch/powerpc/kernel/vdso64/vdso64_wrapper.S
+++ b/arch/powerpc/kernel/vdso64/vdso64_wrapper.S
@@ -1,7 +1,8 @@
#include <linux/init.h>
+#include <linux/linkage.h>
#include <asm/page.h>
- .section ".data.page_aligned"
+ __PAGE_ALIGNED_DATA
.globl vdso64_start, vdso64_end
.balign PAGE_SIZE
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index 45e1708..45a3e9a 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -75,7 +75,7 @@ __setup("vdso=", vdso_setup);
static union {
struct vdso_data data;
u8 page[PAGE_SIZE];
-} vdso_data_store __attribute__((__section__(".data.page_aligned")));
+} vdso_data_store __page_aligned_data;
struct vdso_data *vdso_data = &vdso_data_store.data;
/*
diff --git a/arch/s390/kernel/vdso32/vdso32_wrapper.S b/arch/s390/kernel/vdso32/vdso32_wrapper.S
index 61639a8..ae42f8c 100644
--- a/arch/s390/kernel/vdso32/vdso32_wrapper.S
+++ b/arch/s390/kernel/vdso32/vdso32_wrapper.S
@@ -1,7 +1,8 @@
#include <linux/init.h>
+#include <linux/linkage.h>
#include <asm/page.h>
- .section ".data.page_aligned"
+ __PAGE_ALIGNED_DATA
.globl vdso32_start, vdso32_end
.balign PAGE_SIZE
diff --git a/arch/s390/kernel/vdso64/vdso64_wrapper.S b/arch/s390/kernel/vdso64/vdso64_wrapper.S
index d8e2ac1..c245842 100644
--- a/arch/s390/kernel/vdso64/vdso64_wrapper.S
+++ b/arch/s390/kernel/vdso64/vdso64_wrapper.S
@@ -1,7 +1,8 @@
#include <linux/init.h>
+#include <linux/linkage.h>
#include <asm/page.h>
- .section ".data.page_aligned"
+ __PAGE_ALIGNED_DATA
.globl vdso64_start, vdso64_end
.balign PAGE_SIZE
diff --git a/arch/x86/include/asm/cache.h b/arch/x86/include/asm/cache.h
index 5d367ca..549860d 100644
--- a/arch/x86/include/asm/cache.h
+++ b/arch/x86/include/asm/cache.h
@@ -1,6 +1,8 @@
#ifndef _ASM_X86_CACHE_H
#define _ASM_X86_CACHE_H
+#include <linux/linkage.h>
+
/* L1 cache line size */
#define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
@@ -13,7 +15,7 @@
#ifdef CONFIG_SMP
#define __cacheline_aligned_in_smp \
__attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT)))) \
- __attribute__((__section__(".data.page_aligned")))
+ __page_aligned_data
#endif
#endif
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index 1dac239..218aad7 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -626,7 +626,7 @@ ENTRY(empty_zero_page)
* This starts the data section.
*/
#ifdef CONFIG_X86_PAE
-.section ".data.page_aligned","wa"
+__PAGE_ALIGNED_DATA
/* Page-aligned for the benefit of paravirt? */
.align PAGE_SIZE_asm
ENTRY(swapper_pg_dir)
--
1.6.3.3
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts.
2009-09-20 18:43 ` [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts Tim Abbott
@ 2009-09-20 21:16 ` Sam Ravnborg
2009-09-20 21:24 ` Tim Abbott
0 siblings, 1 reply; 10+ messages in thread
From: Sam Ravnborg @ 2009-09-20 21:16 UTC (permalink / raw)
To: Tim Abbott; +Cc: Linux Kernel Mailing List
On Sun, Sep 20, 2009 at 02:43:10PM -0400, Tim Abbott wrote:
> Adding a reference to <linux/linkage.h> to x86's <asm/cache.h> causes
> the x86 linker script to have syntax errors, because the ALIGN and
> ENTRY keywords get redefined to the assembly implementations of those.
> One could fix this by adjusting the include structure, but I think any
> solution based on that approach would be fragile.
>
> Currently, it is impossible when writing a header to do something
> different for assembly files and linker scripts, even though there are
> clearly cases where one wants them to define macros differently for
> the two (ENTRY being an excellent example). So I think the right
> solution here is to introduce a new preprocessor definition,
> tentatively called __LINKER_SCRIPT__ that is set along with
> __ASSEMBLY__ for linker scripts, and to use that to not define ALIGN
> and ENTRY in linker scripts. I suspect we'll find other uses for this
> mechanism in the future.
We will need this - agreed.
The reason for __XXX___ for ASSEMBLY and KERNEL is the fact
that these are used in user space headers.
I would suggest to use: LINKER_SCRIPT
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 5c4b7a4..e51e213 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -269,7 +269,8 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always)
> # Linker scripts preprocessor (.lds.S -> .lds)
> # ---------------------------------------------------------------------------
> quiet_cmd_cpp_lds_S = LDS $@
> - cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $<
> + cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -D__LINKER_SCRIPT__ \
> + -o $@ $<
This will conflict (in a trivial way) with stuff I have
pending for this merge window.
Sam
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts.
2009-09-20 21:16 ` Sam Ravnborg
@ 2009-09-20 21:24 ` Tim Abbott
2009-09-20 21:43 ` Sam Ravnborg
0 siblings, 1 reply; 10+ messages in thread
From: Tim Abbott @ 2009-09-20 21:24 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: Linux Kernel Mailing List
On Sun, 20 Sep 2009, Sam Ravnborg wrote:
> The reason for __XXX___ for ASSEMBLY and KERNEL is the fact
> that these are used in user space headers.
>
> I would suggest to use: LINKER_SCRIPT
OK. I'm happy with calling it LINKER_SCRIPT.
> This will conflict (in a trivial way) with stuff I have
> pending for this merge window.
Is that pending stuff available in a public git repository somewhere? If
so, I could send you a version on top of those pending changes.
(Alternatively, if you're planning to take this patch, I'd be fine with
your resolving the merge conflict, updating the name, and putting it in
with your stuff. Whatever's easier for you).
-Tim Abbott
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts.
2009-09-20 21:24 ` Tim Abbott
@ 2009-09-20 21:43 ` Sam Ravnborg
0 siblings, 0 replies; 10+ messages in thread
From: Sam Ravnborg @ 2009-09-20 21:43 UTC (permalink / raw)
To: Tim Abbott; +Cc: Linux Kernel Mailing List
On Sun, Sep 20, 2009 at 05:24:50PM -0400, Tim Abbott wrote:
> On Sun, 20 Sep 2009, Sam Ravnborg wrote:
>
> > The reason for __XXX___ for ASSEMBLY and KERNEL is the fact
> > that these are used in user space headers.
> >
> > I would suggest to use: LINKER_SCRIPT
>
> OK. I'm happy with calling it LINKER_SCRIPT.
>
> > This will conflict (in a trivial way) with stuff I have
> > pending for this merge window.
>
> Is that pending stuff available in a public git repository somewhere? If
> so, I could send you a version on top of those pending changes.
> (Alternatively, if you're planning to take this patch, I'd be fine with
> your resolving the merge conflict, updating the name, and putting it in
> with your stuff. Whatever's easier for you).
git.kernel.org - kbuild-next.git
I rebased earlier today and have pushed it out right now.
Please rebase and send me a new set.
I will take these four as they touch a lot architectures.
Sam
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 4/4] Use macros for .data.page_aligned section.
2009-09-20 18:43 ` [PATCH v3 4/4] Use macros for .data.page_aligned section Tim Abbott
@ 2009-09-21 7:57 ` Martin Schwidefsky
2009-09-21 8:05 ` Sam Ravnborg
0 siblings, 1 reply; 10+ messages in thread
From: Martin Schwidefsky @ 2009-09-21 7:57 UTC (permalink / raw)
To: Tim Abbott
Cc: Linux Kernel Mailing List, Sam Ravnborg, Tim Abbott,
Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Haavard Skinnemoen,
Benjamin Herrenschmidt, Paul Mackerras
On Sun, 20 Sep 2009 14:43:13 -0400
Tim Abbott <tabbott@ksplice.com> wrote:
> This patch changes the remaining direct references to
> .data.page_aligned in C and assembly code to use the macros in
> include/linux/linkage.h.
>
> Signed-off-by: Tim Abbott <tabbott@ksplice.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: H. Peter Anvin <hpa@zytor.com>
> Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> ---
> arch/avr32/mm/init.c | 4 +---
> arch/powerpc/kernel/vdso.c | 3 ++-
> arch/powerpc/kernel/vdso32/vdso32_wrapper.S | 3 ++-
> arch/powerpc/kernel/vdso64/vdso64_wrapper.S | 3 ++-
> arch/s390/kernel/vdso.c | 2 +-
> arch/s390/kernel/vdso32/vdso32_wrapper.S | 3 ++-
> arch/s390/kernel/vdso64/vdso64_wrapper.S | 3 ++-
> arch/x86/include/asm/cache.h | 4 +++-
> arch/x86/kernel/head_32.S | 2 +-
> 9 files changed, 16 insertions(+), 11 deletions(-)
Compiles and works fine:
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
--
blue skies,
Martin.
"Reality continues to ruin my life." - Calvin.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 4/4] Use macros for .data.page_aligned section.
2009-09-21 7:57 ` Martin Schwidefsky
@ 2009-09-21 8:05 ` Sam Ravnborg
0 siblings, 0 replies; 10+ messages in thread
From: Sam Ravnborg @ 2009-09-21 8:05 UTC (permalink / raw)
To: Martin Schwidefsky
Cc: Tim Abbott, Linux Kernel Mailing List, Thomas Gleixner,
Ingo Molnar, H. Peter Anvin, Haavard Skinnemoen,
Benjamin Herrenschmidt, Paul Mackerras
On Mon, Sep 21, 2009 at 09:57:17AM +0200, Martin Schwidefsky wrote:
> On Sun, 20 Sep 2009 14:43:13 -0400
> Tim Abbott <tabbott@ksplice.com> wrote:
>
> > This patch changes the remaining direct references to
> > .data.page_aligned in C and assembly code to use the macros in
> > include/linux/linkage.h.
> >
> > Signed-off-by: Tim Abbott <tabbott@ksplice.com>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Cc: H. Peter Anvin <hpa@zytor.com>
> > Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> > Cc: Paul Mackerras <paulus@samba.org>
> > Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
> > Cc: Sam Ravnborg <sam@ravnborg.org>
> > ---
> > arch/avr32/mm/init.c | 4 +---
> > arch/powerpc/kernel/vdso.c | 3 ++-
> > arch/powerpc/kernel/vdso32/vdso32_wrapper.S | 3 ++-
> > arch/powerpc/kernel/vdso64/vdso64_wrapper.S | 3 ++-
> > arch/s390/kernel/vdso.c | 2 +-
> > arch/s390/kernel/vdso32/vdso32_wrapper.S | 3 ++-
> > arch/s390/kernel/vdso64/vdso64_wrapper.S | 3 ++-
> > arch/x86/include/asm/cache.h | 4 +++-
> > arch/x86/kernel/head_32.S | 2 +-
> > 9 files changed, 16 insertions(+), 11 deletions(-)
>
> Compiles and works fine:
> Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Thanks for testing.
If I rebase I will add your ack.
Sam
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-09-21 8:05 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-20 18:43 [PATCH v3 0/4] Use macros rather than hardcoding section names Tim Abbott
2009-09-20 18:43 ` [PATCH v3 1/4] kbuild: Don't define ALIGN and ENTRY when preprocessing linker scripts Tim Abbott
2009-09-20 21:16 ` Sam Ravnborg
2009-09-20 21:24 ` Tim Abbott
2009-09-20 21:43 ` Sam Ravnborg
2009-09-20 18:43 ` [PATCH v3 2/4] Use new __init_task_data macro in arch init_task.c files Tim Abbott
2009-09-20 18:43 ` [PATCH v3 3/4] Use macros for .bss.page_aligned section Tim Abbott
2009-09-20 18:43 ` [PATCH v3 4/4] Use macros for .data.page_aligned section Tim Abbott
2009-09-21 7:57 ` Martin Schwidefsky
2009-09-21 8:05 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®