diff options
Diffstat (limited to 'lib/bootconfig.c')
| -rw-r--r-- | lib/bootconfig.c | 22 | 
1 files changed, 13 insertions, 9 deletions
diff --git a/lib/bootconfig.c b/lib/bootconfig.c index c59d26068a64..97f8911ea339 100644 --- a/lib/bootconfig.c +++ b/lib/bootconfig.c @@ -61,9 +61,12 @@ static inline void * __init xbc_alloc_mem(size_t size)  	return memblock_alloc(size, SMP_CACHE_BYTES);  } -static inline void __init xbc_free_mem(void *addr, size_t size) +static inline void __init xbc_free_mem(void *addr, size_t size, bool early)  { -	memblock_free(addr, size); +	if (early) +		memblock_free(addr, size); +	else if (addr) +		memblock_free_late(__pa(addr), size);  }  #else /* !__KERNEL__ */ @@ -73,7 +76,7 @@ static inline void *xbc_alloc_mem(size_t size)  	return malloc(size);  } -static inline void xbc_free_mem(void *addr, size_t size) +static inline void xbc_free_mem(void *addr, size_t size, bool early)  {  	free(addr);  } @@ -898,19 +901,20 @@ static int __init xbc_parse_tree(void)  }  /** - * xbc_exit() - Clean up all parsed bootconfig + * _xbc_exit() - Clean up all parsed bootconfig + * @early: Set true if this is called before budy system is initialized.   *   * This clears all data structures of parsed bootconfig on memory.   * If you need to reuse xbc_init() with new boot config, you can   * use this.   */ -void __init xbc_exit(void) +void __init _xbc_exit(bool early)  { -	xbc_free_mem(xbc_data, xbc_data_size); +	xbc_free_mem(xbc_data, xbc_data_size, early);  	xbc_data = NULL;  	xbc_data_size = 0;  	xbc_node_num = 0; -	xbc_free_mem(xbc_nodes, sizeof(struct xbc_node) * XBC_NODE_MAX); +	xbc_free_mem(xbc_nodes, sizeof(struct xbc_node) * XBC_NODE_MAX, early);  	xbc_nodes = NULL;  	brace_index = 0;  } @@ -963,7 +967,7 @@ int __init xbc_init(const char *data, size_t size, const char **emsg, int *epos)  	if (!xbc_nodes) {  		if (emsg)  			*emsg = "Failed to allocate bootconfig nodes"; -		xbc_exit(); +		_xbc_exit(true);  		return -ENOMEM;  	}  	memset(xbc_nodes, 0, sizeof(struct xbc_node) * XBC_NODE_MAX); @@ -977,7 +981,7 @@ int __init xbc_init(const char *data, size_t size, const char **emsg, int *epos)  			*epos = xbc_err_pos;  		if (emsg)  			*emsg = xbc_err_msg; -		xbc_exit(); +		_xbc_exit(true);  	} else  		ret = xbc_node_num;  |