diff options
Diffstat (limited to 'mm/slab.c')
| -rw-r--r-- | mm/slab.c | 76 | 
1 files changed, 27 insertions, 49 deletions
| diff --git a/mm/slab.c b/mm/slab.c index b1e40dafbab3..264037449f08 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -829,12 +829,12 @@ static void init_reap_node(int cpu)  static void next_reap_node(void)  { -	int node = __get_cpu_var(slab_reap_node); +	int node = __this_cpu_read(slab_reap_node);  	node = next_node(node, node_online_map);  	if (unlikely(node >= MAX_NUMNODES))  		node = first_node(node_online_map); -	__get_cpu_var(slab_reap_node) = node; +	__this_cpu_write(slab_reap_node, node);  }  #else @@ -1012,7 +1012,7 @@ static void __drain_alien_cache(struct kmem_cache *cachep,   */  static void reap_alien(struct kmem_cache *cachep, struct kmem_list3 *l3)  { -	int node = __get_cpu_var(slab_reap_node); +	int node = __this_cpu_read(slab_reap_node);  	if (l3->alien) {  		struct array_cache *ac = l3->alien[node]; @@ -1293,7 +1293,7 @@ static int __cpuinit cpuup_callback(struct notifier_block *nfb,  		 * anything expensive but will only modify reap_work  		 * and reschedule the timer.  		*/ -		cancel_rearming_delayed_work(&per_cpu(slab_reap_work, cpu)); +		cancel_delayed_work_sync(&per_cpu(slab_reap_work, cpu));  		/* Now the cache_reaper is guaranteed to be not running. */  		per_cpu(slab_reap_work, cpu).work.func = NULL;    		break; @@ -2781,7 +2781,7 @@ static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp,  /*   * Map pages beginning at addr to the given cache and slab. This is required   * for the slab allocator to be able to lookup the cache and slab of a - * virtual address for kfree, ksize, kmem_ptr_validate, and slab debugging. + * virtual address for kfree, ksize, and slab debugging.   */  static void slab_map_pages(struct kmem_cache *cache, struct slab *slab,  			   void *addr) @@ -3653,42 +3653,19 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)  EXPORT_SYMBOL(kmem_cache_alloc);  #ifdef CONFIG_TRACING -void *kmem_cache_alloc_notrace(struct kmem_cache *cachep, gfp_t flags) +void * +kmem_cache_alloc_trace(size_t size, struct kmem_cache *cachep, gfp_t flags)  { -	return __cache_alloc(cachep, flags, __builtin_return_address(0)); -} -EXPORT_SYMBOL(kmem_cache_alloc_notrace); -#endif +	void *ret; -/** - * kmem_ptr_validate - check if an untrusted pointer might be a slab entry. - * @cachep: the cache we're checking against - * @ptr: pointer to validate - * - * This verifies that the untrusted pointer looks sane; - * it is _not_ a guarantee that the pointer is actually - * part of the slab cache in question, but it at least - * validates that the pointer can be dereferenced and - * looks half-way sane. - * - * Currently only used for dentry validation. - */ -int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr) -{ -	unsigned long size = cachep->buffer_size; -	struct page *page; +	ret = __cache_alloc(cachep, flags, __builtin_return_address(0)); -	if (unlikely(!kern_ptr_validate(ptr, size))) -		goto out; -	page = virt_to_page(ptr); -	if (unlikely(!PageSlab(page))) -		goto out; -	if (unlikely(page_get_cache(page) != cachep)) -		goto out; -	return 1; -out: -	return 0; +	trace_kmalloc(_RET_IP_, ret, +		      size, slab_buffer_size(cachep), flags); +	return ret;  } +EXPORT_SYMBOL(kmem_cache_alloc_trace); +#endif  #ifdef CONFIG_NUMA  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid) @@ -3705,31 +3682,32 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)  EXPORT_SYMBOL(kmem_cache_alloc_node);  #ifdef CONFIG_TRACING -void *kmem_cache_alloc_node_notrace(struct kmem_cache *cachep, -				    gfp_t flags, -				    int nodeid) +void *kmem_cache_alloc_node_trace(size_t size, +				  struct kmem_cache *cachep, +				  gfp_t flags, +				  int nodeid)  { -	return __cache_alloc_node(cachep, flags, nodeid, +	void *ret; + +	ret = __cache_alloc_node(cachep, flags, nodeid,  				  __builtin_return_address(0)); +	trace_kmalloc_node(_RET_IP_, ret, +			   size, slab_buffer_size(cachep), +			   flags, nodeid); +	return ret;  } -EXPORT_SYMBOL(kmem_cache_alloc_node_notrace); +EXPORT_SYMBOL(kmem_cache_alloc_node_trace);  #endif  static __always_inline void *  __do_kmalloc_node(size_t size, gfp_t flags, int node, void *caller)  {  	struct kmem_cache *cachep; -	void *ret;  	cachep = kmem_find_general_cachep(size, flags);  	if (unlikely(ZERO_OR_NULL_PTR(cachep)))  		return cachep; -	ret = kmem_cache_alloc_node_notrace(cachep, flags, node); - -	trace_kmalloc_node((unsigned long) caller, ret, -			   size, cachep->buffer_size, flags, node); - -	return ret; +	return kmem_cache_alloc_node_trace(size, cachep, flags, node);  }  #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_TRACING) |