diff options
Diffstat (limited to 'fs/xfs/linux-2.6/kmem.h')
| -rw-r--r-- | fs/xfs/linux-2.6/kmem.h | 91 | 
1 files changed, 55 insertions, 36 deletions
| diff --git a/fs/xfs/linux-2.6/kmem.h b/fs/xfs/linux-2.6/kmem.h index c64a29cdfff..f0268a84e6f 100644 --- a/fs/xfs/linux-2.6/kmem.h +++ b/fs/xfs/linux-2.6/kmem.h @@ -23,17 +23,8 @@  #include <linux/mm.h>  /* - * memory management routines + * Process flags handling   */ -#define KM_SLEEP	0x0001u -#define KM_NOSLEEP	0x0002u -#define KM_NOFS		0x0004u -#define KM_MAYFAIL	0x0008u - -#define	kmem_zone	kmem_cache -#define kmem_zone_t	struct kmem_cache - -typedef unsigned long xfs_pflags_t;  #define PFLAGS_TEST_NOIO()              (current->flags & PF_NOIO)  #define PFLAGS_TEST_FSTRANS()           (current->flags & PF_FSTRANS) @@ -67,74 +58,102 @@ typedef unsigned long xfs_pflags_t;  	*(NSTATEP) = *(OSTATEP);	\  } while (0) -static __inline gfp_t kmem_flags_convert(unsigned int __nocast flags) +/* + * General memory allocation interfaces + */ + +#define KM_SLEEP	0x0001u +#define KM_NOSLEEP	0x0002u +#define KM_NOFS		0x0004u +#define KM_MAYFAIL	0x0008u + +/* + * 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 gfp_t +kmem_flags_convert(unsigned int __nocast flags)  { -	gfp_t	lflags = __GFP_NOWARN;	/* we'll report problems, if need be */ +	gfp_t	lflags; -#ifdef DEBUG -	if (unlikely(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL))) { -		printk(KERN_WARNING -		    "XFS: memory allocation with wrong flags (%x)\n", flags); -		BUG(); -	} -#endif +	BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL));  	if (flags & KM_NOSLEEP) { -		lflags |= GFP_ATOMIC; +		lflags = GFP_ATOMIC | __GFP_NOWARN;  	} else { -		lflags |= GFP_KERNEL; - -		/* avoid recusive callbacks to filesystem during transactions */ +		lflags = GFP_KERNEL | __GFP_NOWARN;  		if (PFLAGS_TEST_FSTRANS() || (flags & KM_NOFS))  			lflags &= ~__GFP_FS;  	} - -        return lflags; +	return lflags;  } -static __inline kmem_zone_t * +extern void *kmem_alloc(size_t, unsigned int __nocast); +extern void *kmem_realloc(void *, size_t, size_t, unsigned int __nocast); +extern void *kmem_zalloc(size_t, unsigned int __nocast); +extern void  kmem_free(void *, size_t); + +/* + * Zone interfaces + */ + +#define KM_ZONE_HWALIGN	SLAB_HWCACHE_ALIGN +#define KM_ZONE_RECLAIM	SLAB_RECLAIM_ACCOUNT +#define KM_ZONE_SPREAD	0 + +#define kmem_zone	kmem_cache +#define kmem_zone_t	struct kmem_cache + +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 void +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 +static inline void  kmem_zone_destroy(kmem_zone_t *zone)  {  	if (zone && kmem_cache_destroy(zone))  		BUG();  } -extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast);  extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); +extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); -extern void *kmem_alloc(size_t, unsigned int __nocast); -extern void *kmem_realloc(void *, size_t, size_t, unsigned int __nocast); -extern void *kmem_zalloc(size_t, unsigned int __nocast); -extern void  kmem_free(void *, size_t); +/* + * Low memory cache shrinkers + */  typedef struct shrinker *kmem_shaker_t;  typedef int (*kmem_shake_func_t)(int, gfp_t); -static __inline kmem_shaker_t +static inline kmem_shaker_t  kmem_shake_register(kmem_shake_func_t sfunc)  {  	return set_shrinker(DEFAULT_SEEKS, sfunc);  } -static __inline void +static inline void  kmem_shake_deregister(kmem_shaker_t shrinker)  {  	remove_shrinker(shrinker);  } -static __inline int +static inline int  kmem_shake_allow(gfp_t gfp_mask)  {  	return (gfp_mask & __GFP_WAIT); | 
