// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2021. Huawei Technologies Co., Ltd. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include "euler.h" #include "kmem_cache.h" #include "dep.h" static struct kmem_cache *eufs_dep_node_cachep; static struct kmem_cache *eufs_page_cachep; static struct kmem_cache *eufs_inode_cachep; static void init_once(void *foo) { struct eufs_inode_info *vi = foo; inode_init_once(&vi->vfs_inode); } int __init init_page_cache(void) { eufs_page_cachep = kmem_cache_create( "eufs_page_cache", PAGE_SIZE, 0, (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD | SLAB_HWCACHE_ALIGN), NULL); if (eufs_page_cachep == NULL) return -ENOMEM; return 0; } int __init init_dep_node_cache(void) { eufs_dep_node_cachep = kmem_cache_create( "eufs_dep_node_cache", sizeof(struct dep_node), 0, (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD | SLAB_HWCACHE_ALIGN), NULL); if (eufs_dep_node_cachep == NULL) return -ENOMEM; return 0; } int __init init_inodecache(void) { eufs_inode_cachep = kmem_cache_create( "eufs_inode_cache", sizeof(struct eufs_inode_info), 0, (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD), init_once); if (eufs_inode_cachep == NULL) return -ENOMEM; return 0; } void destroy_page_cache(void) { kmem_cache_destroy(eufs_page_cachep); } void destroy_inodecache(void) { rcu_barrier(); kmem_cache_destroy(eufs_inode_cachep); } void destroy_dep_node_cache(void) { kmem_cache_destroy(eufs_dep_node_cachep); } void *eufs_zalloc_page(void) { return kmem_cache_zalloc(eufs_page_cachep, GFP_NOFS | __GFP_NOFAIL); } void *eufs_alloc_page(void) { return kmem_cache_alloc(eufs_page_cachep, GFP_NOFS | __GFP_NOFAIL); } void eufs_free_page(void *page) { kmem_cache_free(eufs_page_cachep, page); } struct dep_node *eufs_alloc_dep_node(void) { return kmem_cache_alloc(eufs_dep_node_cachep, GFP_NOFS); } void eufs_free_dep_node(struct dep_node *dep) { kmem_cache_free(eufs_dep_node_cachep, dep); } struct eufs_inode_info *eufs_alloc_vi(void) { return kmem_cache_alloc(eufs_inode_cachep, GFP_NOFS); } void eufs_free_vi(struct eufs_inode_info *vi) { kmem_cache_free(eufs_inode_cachep, vi); }