X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Flinux%2Flinux-mem.h;h=69d027fb11b0fd2f61cfa8bbc74bcc37f9661d91;hb=77f5bb4dace53e0040dea4ce5c72156e901e6819;hp=3554dfe81d83c744539993350e5c1650fddfd0b1;hpb=3c0b5e5a734da58e86bf46dffda9913ba4932d13;p=fs%2Flustre-release.git diff --git a/libcfs/include/libcfs/linux/linux-mem.h b/libcfs/include/libcfs/linux/linux-mem.h index 3554dfe..69d027f 100644 --- a/libcfs/include/libcfs/linux/linux-mem.h +++ b/libcfs/include/libcfs/linux/linux-mem.h @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -41,14 +37,6 @@ #ifndef __LIBCFS_LINUX_CFS_MEM_H__ #define __LIBCFS_LINUX_CFS_MEM_H__ -#ifndef __LIBCFS_LIBCFS_H__ -#error Do not #include this file directly. #include instead -#endif - -#ifndef __KERNEL__ -#error This include is only for kernel use. -#endif - #include #include #include @@ -56,98 +44,97 @@ #ifdef HAVE_MM_INLINE # include #endif +#include +#ifdef HAVE_SCHED_HEADERS +#include +#endif -#define CFS_PAGE_MASK (~((__u64)PAGE_CACHE_SIZE-1)) - -#define page_index(p) ((p)->index) - - -#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 NUM_CACHEPAGES \ - min(num_physpages, 1UL << (30 - PAGE_CACHE_SHIFT) * 3 / 4) +#ifdef HAVE_TOTALRAM_PAGES_AS_FUNC + #ifndef cfs_totalram_pages + #define cfs_totalram_pages() totalram_pages() + #endif #else -#define NUM_CACHEPAGES num_physpages + #ifndef cfs_totalram_pages + #define cfs_totalram_pages() totalram_pages + #endif #endif -/* - * In Linux there is no way to determine whether current execution context is - * blockable. - */ -#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 +#ifndef HAVE_MEMALLOC_RECLAIM +static inline unsigned int memalloc_noreclaim_save(void) +{ + unsigned int flags = current->flags & PF_MEMALLOC; -#define DECL_MMSPACE mm_segment_t __oldfs -#define MMSPACE_OPEN \ - do { __oldfs = get_fs(); set_fs(get_ds());} while(0) -#define MMSPACE_CLOSE set_fs(__oldfs) + current->flags |= PF_MEMALLOC; + return flags; +} +static inline void memalloc_noreclaim_restore(unsigned int flags) +{ + current->flags = (current->flags & ~PF_MEMALLOC) | flags; +} +#endif /* !HAVE_MEMALLOC_RECLAIM */ -extern void *cfs_cpt_malloc(struct cfs_cpt_table *cptab, int cpt, - size_t nr_bytes, unsigned int flags); -extern void *cfs_cpt_vmalloc(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, unsigned int flags); -extern void *cfs_mem_cache_cpt_alloc(struct kmem_cache *cachep, - struct cfs_cpt_table *cptab, - int cpt, unsigned int flags); +#ifndef HAVE_BITMAP_ALLOC +static inline unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) +{ + return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), + flags); +} + +static inline unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) +{ + return bitmap_alloc(nbits, flags | __GFP_ZERO); +} + +static inline void bitmap_free(const unsigned long *bitmap) +{ + kfree(bitmap); +} +#endif /* !HAVE_BITMAP_ALLOC */ /* * 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 -# 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 -# define shrink_param(sc, var) (var) +#ifndef SHRINK_STOP +# define SHRINK_STOP (~0UL) #endif -typedef int (*shrinker_t)(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)); - -static inline -struct shrinker *set_shrinker(int seek, shrinker_t func) +#ifndef HAVE_MMAP_LOCK +static inline void mmap_write_lock(struct mm_struct *mm) { - struct shrinker *s; - - s = kzalloc(sizeof(*s), GFP_KERNEL); - if (s == NULL) - return (NULL); + down_write(&mm->mmap_sem); +} - s->shrink = func; - s->seeks = seek; +static inline bool mmap_write_trylock(struct mm_struct *mm) +{ + return down_write_trylock(&mm->mmap_sem) != 0; +} - register_shrinker(s); +static inline void mmap_write_unlock(struct mm_struct *mm) +{ + up_write(&mm->mmap_sem); +} - return s; +static inline void mmap_read_lock(struct mm_struct *mm) +{ + down_read(&mm->mmap_sem); } -static inline -void remove_shrinker(struct shrinker *shrinker) +static inline bool mmap_read_trylock(struct mm_struct *mm) { - if (shrinker == NULL) - return; + return down_read_trylock(&mm->mmap_sem) != 0; +} - unregister_shrinker(shrinker); - kfree(shrinker); +static inline void mmap_read_unlock(struct mm_struct *mm) +{ + up_read(&mm->mmap_sem); } +#endif + +#ifdef HAVE_VMALLOC_2ARGS +#define __ll_vmalloc(size, flags) __vmalloc(size, flags) +#else +#define __ll_vmalloc(size, flags) __vmalloc(size, flags, PAGE_KERNEL) +#endif #endif /* __LINUX_CFS_MEM_H__ */