X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Flinux%2Flinux-mem.c;h=cc18de2d90459ce6bf9829498d2c589281d23dfe;hb=1b2547843817b4b7adbeb87ea9b070d9cac35c90;hp=37cf62e2942f753a6856f68d800b9ee61744f723;hpb=0f8dca08a4f68cba82c2c822998ecc309d3b7aaf;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/linux/linux-mem.c b/libcfs/libcfs/linux/linux-mem.c index 37cf62e..cc18de2 100644 --- a/libcfs/libcfs/linux/linux-mem.c +++ b/libcfs/libcfs/linux/linux-mem.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -41,146 +41,40 @@ #include #include -static unsigned int cfs_alloc_flags_to_gfp(u_int32_t flags) -{ - unsigned int mflags = 0; - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) - if (flags & CFS_ALLOC_ATOMIC) - mflags |= __GFP_HIGH; - else if (flags & CFS_ALLOC_WAIT) - mflags |= __GFP_WAIT; - else - mflags |= (__GFP_HIGH | __GFP_WAIT); - if (flags & CFS_ALLOC_IO) - mflags |= __GFP_IO | __GFP_HIGHIO; -#else - if (flags & CFS_ALLOC_ATOMIC) - mflags |= __GFP_HIGH; - else - mflags |= __GFP_WAIT; - if (flags & CFS_ALLOC_NOWARN) - mflags |= __GFP_NOWARN; - if (flags & CFS_ALLOC_IO) - mflags |= __GFP_IO; -#endif - if (flags & CFS_ALLOC_FS) - mflags |= __GFP_FS; - if (flags & CFS_ALLOC_HIGH) - mflags |= __GFP_HIGH; - return mflags; -} - void * -cfs_alloc(size_t nr_bytes, u_int32_t flags) +cfs_cpt_malloc(struct cfs_cpt_table *cptab, int cpt, + size_t nr_bytes, unsigned int flags) { - void *ptr = NULL; + void *ptr; - ptr = kmalloc(nr_bytes, cfs_alloc_flags_to_gfp(flags)); - if (ptr != NULL && (flags & CFS_ALLOC_ZERO)) + ptr = kmalloc_node(nr_bytes, flags, + cfs_cpt_spread_node(cptab, cpt)); + if (ptr != NULL && (flags & __GFP_ZERO) != 0) memset(ptr, 0, nr_bytes); - return ptr; -} -void -cfs_free(void *addr) -{ - kfree(addr); + return ptr; } +EXPORT_SYMBOL(cfs_cpt_malloc); void * -cfs_alloc_large(size_t nr_bytes) -{ - return vmalloc(nr_bytes); -} - -void -cfs_free_large(void *addr) -{ - vfree(addr); -} - -cfs_page_t *cfs_alloc_pages(unsigned int flags, unsigned int order) +cfs_cpt_vmalloc(struct cfs_cpt_table *cptab, int cpt, size_t nr_bytes) { - /* - * XXX nikita: do NOT call portals_debug_msg() (CDEBUG/ENTRY/EXIT) - * from here: this will lead to infinite recursion. - */ - return alloc_pages(cfs_alloc_flags_to_gfp(flags), order); + return vmalloc_node(nr_bytes, cfs_cpt_spread_node(cptab, cpt)); } +EXPORT_SYMBOL(cfs_cpt_vmalloc); -void __cfs_free_pages(cfs_page_t *page, unsigned int order) +struct page * +cfs_page_cpt_alloc(struct cfs_cpt_table *cptab, int cpt, unsigned int flags) { - __free_pages(page, order); -} - -cfs_mem_cache_t * -cfs_mem_cache_create (const char *name, size_t size, size_t offset, - unsigned long flags) -{ -#ifdef HAVE_KMEM_CACHE_CREATE_DTOR - return kmem_cache_create(name, size, offset, flags, NULL, NULL); -#else - return kmem_cache_create(name, size, offset, flags, NULL); -#endif -} - -int -cfs_mem_cache_destroy (cfs_mem_cache_t * cachep) -{ -#ifdef HAVE_KMEM_CACHE_DESTROY_INT - return kmem_cache_destroy(cachep); -#else - kmem_cache_destroy(cachep); - return 0; -#endif + return alloc_pages_node(cfs_cpt_spread_node(cptab, cpt), flags, 0); } +EXPORT_SYMBOL(cfs_page_cpt_alloc); void * -cfs_mem_cache_alloc(cfs_mem_cache_t *cachep, int flags) -{ - return kmem_cache_alloc(cachep, cfs_alloc_flags_to_gfp(flags)); -} - -void -cfs_mem_cache_free(cfs_mem_cache_t *cachep, void *objp) -{ - return kmem_cache_free(cachep, objp); -} - -/** - * Returns true if \a addr is an address of an allocated object in a slab \a - * kmem. Used in assertions. This check is optimistically imprecise, i.e., it - * occasionally returns true for the incorrect addresses, but if it returns - * false, then the addresses is guaranteed to be incorrect. - */ -int cfs_mem_is_in_cache(const void *addr, const cfs_mem_cache_t *kmem) +cfs_mem_cache_cpt_alloc(struct kmem_cache *cachep, struct cfs_cpt_table *cptab, + int cpt, unsigned int flags) { -#ifdef CONFIG_SLAB - struct page *page; - - /* - * XXX Copy of mm/slab.c:virt_to_cache(). It won't work with other - * allocators, like slub and slob. - */ - page = virt_to_page(addr); - if (unlikely(PageCompound(page))) - page = (struct page *)page->private; - return PageSlab(page) && ((void *)page->lru.next) == kmem; -#else - return 1; -#endif + return kmem_cache_alloc_node(cachep, flags, + cfs_cpt_spread_node(cptab, cpt)); } -EXPORT_SYMBOL(cfs_mem_is_in_cache); - - -EXPORT_SYMBOL(cfs_alloc); -EXPORT_SYMBOL(cfs_free); -EXPORT_SYMBOL(cfs_alloc_large); -EXPORT_SYMBOL(cfs_free_large); -EXPORT_SYMBOL(cfs_alloc_pages); -EXPORT_SYMBOL(__cfs_free_pages); -EXPORT_SYMBOL(cfs_mem_cache_create); -EXPORT_SYMBOL(cfs_mem_cache_destroy); -EXPORT_SYMBOL(cfs_mem_cache_alloc); -EXPORT_SYMBOL(cfs_mem_cache_free); +EXPORT_SYMBOL(cfs_mem_cache_cpt_alloc);