2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 - 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* 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
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_SUPPORT_KMEM_H__
# define __XFS_SUPPORT_KMEM_H__
# include <linux/slab.h>
# include <linux/sched.h>
# include <linux/mm.h>
2010-01-21 00:55:30 +03:00
# include <linux/vmalloc.h>
2005-04-17 02:20:36 +04:00
2006-03-14 05:18:19 +03:00
/*
* 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 )
2005-04-17 02:20:36 +04:00
{
2006-03-14 05:18:19 +03:00
gfp_t lflags ;
2005-04-17 02:20:36 +04:00
2010-01-21 00:55:30 +03:00
BUG_ON ( flags & ~ ( KM_SLEEP | KM_NOSLEEP | KM_NOFS | KM_MAYFAIL ) ) ;
2005-04-17 02:20:36 +04:00
if ( flags & KM_NOSLEEP ) {
2006-03-14 05:18:19 +03:00
lflags = GFP_ATOMIC | __GFP_NOWARN ;
2005-04-17 02:20:36 +04:00
} else {
2006-03-14 05:18:19 +03:00
lflags = GFP_KERNEL | __GFP_NOWARN ;
2006-06-09 08:59:13 +04:00
if ( ( current - > flags & PF_FSTRANS ) | | ( flags & KM_NOFS ) )
2005-04-17 02:20:36 +04:00
lflags & = ~ __GFP_FS ;
}
2006-03-14 05:18:19 +03:00
return lflags ;
2005-04-17 02:20:36 +04:00
}
2006-03-14 05:18:19 +03:00
extern void * kmem_alloc ( size_t , unsigned int __nocast ) ;
extern void * kmem_zalloc ( size_t , unsigned int __nocast ) ;
2008-05-21 12:38:40 +04:00
extern void * kmem_realloc ( const void * , size_t , size_t , unsigned int __nocast ) ;
extern void kmem_free ( const void * ) ;
2006-03-14 05:18:19 +03:00
2010-01-21 00:55:30 +03:00
static inline void * kmem_zalloc_large ( size_t size )
{
2011-05-28 21:36:33 +04:00
return vzalloc ( size ) ;
2010-01-21 00:55:30 +03:00
}
static inline void kmem_free_large ( void * ptr )
{
vfree ( ptr ) ;
}
extern void * kmem_zalloc_greedy ( size_t * , size_t , size_t ) ;
2006-03-14 05:18:19 +03:00
/*
* Zone interfaces
*/
# define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN
# define KM_ZONE_RECLAIM SLAB_RECLAIM_ACCOUNT
2006-03-24 14:16:09 +03:00
# define KM_ZONE_SPREAD SLAB_MEM_SPREAD
2006-03-14 05:18:19 +03:00
# define kmem_zone kmem_cache
# define kmem_zone_t struct kmem_cache
static inline kmem_zone_t *
2005-04-17 02:20:36 +04:00
kmem_zone_init ( int size , char * zone_name )
{
2007-07-20 05:11:58 +04:00
return kmem_cache_create ( zone_name , size , 0 , 0 , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2006-03-14 05:18:19 +03:00
static inline kmem_zone_t *
kmem_zone_init_flags ( int size , char * zone_name , unsigned long flags ,
2008-07-26 06:45:34 +04:00
void ( * construct ) ( void * ) )
2006-03-14 05:18:19 +03:00
{
2007-07-20 05:11:58 +04:00
return kmem_cache_create ( zone_name , size , 0 , flags , construct ) ;
2006-03-14 05:18:19 +03:00
}
static inline void
2005-04-17 02:20:36 +04:00
kmem_zone_free ( kmem_zone_t * zone , void * ptr )
{
kmem_cache_free ( zone , ptr ) ;
}
2006-03-14 05:18:19 +03:00
static inline void
2005-04-17 02:20:36 +04:00
kmem_zone_destroy ( kmem_zone_t * zone )
{
2006-09-27 12:49:40 +04:00
if ( zone )
kmem_cache_destroy ( zone ) ;
2005-04-17 02:20:36 +04:00
}
2005-11-03 08:14:31 +03:00
extern void * kmem_zone_alloc ( kmem_zone_t * , unsigned int __nocast ) ;
2006-03-14 05:18:19 +03:00
extern void * kmem_zone_zalloc ( kmem_zone_t * , unsigned int __nocast ) ;
2005-04-17 02:20:36 +04:00
# endif /* __XFS_SUPPORT_KMEM_H__ */