| David S. Miller | 44e36b4 | 2006-08-24 04:50:50 -0700 | [diff] [blame] | 1 | /* xfrm_hash.c: Common hash table code. | 
 | 2 |  * | 
 | 3 |  * Copyright (C) 2006 David S. Miller (davem@davemloft.net) | 
 | 4 |  */ | 
 | 5 |  | 
 | 6 | #include <linux/kernel.h> | 
 | 7 | #include <linux/mm.h> | 
 | 8 | #include <linux/bootmem.h> | 
 | 9 | #include <linux/vmalloc.h> | 
 | 10 | #include <linux/slab.h> | 
 | 11 | #include <linux/xfrm.h> | 
 | 12 |  | 
 | 13 | #include "xfrm_hash.h" | 
 | 14 |  | 
 | 15 | struct hlist_head *xfrm_hash_alloc(unsigned int sz) | 
 | 16 | { | 
 | 17 | 	struct hlist_head *n; | 
 | 18 |  | 
 | 19 | 	if (sz <= PAGE_SIZE) | 
| Joonwoo Park | dcaee95 | 2007-11-26 23:23:21 +0800 | [diff] [blame] | 20 | 		n = kzalloc(sz, GFP_KERNEL); | 
| David S. Miller | 44e36b4 | 2006-08-24 04:50:50 -0700 | [diff] [blame] | 21 | 	else if (hashdist) | 
| Joonwoo Park | dcaee95 | 2007-11-26 23:23:21 +0800 | [diff] [blame] | 22 | 		n = __vmalloc(sz, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL); | 
| David S. Miller | 44e36b4 | 2006-08-24 04:50:50 -0700 | [diff] [blame] | 23 | 	else | 
 | 24 | 		n = (struct hlist_head *) | 
| Joonwoo Park | dcaee95 | 2007-11-26 23:23:21 +0800 | [diff] [blame] | 25 | 			__get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO, | 
| Herbert Xu | 6253db0 | 2007-05-14 02:19:11 -0700 | [diff] [blame] | 26 | 					 get_order(sz)); | 
| David S. Miller | 44e36b4 | 2006-08-24 04:50:50 -0700 | [diff] [blame] | 27 |  | 
| David S. Miller | 44e36b4 | 2006-08-24 04:50:50 -0700 | [diff] [blame] | 28 | 	return n; | 
 | 29 | } | 
 | 30 |  | 
 | 31 | void xfrm_hash_free(struct hlist_head *n, unsigned int sz) | 
 | 32 | { | 
 | 33 | 	if (sz <= PAGE_SIZE) | 
 | 34 | 		kfree(n); | 
 | 35 | 	else if (hashdist) | 
 | 36 | 		vfree(n); | 
 | 37 | 	else | 
 | 38 | 		free_pages((unsigned long)n, get_order(sz)); | 
 | 39 | } |