Re: [PATCH] kill hotplug init/exit section annotations

From: Sam Ravnborg
Date: Thu Jan 31 2008 - 14:41:28 EST


On Thu, Jan 31, 2008 at 10:48:11AM -0800, Arjan van de Ven wrote:
> On Thu, 31 Jan 2008 19:34:25 +0100
> Sam Ravnborg <sam@xxxxxxxxxxxx> wrote:
>
> > On Thu, Jan 31, 2008 at 09:48:01AM -0800, Arjan van de Ven wrote:
> > > On Thu, 31 Jan 2008 19:14:36 +0200
> > > Adrian Bunk <bunk@xxxxxxxxxx> wrote:
> > > > > cpuhotplug is required for suspend/resume.
> > > >
> > > > Not on UP computers.
> > > >
> > >
> > > great! someone who still has one of those and uses a kernel without
> > > it. Can you look at your system.map and see how many kilobytes
> > > you've gained? Eg how many kilobytes are in these sections exactly?
> > I have one. A Atmel AT91 board equipped with an 9263.
> > So lets take a look at the defconfig build for the evaluation board.
> >
> >
> > o-arm/vmlinux.o: file format elf32-littlearm
> >
> > 0 .text 001cdefc 00000000 00000000 00000400 2**10
> > 2 .init.text 000165e8 00000000 00000000 001ce6c0 2**5
> > 26 .init.data 000032ec 00000000 00000000 002578cc 2**2
> >
> > ---
> >
> > 4 .devinit.text 00001558 00000000 00000000 001e5270 2**2
> > 9 .exit.text 00000bc8 00000000 00000000 001e8d2c 2**2
> > 10 .cpuinit.text 00000924 00000000 00000000 001e98f4 2**2
> > 11 .meminit.text 000004cc 00000000 00000000 001ea218 2**2
> > 12 .devexit.text 00000160 00000000 00000000 001ea6e4 2**2
> > 38 .cpuinit.data 00000040 00000000 00000000 0025afc0 2**2
> > 39 .meminit.data 0000000c 00000000 00000000 0025b000 2**2
> >
> >
> > __devinit alone gives a net win of 5464 bytes.
> > That is only ~3% of total .text size but this is non-swapable
> > memory where everything is worth it.
>
> now how much of this is lost again because you have to round the stuff to pagesize?

Lets take a look in the ARM vmlinux.lds.S file:
.text.head : {
_stext = .;
_sinittext = .;
*(.text.head)
}

.init : { /* Init code and data */
INIT_TEXT
_einittext = .;
__proc_info_begin = .;
*(.proc.info.init)
__proc_info_end = .;
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
. = ALIGN(16);
__setup_start = .;
*(.init.setup)
__setup_end = .;
__early_begin = .;
*(.early_param.init)
__early_end = .;
__initcall_start = .;
INITCALLS
__initcall_end = .;
__con_initcall_start = .;
*(.con_initcall.init)
__con_initcall_end = .;
__security_initcall_start = .;
*(.security_initcall.init)
__security_initcall_end = .;
#ifdef CONFIG_BLK_DEV_INITRD
. = ALIGN(32);
__initramfs_start = .;
usr/built-in.o(.init.ramfs)
__initramfs_end = .;
#endif
. = ALIGN(4096);
__per_cpu_start = .;
*(.data.percpu)
*(.data.percpu.shared_aligned)
__per_cpu_end = .;
#ifndef CONFIG_XIP_KERNEL
__init_begin = _stext;
INIT_DATA
. = ALIGN(4096);
__init_end = .;

Everything between _stext and __init_end are freed.
And we have two PAGESIZE alignmnets here - one for the percpu stuff
and the other to align the full area that can be freed.
So there is no special alignment for the __devinit stuff.

And there is no percpu data on ARM so that area is empty.
So it is one or two pages extra that are freed up.

Sam


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/