X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Flinux%2Flinux-mem.h;h=fb2c946bf908b2b001b36bcab014cc2eba64b64e;hb=2b294992edce5af7b79d4300ed3aa1ea6a8db850;hp=17699278a135dc4a153fc1a0d016cb43df7ab314;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/libcfs/include/libcfs/linux/linux-mem.h b/libcfs/include/libcfs/linux/linux-mem.h index 1769927..fb2c946 100644 --- a/libcfs/include/libcfs/linux/linux-mem.h +++ b/libcfs/include/libcfs/linux/linux-mem.h @@ -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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -57,119 +57,128 @@ # include #endif -typedef struct page cfs_page_t; -#define CFS_PAGE_SIZE PAGE_CACHE_SIZE -#define CFS_PAGE_SHIFT PAGE_CACHE_SHIFT -#define CFS_PAGE_MASK (~((__u64)CFS_PAGE_SIZE-1)) - -#define cfs_num_physpages num_physpages - -#define cfs_copy_from_user(to, from, n) copy_from_user(to, from, n) -#define cfs_copy_to_user(to, from, n) copy_to_user(to, from, n) - -static inline void *cfs_page_address(cfs_page_t *page) -{ - /* - * XXX nikita: do NOT call portals_debug_msg() (CDEBUG/ENTRY/EXIT) - * from here: this will lead to infinite recursion. - */ - return page_address(page); -} - -static inline void *cfs_kmap(cfs_page_t *page) -{ - return kmap(page); -} - -static inline void cfs_kunmap(cfs_page_t *page) -{ - kunmap(page); -} - -static inline void cfs_get_page(cfs_page_t *page) -{ - get_page(page); -} - -static inline int cfs_page_count(cfs_page_t *page) -{ - return page_count(page); -} - -#define cfs_page_index(p) ((p)->index) - -/* - * Memory allocator - * XXX Liang: move these declare to public file - */ -extern void *cfs_alloc(size_t nr_bytes, u_int32_t flags); -extern void cfs_free(void *addr); +#ifndef HAVE_LIBCFS_CPT +/* Need this for cfs_cpt_table */ +#include +#endif -extern void *cfs_alloc_large(size_t nr_bytes); -extern void cfs_free_large(void *addr); +#define CFS_PAGE_MASK (~((__u64)PAGE_CACHE_SIZE-1)) -extern cfs_page_t *cfs_alloc_pages(unsigned int flags, unsigned int order); -extern void __cfs_free_pages(cfs_page_t *page, unsigned int order); +#define page_index(p) ((p)->index) -#define cfs_alloc_page(flags) cfs_alloc_pages(flags, 0) -#define __cfs_free_page(page) __cfs_free_pages(page, 0) -#define cfs_free_page(p) __free_pages(p, 0) -#define libcfs_memory_pressure_get() (current->flags & PF_MEMALLOC) -#define libcfs_memory_pressure_set() do { current->flags |= PF_MEMALLOC; } while (0) -#define libcfs_memory_pressure_clr() do { current->flags &= ~PF_MEMALLOC; } while (0) +#define memory_pressure_get() (current->flags & PF_MEMALLOC) +#define memory_pressure_set() do { current->flags |= PF_MEMALLOC; } while (0) +#define memory_pressure_clr() do { current->flags &= ~PF_MEMALLOC; } while (0) #if BITS_PER_LONG == 32 /* limit to lowmem on 32-bit systems */ -#define CFS_NUM_CACHEPAGES \ - min(cfs_num_physpages, 1UL << (30 - CFS_PAGE_SHIFT) * 3 / 4) +#define NUM_CACHEPAGES \ + min(totalram_pages, 1UL << (30 - PAGE_CACHE_SHIFT) * 3 / 4) #else -#define CFS_NUM_CACHEPAGES cfs_num_physpages +#define NUM_CACHEPAGES totalram_pages #endif /* * In Linux there is no way to determine whether current execution context is * blockable. */ -#define CFS_ALLOC_ATOMIC_TRY CFS_ALLOC_ATOMIC - -/* - * SLAB allocator - * XXX Liang: move these declare to public file - */ -#ifdef HAVE_KMEM_CACHE -typedef struct kmem_cache cfs_mem_cache_t; -#else -typedef kmem_cache_t cfs_mem_cache_t; +#define ALLOC_ATOMIC_TRY GFP_ATOMIC +/* GFP_IOFS was added in 2.6.33 kernel */ +#ifndef GFP_IOFS +#define GFP_IOFS (__GFP_IO | __GFP_FS) #endif -extern cfs_mem_cache_t * cfs_mem_cache_create (const char *, size_t, size_t, unsigned long); -extern int cfs_mem_cache_destroy ( cfs_mem_cache_t * ); -extern void *cfs_mem_cache_alloc ( cfs_mem_cache_t *, int); -extern void cfs_mem_cache_free ( cfs_mem_cache_t *, void *); -extern int cfs_mem_is_in_cache(const void *addr, const cfs_mem_cache_t *kmem); - -#define CFS_DECL_MMSPACE mm_segment_t __oldfs -#define CFS_MMSPACE_OPEN \ + +#define DECL_MMSPACE mm_segment_t __oldfs +#define MMSPACE_OPEN \ do { __oldfs = get_fs(); set_fs(get_ds());} while(0) -#define CFS_MMSPACE_CLOSE set_fs(__oldfs) +#define MMSPACE_CLOSE set_fs(__oldfs) -#define CFS_SLAB_HWCACHE_ALIGN SLAB_HWCACHE_ALIGN -#define CFS_SLAB_KERNEL SLAB_KERNEL -#define CFS_SLAB_NOFS SLAB_NOFS + +extern void *cfs_cpt_malloc(struct cfs_cpt_table *cptab, int cpt, + size_t nr_bytes, gfp_t flags); +extern void *cfs_cpt_vzalloc(struct cfs_cpt_table *cptab, int cpt, + size_t nr_bytes); +extern struct page *cfs_page_cpt_alloc(struct cfs_cpt_table *cptab, + int cpt, gfp_t flags); +extern void *cfs_mem_cache_cpt_alloc(struct kmem_cache *cachep, + struct cfs_cpt_table *cptab, + int cpt, gfp_t flags); /* * Shrinker */ +#ifdef HAVE_SHRINK_CONTROL +# define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask) \ + struct shrinker *shrinker, \ + struct shrink_control *sc +# define shrink_param(sc, var) ((sc)->var) +#else +struct shrink_control { + gfp_t gfp_mask; + unsigned long nr_to_scan; +}; +# ifdef HAVE_SHRINKER_WANT_SHRINK_PTR +# define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask) \ + struct shrinker *shrinker, \ + int nr_to_scan, gfp_t gfp_mask +# else +# define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask) \ + int nr_to_scan, gfp_t gfp_mask +# endif + /* avoid conflict with spl mm_compat.h */ +# define HAVE_SHRINK_CONTROL_STRUCT 1 +# define shrink_param(sc, var) (var) +#endif -#ifndef HAVE_REGISTER_SHRINKER -/* Shrinker callback */ -typedef shrinker_t cfs_shrinker_t; -#define cfs_set_shrinker(seeks, shrinker) set_shrinker(seeks, shrinker) -#define cfs_remove_shrinker(shrinker) remove_shrinker(shrinker) -#endif /* !HAVE_REGISTER_SHRINKER */ +#ifdef HAVE_SHRINKER_COUNT +struct shrinker_var { + unsigned long (*count)(struct shrinker *, + struct shrink_control *sc); + unsigned long (*scan)(struct shrinker *, + struct shrink_control *sc); +}; +# define DEF_SHRINKER_VAR(name, shrink, count_obj, scan_obj) \ + struct shrinker_var name = { .count = count_obj, .scan = scan_obj } +#else +struct shrinker_var { + int (*shrink)(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)); +}; +# define DEF_SHRINKER_VAR(name, shrinker, count, scan) \ + struct shrinker_var name = { .shrink = shrinker } +# define SHRINK_STOP (~0UL) +#endif -/* struct shrinker */ -#define cfs_shrinker shrinker +static inline +struct shrinker *set_shrinker(int seek, struct shrinker_var *var) +{ + struct shrinker *s; + + s = kzalloc(sizeof(*s), GFP_KERNEL); + if (s == NULL) + return (NULL); + +#ifdef HAVE_SHRINKER_COUNT + s->count_objects = var->count; + s->scan_objects = var->scan; +#else + s->shrink = var->shrink; +#endif + s->seeks = seek; + + register_shrinker(s); + + return s; +} + +static inline +void remove_shrinker(struct shrinker *shrinker) +{ + if (shrinker == NULL) + return; + + unregister_shrinker(shrinker); + kfree(shrinker); +} -#define CFS_DEFAULT_SEEKS DEFAULT_SEEKS #endif /* __LINUX_CFS_MEM_H__ */