Re: [PATCH 05/25] x86: alloc dyn_array all alltogether

From: Johannes Weiner
Date: Sun Aug 03 2008 - 00:16:38 EST


Hi,

Yinghai Lu <yhlu.kernel@xxxxxxxxx> writes:

> @@ -544,45 +548,78 @@ void __init __weak thread_info_cache_init(void)
> void pre_alloc_dyn_array(void)
> {
> #ifdef CONFIG_HAVE_DYN_ARRAY
> - unsigned long size, phys = 0;
> + unsigned long total_size = 0, size, phys;
> + unsigned long max_align = 1;
> struct dyn_array **daa;
> + char *ptr;
>
> + /* get the total size at first */
> for (daa = __dyn_array_start ; daa < __dyn_array_end; daa++) {
> struct dyn_array *da = *daa;
>
> size = da->size * (*da->nr);
> - print_fn_descriptor_symbol("dyna_array %s ", da->name);
> - printk(KERN_CONT "size:%#lx nr:%d align:%#lx",
> + print_fn_descriptor_symbol("dyn_array %s ", da->name);

Is this a correction of a typo you introduced two pages earlier?

> + printk(KERN_CONT "size:%#lx nr:%d align:%#lx\n",
> da->size, *da->nr, da->align);
> - *da->name = __alloc_bootmem_nopanic(size, da->align, phys);
> - phys = virt_to_phys(*da->name);
> + total_size += roundup(size, da->align);
> + if (da->align > max_align)
> + max_align = da->align;
> + }
> + if (total_size)
> + printk(KERN_DEBUG "dyn_array total_size: %#lx\n",
> + total_size);
> + else
> + return;
> +
> + /* allocate them all together */
> + max_align = max_t(unsigned long, max_align, PAGE_SIZE);
> + ptr = __alloc_bootmem_nopanic(total_size, max_align, 0);
> + if (!ptr)
> + panic("Can not alloc dyn_alloc\n");

Uhm... :)

> +
> + phys = virt_to_phys(ptr);
> + for (daa = __dyn_array_start ; daa < __dyn_array_end; daa++) {
> + struct dyn_array *da = *daa;
> +
> + size = da->size * (*da->nr);
> + print_fn_descriptor_symbol("dyn_array %s ", da->name);
> +
> + phys = roundup(phys, da->align);
> + *da->name = phys_to_virt(phys);
> printk(KERN_CONT " ==> [%#lx - %#lx]\n", phys, phys + size);
>
> + phys += size;
> +
> if (da->init_work)
> da->init_work(da);
> }
> #endif
> }
>
> -unsigned long per_cpu_dyn_array_size(void)
> +unsigned long per_cpu_dyn_array_size(unsigned long *align)
> {
> unsigned long total_size = 0;
> #ifdef CONFIG_HAVE_DYN_ARRAY
> unsigned long size;
> struct dyn_array **daa;
> + unsigned max_align = 1;
>
> for (daa = __per_cpu_dyn_array_start ; daa < __per_cpu_dyn_array_end; daa++) {
> struct dyn_array *da = *daa;
>
> size = da->size * (*da->nr);
> - print_fn_descriptor_symbol("per_cpu_dyna_array %s ", da->name);
> + print_fn_descriptor_symbol("per_cpu_dyn_array %s ", da->name);
> printk(KERN_CONT "size:%#lx nr:%d align:%#lx\n",
> da->size, *da->nr, da->align);
> total_size += roundup(size, da->align);
> + if (da->align > max_align)
> + max_align = da->align;
> }
> - if (total_size)
> - printk(KERN_DEBUG "per_cpu_dyna_array total_size: %#lx\n",
> + if (total_size) {
> + printk(KERN_DEBUG "per_cpu_dyn_array total_size: %#lx\n",
> total_size);

...

> + *align = max_align;
> + }
> #endif
> return total_size;
> }
> @@ -596,14 +633,11 @@ void per_cpu_alloc_dyn_array(int cpu, char *ptr)
> void **array;
>
> phys = virt_to_phys(ptr);
> -
> for (daa = __per_cpu_dyn_array_start ; daa < __per_cpu_dyn_array_end; daa++) {
> struct dyn_array *da = *daa;
>
> size = da->size * (*da->nr);
> - print_fn_descriptor_symbol("per_cpu_dyna_array %s ", da->name);
> - printk(KERN_CONT "size:%#lx nr:%d align:%#lx",
> - da->size, *da->nr, da->align);
> + print_fn_descriptor_symbol("per_cpu_dyn_array %s ", da->name);

...

Hannes
--
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/