diff options
Diffstat (limited to 'mm/nommu.c')
| -rw-r--r-- | mm/nommu.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/mm/nommu.c b/mm/nommu.c index ef8c62cec69..4462b6a3fcb 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -39,7 +39,7 @@ struct page *mem_map;  unsigned long max_mapnr;  unsigned long num_physpages;  unsigned long askedalloc, realalloc; -atomic_t vm_committed_space = ATOMIC_INIT(0); +atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0);  int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */  int sysctl_overcommit_ratio = 50; /* default is 50% */  int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; @@ -109,16 +109,23 @@ unsigned int kobjsize(const void *objp)  	 * If the object we have should not have ksize performed on it,  	 * return size of 0  	 */ -	if (!objp || (unsigned long)objp >= memory_end || !((page = virt_to_page(objp)))) +	if (!objp || !virt_addr_valid(objp))  		return 0; +	page = virt_to_head_page(objp); + +	/* +	 * If the allocator sets PageSlab, we know the pointer came from +	 * kmalloc(). +	 */  	if (PageSlab(page))  		return ksize(objp); -	BUG_ON(page->index < 0); -	BUG_ON(page->index >= MAX_ORDER); - -	return (PAGE_SIZE << page->index); +	/* +	 * The ksize() function is only guaranteed to work for pointers +	 * returned by kmalloc(). So handle arbitrary pointers here. +	 */ +	return PAGE_SIZE << compound_order(page);  }  /* @@ -1410,7 +1417,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)  	 * cast `allowed' as a signed long because vm_committed_space  	 * sometimes has a negative value  	 */ -	if (atomic_read(&vm_committed_space) < (long)allowed) +	if (atomic_long_read(&vm_committed_space) < (long)allowed)  		return 0;  error:  	vm_unacct_memory(pages);  |