File: [Development] / xfs-linux / linux-2.4 / Attic / kmem.h (download)
Revision 1.34, Fri Aug 18 04:03:12 2006 UTC (11 years, 2 months ago) by nathans.longdrop.melbourne.sgi.com
Branch: MAIN
Changes since 1.33: +2 -1
lines
Add a greedy allocation interface, allocating within a min/max size range.
Merge of xfs-linux-melb:xfs-kern:26803a by kenmcd.
|
/*
* Copyright (c) 2000-2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __XFS_SUPPORT_KMEM_H__
#define __XFS_SUPPORT_KMEM_H__
#include <linux/slab.h>
#include <linux/cache_def.h>
/*
* General memory allocation interfaces
*/
#define KM_SLEEP 0x0001
#define KM_NOSLEEP 0x0002
#define KM_NOFS 0x0004
#define KM_MAYFAIL 0x0008
#define KM_LARGE 0x0010
/*
* We use a special process flag to avoid recursive callbacks into
* the filesystem during transactions. We will also issue our own
* warnings, so we explicitly skip any generic ones (silly of us).
*/
static inline unsigned int
kmem_flags_convert(int flags)
{
int lflags;
BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL|KM_LARGE));
if (flags & KM_NOSLEEP) {
lflags = GFP_ATOMIC;
} else {
lflags = GFP_KERNEL;
if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS))
lflags &= ~__GFP_FS;
}
return lflags;
}
extern void *kmem_alloc(size_t, int);
extern void *kmem_zalloc(size_t, int);
extern void *kmem_zalloc_greedy(size_t *, size_t, size_t, int);
extern void *kmem_realloc(void *, size_t, size_t, int);
extern void kmem_free(void *, size_t);
/*
* Zone interfaces
*/
#define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN
#define KM_ZONE_RECLAIM 0
#define KM_ZONE_SPREAD 0
#define kmem_zone kmem_cache_s
#define kmem_zone_t kmem_cache_t
static inline kmem_zone_t *
kmem_zone_init(int size, char *zone_name)
{
return kmem_cache_create(zone_name, size, 0, 0, NULL, NULL);
}
static inline kmem_zone_t *
kmem_zone_init_flags(int size, char *zone_name, unsigned long flags,
void (*construct)(void *, kmem_zone_t *, unsigned long))
{
return kmem_cache_create(zone_name, size, 0, flags, construct, NULL);
}
static inline void
kmem_zone_free(kmem_zone_t *zone, void *ptr)
{
kmem_cache_free(zone, ptr);
}
static inline void
kmem_zone_destroy(kmem_zone_t *zone)
{
if (zone && kmem_cache_destroy(zone))
BUG();
}
extern void *kmem_zone_alloc(kmem_zone_t *, int);
extern void *kmem_zone_zalloc(kmem_zone_t *, int);
/*
* Low memory cache shrinkers
*/
typedef struct cache_definition *kmem_shaker_t;
typedef int (*kmem_shake_func_t)(int, unsigned int);
extern kmem_shaker_t kmem_shake_register(kmem_shake_func_t);
extern void kmem_shake_deregister(kmem_shaker_t);
static inline int
kmem_shake_allow(unsigned int gfp_mask)
{
return (gfp_mask & __GFP_WAIT);
}
#endif /* __XFS_SUPPORT_KMEM_H__ */