Merge branch 'akpm' (patches from Andrew)
Merge misc updates from Andrew Morton: - a few misc things - the rest of MM - remove flex_arrays, replace with new simple radix-tree implementation * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (38 commits) Drop flex_arrays sctp: convert to genradix proc: commit to genradix generic radix trees selinux: convert to kvmalloc md: convert to kvmalloc openvswitch: convert to kvmalloc of: fix kmemleak crash caused by imbalance in early memory reservation mm: memblock: update comments and kernel-doc memblock: split checks whether a region should be skipped to a helper function memblock: remove memblock_{set,clear}_region_flags memblock: drop memblock_alloc_*_nopanic() variants memblock: memblock_alloc_try_nid: don't panic treewide: add checks for the return value of memblock_alloc*() swiotlb: add checks for the return value of memblock_alloc*() init/main: add checks for the return value of memblock_alloc*() mm/percpu: add checks for the return value of memblock_alloc*() sparc: add checks for the return value of memblock_alloc*() ia64: add checks for the return value of memblock_alloc*() arch: don't memset(0) memory returned by memblock_alloc() ...
This commit is contained in:
@@ -199,6 +199,7 @@ void __init swiotlb_update_mem_attributes(void)
|
||||
int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
|
||||
{
|
||||
unsigned long i, bytes;
|
||||
size_t alloc_size;
|
||||
|
||||
bytes = nslabs << IO_TLB_SHIFT;
|
||||
|
||||
@@ -211,12 +212,18 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
|
||||
* to find contiguous free memory regions of size up to IO_TLB_SEGSIZE
|
||||
* between io_tlb_start and io_tlb_end.
|
||||
*/
|
||||
io_tlb_list = memblock_alloc(
|
||||
PAGE_ALIGN(io_tlb_nslabs * sizeof(int)),
|
||||
PAGE_SIZE);
|
||||
io_tlb_orig_addr = memblock_alloc(
|
||||
PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)),
|
||||
PAGE_SIZE);
|
||||
alloc_size = PAGE_ALIGN(io_tlb_nslabs * sizeof(int));
|
||||
io_tlb_list = memblock_alloc(alloc_size, PAGE_SIZE);
|
||||
if (!io_tlb_list)
|
||||
panic("%s: Failed to allocate %zu bytes align=0x%lx\n",
|
||||
__func__, alloc_size, PAGE_SIZE);
|
||||
|
||||
alloc_size = PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t));
|
||||
io_tlb_orig_addr = memblock_alloc(alloc_size, PAGE_SIZE);
|
||||
if (!io_tlb_orig_addr)
|
||||
panic("%s: Failed to allocate %zu bytes align=0x%lx\n",
|
||||
__func__, alloc_size, PAGE_SIZE);
|
||||
|
||||
for (i = 0; i < io_tlb_nslabs; i++) {
|
||||
io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
|
||||
io_tlb_orig_addr[i] = INVALID_PHYS_ADDR;
|
||||
@@ -249,7 +256,7 @@ swiotlb_init(int verbose)
|
||||
bytes = io_tlb_nslabs << IO_TLB_SHIFT;
|
||||
|
||||
/* Get IO TLB memory from the low pages */
|
||||
vstart = memblock_alloc_low_nopanic(PAGE_ALIGN(bytes), PAGE_SIZE);
|
||||
vstart = memblock_alloc_low(PAGE_ALIGN(bytes), PAGE_SIZE);
|
||||
if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
|
||||
return;
|
||||
|
||||
|
@@ -965,6 +965,9 @@ void __init __register_nosave_region(unsigned long start_pfn,
|
||||
/* This allocation cannot fail */
|
||||
region = memblock_alloc(sizeof(struct nosave_region),
|
||||
SMP_CACHE_BYTES);
|
||||
if (!region)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
sizeof(struct nosave_region));
|
||||
}
|
||||
region->start_pfn = start_pfn;
|
||||
region->end_pfn = end_pfn;
|
||||
|
@@ -1143,14 +1143,7 @@ void __init setup_log_buf(int early)
|
||||
if (!new_log_buf_len)
|
||||
return;
|
||||
|
||||
if (early) {
|
||||
new_log_buf =
|
||||
memblock_alloc(new_log_buf_len, LOG_ALIGN);
|
||||
} else {
|
||||
new_log_buf = memblock_alloc_nopanic(new_log_buf_len,
|
||||
LOG_ALIGN);
|
||||
}
|
||||
|
||||
new_log_buf = memblock_alloc(new_log_buf_len, LOG_ALIGN);
|
||||
if (unlikely(!new_log_buf)) {
|
||||
pr_err("log_buf_len: %lu bytes not available\n",
|
||||
new_log_buf_len);
|
||||
|
@@ -2643,23 +2643,25 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
|
||||
int *valp,
|
||||
int write, void *data)
|
||||
{
|
||||
int tmp, ret;
|
||||
struct do_proc_dointvec_minmax_conv_param *param = data;
|
||||
/*
|
||||
* If writing, first do so via a temporary local int so we can
|
||||
* bounds-check it before touching *valp.
|
||||
*/
|
||||
int *ip = write ? &tmp : valp;
|
||||
|
||||
ret = do_proc_dointvec_conv(negp, lvalp, ip, write, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (write) {
|
||||
int val = *negp ? -*lvalp : *lvalp;
|
||||
if ((param->min && *param->min > val) ||
|
||||
(param->max && *param->max < val))
|
||||
if ((param->min && *param->min > tmp) ||
|
||||
(param->max && *param->max < tmp))
|
||||
return -EINVAL;
|
||||
*valp = val;
|
||||
} else {
|
||||
int val = *valp;
|
||||
if (val < 0) {
|
||||
*negp = true;
|
||||
*lvalp = -(unsigned long)val;
|
||||
} else {
|
||||
*negp = false;
|
||||
*lvalp = (unsigned long)val;
|
||||
}
|
||||
*valp = tmp;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2708,22 +2710,22 @@ static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
|
||||
unsigned int *valp,
|
||||
int write, void *data)
|
||||
{
|
||||
int ret;
|
||||
unsigned int tmp;
|
||||
struct do_proc_douintvec_minmax_conv_param *param = data;
|
||||
/* write via temporary local uint for bounds-checking */
|
||||
unsigned int *up = write ? &tmp : valp;
|
||||
|
||||
ret = do_proc_douintvec_conv(lvalp, up, write, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (write) {
|
||||
unsigned int val = *lvalp;
|
||||
|
||||
if (*lvalp > UINT_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if ((param->min && *param->min > val) ||
|
||||
(param->max && *param->max < val))
|
||||
if ((param->min && *param->min > tmp) ||
|
||||
(param->max && *param->max < tmp))
|
||||
return -ERANGE;
|
||||
|
||||
*valp = val;
|
||||
} else {
|
||||
unsigned int val = *valp;
|
||||
*lvalp = (unsigned long) val;
|
||||
*valp = tmp;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user