18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* xfrm_hash.c: Common hash table code. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2006 David S. Miller (davem@davemloft.net) 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/kernel.h> 88c2ecf20Sopenharmony_ci#include <linux/mm.h> 98c2ecf20Sopenharmony_ci#include <linux/memblock.h> 108c2ecf20Sopenharmony_ci#include <linux/vmalloc.h> 118c2ecf20Sopenharmony_ci#include <linux/slab.h> 128c2ecf20Sopenharmony_ci#include <linux/xfrm.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "xfrm_hash.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistruct hlist_head *xfrm_hash_alloc(unsigned int sz) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci struct hlist_head *n; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci if (sz <= PAGE_SIZE) 218c2ecf20Sopenharmony_ci n = kzalloc(sz, GFP_KERNEL); 228c2ecf20Sopenharmony_ci else if (hashdist) 238c2ecf20Sopenharmony_ci n = vzalloc(sz); 248c2ecf20Sopenharmony_ci else 258c2ecf20Sopenharmony_ci n = (struct hlist_head *) 268c2ecf20Sopenharmony_ci __get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO, 278c2ecf20Sopenharmony_ci get_order(sz)); 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci return n; 308c2ecf20Sopenharmony_ci} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_civoid xfrm_hash_free(struct hlist_head *n, unsigned int sz) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci if (sz <= PAGE_SIZE) 358c2ecf20Sopenharmony_ci kfree(n); 368c2ecf20Sopenharmony_ci else if (hashdist) 378c2ecf20Sopenharmony_ci vfree(n); 388c2ecf20Sopenharmony_ci else 398c2ecf20Sopenharmony_ci free_pages((unsigned long)n, get_order(sz)); 408c2ecf20Sopenharmony_ci} 41