linux/fs/xfs/linux-2.6/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
  25/*
  26 * General memory allocation interfaces
  27 */
  28
  29#define KM_SLEEP        0x0001u
  30#define KM_NOSLEEP      0x0002u
  31#define KM_NOFS         0x0004u
  32#define KM_MAYFAIL      0x0008u
  33#define KM_LARGE        0x0010u
  34
  35/*
  36 * We use a special process flag to avoid recursive callbacks into
  37 * the filesystem during transactions.  We will also issue our own
  38 * warnings, so we explicitly skip any generic ones (silly of us).
  39 */
  40static inline gfp_t
  41kmem_flags_convert(unsigned int __nocast flags)
  42{
  43        gfp_t   lflags;
  44
  45        BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL|KM_LARGE));
  46
  47        if (flags & KM_NOSLEEP) {
  48                lflags = GFP_ATOMIC | __GFP_NOWARN;
  49        } else {
  50                lflags = GFP_KERNEL | __GFP_NOWARN;
  51                if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS))
  52                        lflags &= ~__GFP_FS;
  53        }
  54        return lflags;
  55}
  56
  57extern void *kmem_alloc(size_t, unsigned int __nocast);
  58extern void *kmem_zalloc(size_t, unsigned int __nocast);
  59extern void *kmem_zalloc_greedy(size_t *, size_t, size_t, unsigned int __nocast);
  60extern void *kmem_realloc(const void *, size_t, size_t, unsigned int __nocast);
  61extern void  kmem_free(const void *);
  62
  63/*
  64 * Zone interfaces
  65 */
  66
  67#define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN
  68#define KM_ZONE_RECLAIM SLAB_RECLAIM_ACCOUNT
  69#define KM_ZONE_SPREAD  SLAB_MEM_SPREAD
  70
  71#define kmem_zone       kmem_cache
  72#define kmem_zone_t     struct kmem_cache
  73
  74static inline kmem_zone_t *
  75kmem_zone_init(int size, char *zone_name)
  76{
  77        return kmem_cache_create(zone_name, size, 0, 0, NULL);
  78}
  79
  80static inline kmem_zone_t *
  81kmem_zone_init_flags(int size, char *zone_name, unsigned long flags,
  82                     void (*construct)(void *))
  83{
  84        return kmem_cache_create(zone_name, size, 0, flags, construct);
  85}
  86
  87static inline void
  88kmem_zone_free(kmem_zone_t *zone, void *ptr)
  89{
  90        kmem_cache_free(zone, ptr);
  91}
  92
  93static inline void
  94kmem_zone_destroy(kmem_zone_t *zone)
  95{
  96        if (zone)
  97                kmem_cache_destroy(zone);
  98}
  99
 100extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast);
 101extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast);
 102
 103static inline int
 104kmem_shake_allow(gfp_t gfp_mask)
 105{
 106        return ((gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS));
 107}
 108
 109#endif /* __XFS_SUPPORT_KMEM_H__ */
 110