All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Yinghai Lu <yinghai@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	David Miller <davem@davemloft.net>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Johannes Weiner <hannes@cmpxchg.org>,
	linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Subject: Re: [PATCH 17/22] lmb: Add ARCH_DISCARD_LMB to put lmb code to .init
Date: Mon, 10 May 2010 16:16:32 +1000	[thread overview]
Message-ID: <1273472192.23699.34.camel@pasglop> (raw)
In-Reply-To: <1273331860-14325-18-git-send-email-yinghai@kernel.org>

On Sat, 2010-05-08 at 08:17 -0700, Yinghai Lu wrote:
> So those lmb bits could be released after kernel is booted up.
> 
> Arch code could define ARCH_DISCARD_LMB in asm/lmb.h, __init_lmb will become __init, __initdata_lmb will becom __initdata
> 
> x86 code will use that.
> 
> -v2: use ARCH_DISCARD_LMB according to Michael Ellerman

So first, you don't define ARCH_DISCARD_LMB on any arch, so they will
all use __init_lmb, but thta isnt defined by this patch afaik, so you
have just broken everything no ?

Also, why do you want that precisely ? bootmem is __init so that's fine
to discard. We also already don't discard the lmb arrays. So what are
you trying to achieve ?

Cheers,
Ben.

> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> ---
>  include/linux/lmb.h |    8 +++++++
>  mm/lmb.c            |   54 ++++++++++++++++++++++++++++++--------------------
>  2 files changed, 40 insertions(+), 22 deletions(-)
> 
> diff --git a/include/linux/lmb.h b/include/linux/lmb.h
> index 47b9d7f..e486572 100644
> --- a/include/linux/lmb.h
> +++ b/include/linux/lmb.h
> @@ -107,6 +107,14 @@ u64 lmb_memory_size(u64 addr, u64 limit);
>  
>  #include <asm/lmb.h>
>  
> +#ifdef ARCH_DISCARD_LMB
> +#define __init_lmb __init
> +#define __initdata_lmb __initdata
> +#else
> +#define __init_lmb
> +#define __initdata_lmb
> +#endif
> +
>  #endif /* CONFIG_HAVE_LMB */
>  
>  #endif /* __KERNEL__ */
> diff --git a/mm/lmb.c b/mm/lmb.c
> index db2264d..c2c6bff 100644
> --- a/mm/lmb.c
> +++ b/mm/lmb.c
> @@ -21,11 +21,11 @@
>  
>  #define LMB_ALLOC_ANYWHERE	0
>  
> -struct lmb lmb;
> -static struct lmb_property lmb_memory_region[MAX_LMB_REGIONS];
> -static struct lmb_property lmb_reserved_region[MAX_LMB_REGIONS];
> +struct lmb lmb __initdata_lmb;
> +static struct lmb_property lmb_memory_region[MAX_LMB_REGIONS] __initdata_lmb;
> +static struct lmb_property lmb_reserved_region[MAX_LMB_REGIONS] __initdata_lmb;
>  
> -static int lmb_debug;
> +static int lmb_debug __initdata_lmb;
>  
>  static int __init early_lmb(char *p)
>  {
> @@ -35,7 +35,7 @@ static int __init early_lmb(char *p)
>  }
>  early_param("lmb", early_lmb);
>  
> -static void lmb_dump(struct lmb_region *region, char *name)
> +static void __init_lmb lmb_dump(struct lmb_region *region, char *name)
>  {
>  	unsigned long long base, size;
>  	int i;
> @@ -51,7 +51,7 @@ static void lmb_dump(struct lmb_region *region, char *name)
>  	}
>  }
>  
> -void lmb_dump_all(void)
> +void __init_lmb lmb_dump_all(void)
>  {
>  	if (!lmb_debug)
>  		return;
> @@ -64,13 +64,13 @@ void lmb_dump_all(void)
>  	lmb_dump(&lmb.reserved, "reserved");
>  }
>  
> -static unsigned long lmb_addrs_overlap(u64 base1, u64 size1, u64 base2,
> +static unsigned long __init_lmb lmb_addrs_overlap(u64 base1, u64 size1, u64 base2,
>  					u64 size2)
>  {
>  	return ((base1 < (base2 + size2)) && (base2 < (base1 + size1)));
>  }
>  
> -static long lmb_addrs_adjacent(u64 base1, u64 size1, u64 base2, u64 size2)
> +static long __init_lmb lmb_addrs_adjacent(u64 base1, u64 size1, u64 base2, u64 size2)
>  {
>  	if (base2 == base1 + size1)
>  		return 1;
> @@ -80,7 +80,7 @@ static long lmb_addrs_adjacent(u64 base1, u64 size1, u64 base2, u64 size2)
>  	return 0;
>  }
>  
> -static long lmb_regions_adjacent(struct lmb_region *rgn,
> +static long __init_lmb lmb_regions_adjacent(struct lmb_region *rgn,
>  		unsigned long r1, unsigned long r2)
>  {
>  	u64 base1 = rgn->region[r1].base;
> @@ -91,7 +91,7 @@ static long lmb_regions_adjacent(struct lmb_region *rgn,
>  	return lmb_addrs_adjacent(base1, size1, base2, size2);
>  }
>  
> -static void lmb_remove_region(struct lmb_region *rgn, unsigned long r)
> +static void __init_lmb lmb_remove_region(struct lmb_region *rgn, unsigned long r)
>  {
>  	unsigned long i;
>  
> @@ -103,7 +103,7 @@ static void lmb_remove_region(struct lmb_region *rgn, unsigned long r)
>  }
>  
>  /* Assumption: base addr of region 1 < base addr of region 2 */
> -static void lmb_coalesce_regions(struct lmb_region *rgn,
> +static void __init_lmb lmb_coalesce_regions(struct lmb_region *rgn,
>  		unsigned long r1, unsigned long r2)
>  {
>  	rgn->region[r1].size += rgn->region[r2].size;
> @@ -140,7 +140,7 @@ void __init lmb_analyze(void)
>  		lmb.memory.size += lmb.memory.region[i].size;
>  }
>  
> -static long lmb_add_region(struct lmb_region *rgn, u64 base, u64 size)
> +static long __init_lmb lmb_add_region(struct lmb_region *rgn, u64 base, u64 size)
>  {
>  	unsigned long coalesced = 0;
>  	long adjacent, i;
> @@ -204,7 +204,7 @@ static long lmb_add_region(struct lmb_region *rgn, u64 base, u64 size)
>  	return 0;
>  }
>  
> -long lmb_add(u64 base, u64 size)
> +long __init_lmb lmb_add(u64 base, u64 size)
>  {
>  	struct lmb_region *_rgn = &lmb.memory;
>  
> @@ -216,7 +216,7 @@ long lmb_add(u64 base, u64 size)
>  
>  }
>  
> -static long __lmb_remove(struct lmb_region *rgn, u64 base, u64 size)
> +static long __init_lmb __lmb_remove(struct lmb_region *rgn, u64 base, u64 size)
>  {
>  	u64 rgnbegin, rgnend;
>  	u64 end = base + size;
> @@ -264,7 +264,7 @@ static long __lmb_remove(struct lmb_region *rgn, u64 base, u64 size)
>  	return lmb_add_region(rgn, end, rgnend - end);
>  }
>  
> -long lmb_remove(u64 base, u64 size)
> +long __init_lmb lmb_remove(u64 base, u64 size)
>  {
>  	return __lmb_remove(&lmb.memory, base, size);
>  }
> @@ -283,7 +283,7 @@ long __init lmb_reserve(u64 base, u64 size)
>  	return lmb_add_region(_rgn, base, size);
>  }
>  
> -long lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
> +long __init_lmb lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
>  {
>  	unsigned long i;
>  
> @@ -297,12 +297,12 @@ long lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
>  	return (i < rgn->cnt) ? i : -1;
>  }
>  
> -static u64 lmb_align_down(u64 addr, u64 size)
> +static u64 __init_lmb lmb_align_down(u64 addr, u64 size)
>  {
>  	return addr & ~(size - 1);
>  }
>  
> -static u64 lmb_align_up(u64 addr, u64 size)
> +static u64 __init_lmb lmb_align_up(u64 addr, u64 size)
>  {
>  	return (addr + (size - 1)) & ~(size - 1);
>  }
> @@ -462,7 +462,7 @@ u64 __init lmb_phys_mem_size(void)
>  	return lmb.memory.size;
>  }
>  
> -u64 lmb_end_of_DRAM(void)
> +u64 __init_lmb lmb_end_of_DRAM(void)
>  {
>  	int idx = lmb.memory.cnt - 1;
>  
> @@ -526,7 +526,7 @@ int __init lmb_is_reserved(u64 addr)
>  	return 0;
>  }
>  
> -int lmb_is_region_reserved(u64 base, u64 size)
> +int __init_lmb lmb_is_region_reserved(u64 base, u64 size)
>  {
>  	return lmb_overlaps_region(&lmb.reserved, base, size);
>  }
> @@ -535,7 +535,7 @@ int lmb_is_region_reserved(u64 base, u64 size)
>   * Given a <base, len>, find which memory regions belong to this range.
>   * Adjust the request and return a contiguous chunk.
>   */
> -int lmb_find(struct lmb_property *res)
> +int __init_lmb lmb_find(struct lmb_property *res)
>  {
>  	int i;
>  	u64 rstart, rend;
> @@ -689,10 +689,11 @@ static void __init subtract_lmb_reserved(struct range *range, int az)
>  	int i, count;
>  	u64 final_start, final_end;
>  
> +#ifdef ARCH_DISCARD_LMB
>  	/* Take out region array itself at first*/
>  	if (lmb.reserved.region != lmb_reserved_region)
>  		lmb_free(__pa(lmb.reserved.region), sizeof(struct lmb_property) * lmb.reserved.nr_regions);
> -
> +#endif
>  	count  = lmb.reserved.cnt;
>  
>  	if (lmb_debug)
> @@ -708,9 +709,11 @@ static void __init subtract_lmb_reserved(struct range *range, int az)
>  			continue;
>  		subtract_range(range, az, final_start, final_end);
>  	}
> +#ifdef ARCH_DISCARD_LMB
>  	/* Put region array back ? */
>  	if (lmb.reserved.region != lmb_reserved_region)
>  		lmb_reserve(__pa(lmb.reserved.region), sizeof(struct lmb_property) * lmb.reserved.nr_regions);
> +#endif
>  }
>  
>  int __init get_free_all_memory_range(struct range **rangep, int nodeid)
> @@ -735,6 +738,7 @@ int __init get_free_all_memory_range(struct range **rangep, int nodeid)
>  	subtract_lmb_reserved(range, count);
>  	nr_range = clean_sort_range(range, count);
>  
> +#ifdef ARCH_DISCARD_LMB
>  	/* Need to clear it ? */
>  	if (nodeid == MAX_NUMNODES) {
>  		memset(&lmb.reserved.region[0], 0, sizeof(struct lmb_property) * lmb.reserved.nr_regions);
> @@ -742,6 +746,7 @@ int __init get_free_all_memory_range(struct range **rangep, int nodeid)
>  		lmb.reserved.nr_regions = 0;
>  		lmb.reserved.cnt = 0;
>  	}
> +#endif
>  
>  	*rangep = range;
>  	return nr_range;
> @@ -752,9 +757,11 @@ void __init lmb_to_bootmem(u64 start, u64 end)
>  	int i, count;
>  	u64 final_start, final_end;
>  
> +#ifdef ARCH_DISCARD_LMB
>  	/* Take out region array itself */
>  	if (lmb.reserved.region != lmb_reserved_region)
>  		lmb_free(__pa(lmb.reserved.region), sizeof(struct lmb_property) * lmb.reserved.nr_regions);
> +#endif
>  
>  	count  = lmb.reserved.cnt;
>  	if (lmb_debug)
> @@ -774,11 +781,14 @@ void __init lmb_to_bootmem(u64 start, u64 end)
>  			pr_cont(" ==> [%010llx - %010llx]\n", final_start, final_end);
>  		reserve_bootmem_generic(final_start, final_end - final_start, BOOTMEM_DEFAULT);
>  	}
> +
> +#ifdef ARCH_DISCARD_LMB
>  	/* Clear them to avoid misusing ? */
>  	memset(&lmb.reserved.region[0], 0, sizeof(struct lmb_property) * lmb.reserved.nr_regions);
>  	lmb.reserved.region = NULL;
>  	lmb.reserved.nr_regions = 0;
>  	lmb.reserved.cnt = 0;
> +#endif
>  }
>  #endif
>  

  reply	other threads:[~2010-05-10  6:18 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-08 15:17 [PATCH -v14 00/22] Use lmb with x86 Yinghai Lu
2010-05-08 15:17 ` [PATCH 01/22] lmb: Move lmb.c to mm/ Yinghai Lu
2010-05-08 15:17 ` [PATCH 02/22] lmb: Seperate region array from lmb_region struct Yinghai Lu
2010-05-08 15:17 ` [PATCH 03/22] lmb: Seperate __lmb_find_base() from __lmb_alloc_base() Yinghai Lu
2010-05-08 15:17 ` [PATCH 04/22] lmb: Add lmb_find_area() Yinghai Lu
2010-05-08 15:17 ` [PATCH 05/22] lmb: Add lmb_reserve_area/lmb_free_area Yinghai Lu
2010-05-10  7:10   ` Benjamin Herrenschmidt
2010-05-10 18:09     ` Yinghai
2010-05-10 21:44       ` H. Peter Anvin
2010-05-10 21:53       ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 06/22] bootmem, x86: Add weak version of reserve_bootmem_generic Yinghai Lu
2010-05-08 15:17 ` [PATCH 07/22] lmb: Add lmb_to_bootmem() Yinghai Lu
2010-05-10  3:13   ` Benjamin Herrenschmidt
2010-05-10  4:31     ` Yinghai
2010-05-12  0:03       ` Benjamin Herrenschmidt
2010-05-12  0:50         ` yinghai.lu
2010-05-08 15:17 ` [PATCH 08/22] lmb: Add get_free_all_memory_range() Yinghai Lu
2010-05-10  4:04   ` Benjamin Herrenschmidt
2010-05-10  7:29   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 09/22] lmb: Add lmb_register_active_regions() and lmb_hole_size() Yinghai Lu
2010-05-08 15:17 ` [PATCH 10/22] lmb: Prepare to include linux/lmb.h in core file Yinghai Lu
2010-05-08 15:17 ` [PATCH 11/22] lmb: Add find_memory_core_early() Yinghai Lu
2010-05-08 15:17 ` [PATCH 12/22] lmb: Add lmb_find_area_node() Yinghai Lu
2010-05-10  6:23   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 13/22] lmb: Add lmb_free_memory_size() Yinghai Lu
2010-05-10  6:24   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 14/22] lmb: Add lmb_memory_size() Yinghai Lu
2010-05-10  6:25   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 15/22] lmb: Add lmb_reserve_area_overlap_ok() Yinghai Lu
2010-05-10  6:34   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 16/22] lmb: Use lmb_debug to control debug message print out Yinghai Lu
2010-05-08 15:17 ` [PATCH 17/22] lmb: Add ARCH_DISCARD_LMB to put lmb code to .init Yinghai Lu
2010-05-10  6:16   ` Benjamin Herrenschmidt [this message]
2010-05-08 15:17 ` [PATCH 18/22] lmb: Add __free/__reserve/__clear_lmb_reserved_region_array() Yinghai Lu
2010-05-10  6:18   ` Benjamin Herrenschmidt
2010-05-08 15:17 ` [PATCH 19/22] x86, lmb: Add lmb_find_area_size() Yinghai Lu
2010-05-08 15:17 ` [PATCH 20/22] x86: Use lmb to replace early_res Yinghai Lu
2010-05-08 15:17 ` [PATCH 21/22] x86: Replace e820_/_early string with lmb_ Yinghai Lu
2010-05-08 15:17 ` [PATCH 22/22] x86: Remove not used early_res code Yinghai Lu
2010-05-10  2:38 ` [PATCH -v14 00/22] Use lmb with x86 Benjamin Herrenschmidt

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=1273472192.23699.34.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=akpm@linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=hannes@cmpxchg.org \
    --cc=hpa@zytor.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=yinghai@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.