144e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller/* xfrm_hash.c: Common hash table code. 244e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller * 344e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller * Copyright (C) 2006 David S. Miller (davem@davemloft.net) 444e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller */ 544e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 644e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/kernel.h> 744e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/mm.h> 844e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/bootmem.h> 944e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/vmalloc.h> 1044e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/slab.h> 1144e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include <linux/xfrm.h> 1244e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 1344e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller#include "xfrm_hash.h" 1444e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 1544e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Millerstruct hlist_head *xfrm_hash_alloc(unsigned int sz) 1644e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller{ 1744e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller struct hlist_head *n; 1844e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 1944e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller if (sz <= PAGE_SIZE) 20dcaee95a1b396f85cdc28099f39710be328d3a5eJoonwoo Park n = kzalloc(sz, GFP_KERNEL); 2144e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller else if (hashdist) 227a1c8e5ab120a5f352e78bbc1fa5bb64e6f23639Eric Dumazet n = vzalloc(sz); 2344e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller else 2444e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller n = (struct hlist_head *) 25dcaee95a1b396f85cdc28099f39710be328d3a5eJoonwoo Park __get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO, 266253db055eb62a1bd0a18a1d8489565303b2b1ddHerbert Xu get_order(sz)); 2744e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 2844e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller return n; 2944e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller} 3044e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller 3144e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Millervoid xfrm_hash_free(struct hlist_head *n, unsigned int sz) 3244e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller{ 3344e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller if (sz <= PAGE_SIZE) 3444e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller kfree(n); 3544e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller else if (hashdist) 3644e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller vfree(n); 3744e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller else 3844e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller free_pages((unsigned long)n, get_order(sz)); 3944e36b42a8378be1dcf7e6f8a1cb2710a8903387David S. Miller} 40