linux/fs/xfs/kmem.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#ifndef __XFS_SUPPORT_KMEM_H__
  19#define __XFS_SUPPORT_KMEM_H__
  20
  21#include <linux/slab.h>
  22#include <linux/sched.h>
  23#include <linux/mm.h>
  24#include <linux/vmalloc.h>
  25
  26/*
  27 * General memory allocation interfaces
  28 */
  29
  30typedef unsigned __bitwise xfs_km_flags_t;
  31#define KM_SLEEP        ((__force xfs_km_flags_t)0x0001u)
  32#define KM_NOSLEEP      ((__force xfs_km_flags_t)0x0002u)
  33#define KM_NOFS         ((__force xfs_km_flags_t)0x0004u)
  34#define KM_MAYFAIL      ((__force xfs_km_flags_t)0x0008u)
  35
  36/*
  37 * We use a special process flag to avoid recursive callbacks into
  38 * the filesystem during transactions.  We will also issue our own
  39 * warnings, so we explicitly skip any generic ones (silly of us).
  40 */
  41static inline gfp_t
  42kmem_flags_convert(xfs_km_flags_t flags)
  43{
  44        gfp_t   lflags;
  45
  46        BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL));
  47
  48        if (flags & KM_NOSLEEP) {
  49                lflags = GFP_ATOMIC | __GFP_NOWARN;
  50        } else {
  51                lflags = GFP_KERNEL | __GFP_NOWARN;
  52                if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS))
  53                        lflags &= ~__GFP_FS;
  54        }
  55        return lflags;
  56}
  57
  58extern void *kmem_alloc(size_t, xfs_km_flags_t);
  59extern void *kmem_zalloc(size_t, xfs_km_flags_t);
  60extern void *kmem_realloc(const void *, size_t, size_t, xfs_km_flags_t);
  61extern void  kmem_free(const void *);
  62
  63static inline void *kmem_zalloc_large(size_t size)
  64{
  65        return vzalloc(size);
  66}
  67static inline void kmem_free_large(void *ptr)
  68{
  69        vfree(ptr);
  70}
  71
  72extern void *kmem_zalloc_greedy(size_t *, size_t, size_t);
  73
  74/*
  75 * Zone interfaces
  76 */
  77
  78#define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN
  79#define KM_ZONE_RECLAIM SLAB_RECLAIM_ACCOUNT
  80#define KM_ZONE_SPREAD  SLAB_MEM_SPREAD
  81
  82#define kmem_zone       kmem_cache
  83#define kmem_zone_t     struct kmem_cache
  84
  85static inline kmem_zone_t *
  86kmem_zone_init(int size, char *zone_name)
  87{
  88        return kmem_cache_create(zone_name, size, 0, 0, NULL);
  89}
  90
  91static inline kmem_zone_t *
  92kmem_zone_init_flags(int size, char *zone_name, unsigned long flags,
  93                     void (*construct)(void *))
  94{
  95        return kmem_cache_create(zone_name, size, 0, flags, construct);
  96}
  97
  98static inline void
  99kmem_zone_free(kmem_zone_t *zone, void *ptr)
 100{
 101        kmem_cache_free(zone, ptr);
 102}
 103
 104static inline void
 105kmem_zone_destroy(kmem_zone_t *zone)
 106{
 107        if (zone)
 108                kmem_cache_destroy(zone);
 109}
 110
 111extern void *kmem_zone_alloc(kmem_zone_t *, xfs_km_flags_t);
 112extern void *kmem_zone_zalloc(kmem_zone_t *, xfs_km_flags_t);
 113
 114#endif /* __XFS_SUPPORT_KMEM_H__ */
 115