linux-mem.h revision 4f6cc9ab5337879c4a79564b3aed4fa429d1cd12
1/* 2 * GPL HEADER START 3 * 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 only, 8 * as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License version 2 for more details (a copy is included 14 * in the LICENSE file that accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License 17 * version 2 along with this program; If not, see 18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19 * 20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21 * CA 95054 USA or visit www.sun.com if you need additional information or 22 * have any questions. 23 * 24 * GPL HEADER END 25 */ 26/* 27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 28 * Use is subject to license terms. 29 * 30 * Copyright (c) 2011, 2012, Intel Corporation. 31 */ 32/* 33 * This file is part of Lustre, http://www.lustre.org/ 34 * Lustre is a trademark of Sun Microsystems, Inc. 35 * 36 * libcfs/include/libcfs/linux/linux-mem.h 37 * 38 * Basic library routines. 39 */ 40 41#ifndef __LIBCFS_LINUX_CFS_MEM_H__ 42#define __LIBCFS_LINUX_CFS_MEM_H__ 43 44#ifndef __LIBCFS_LIBCFS_H__ 45#error Do not #include this file directly. #include <linux/libcfs/libcfs.h> instead 46#endif 47 48 49#include <linux/mm.h> 50#include <linux/vmalloc.h> 51#include <linux/pagemap.h> 52#include <linux/slab.h> 53#include <linux/memcontrol.h> 54#include <linux/mm_inline.h> 55 56#define CFS_PAGE_MASK (~((__u64)PAGE_CACHE_SIZE-1)) 57#define page_index(p) ((p)->index) 58 59#define memory_pressure_get() (current->flags & PF_MEMALLOC) 60#define memory_pressure_set() do { current->flags |= PF_MEMALLOC; } while (0) 61#define memory_pressure_clr() do { current->flags &= ~PF_MEMALLOC; } while (0) 62 63#if BITS_PER_LONG == 32 64/* limit to lowmem on 32-bit systems */ 65#define NUM_CACHEPAGES \ 66 min(totalram_pages, 1UL << (30 - PAGE_CACHE_SHIFT) * 3 / 4) 67#else 68#define NUM_CACHEPAGES totalram_pages 69#endif 70 71/* 72 * In Linux there is no way to determine whether current execution context is 73 * blockable. 74 */ 75#define ALLOC_ATOMIC_TRY GFP_ATOMIC 76 77#define DECL_MMSPACE mm_segment_t __oldfs 78#define MMSPACE_OPEN \ 79 do { __oldfs = get_fs(); set_fs(get_ds());} while(0) 80#define MMSPACE_CLOSE set_fs(__oldfs) 81 82/* 83 * Shrinker 84 */ 85 86# define SHRINKER_ARGS(sc, nr_to_scan, gfp_mask) \ 87 struct shrinker *shrinker, \ 88 struct shrink_control *sc 89# define shrink_param(sc, var) ((sc)->var) 90 91typedef int (*shrinker_t)(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)); 92 93static inline 94struct shrinker *set_shrinker(int seek, shrinker_t func) 95{ 96 struct shrinker *s; 97 98 s = kmalloc(sizeof(*s), GFP_KERNEL); 99 if (s == NULL) 100 return (NULL); 101 102 s->shrink = func; 103 s->seeks = seek; 104 105 register_shrinker(s); 106 107 return s; 108} 109 110static inline 111void remove_shrinker(struct shrinker *shrinker) 112{ 113 if (shrinker == NULL) 114 return; 115 116 unregister_shrinker(shrinker); 117 kfree(shrinker); 118} 119 120#endif /* __LINUX_CFS_MEM_H__ */ 121