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
*/
2012-04-02 14:24:04 +04:00
typedef unsigned __bitwise xfs_km_flags_t ;
# define KM_SLEEP ((__force xfs_km_flags_t)0x0001u)
# define KM_NOSLEEP ((__force xfs_km_flags_t)0x0002u)
# define KM_NOFS ((__force xfs_km_flags_t)0x0004u)
# define KM_MAYFAIL ((__force xfs_km_flags_t)0x0008u)
2013-11-04 14:21:05 +04:00
# define KM_ZERO ((__force xfs_km_flags_t)0x0010u)
2006-03-14 05:18:19 +03:00
/*
* 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
2012-04-02 14:24:04 +04:00
kmem_flags_convert ( xfs_km_flags_t 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
2013-11-04 14:21:05 +04:00
BUG_ON ( flags & ~ ( KM_SLEEP | KM_NOSLEEP | KM_NOFS | KM_MAYFAIL | KM_ZERO ) ) ;
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 ;
}
2013-11-04 14:21:05 +04:00
if ( flags & KM_ZERO )
lflags | = __GFP_ZERO ;
2006-03-14 05:18:19 +03:00
return lflags ;
2005-04-17 02:20:36 +04:00
}
2012-04-02 14:24:04 +04:00
extern void * kmem_alloc ( size_t , xfs_km_flags_t ) ;
2013-09-02 14:53:00 +04:00
extern void * kmem_zalloc_large ( size_t size , xfs_km_flags_t ) ;
2012-04-02 14:24:04 +04:00
extern void * kmem_realloc ( const void * , size_t , size_t , xfs_km_flags_t ) ;
2015-02-02 01:54:18 +03:00
static inline void kmem_free ( const void * ptr )
{
kvfree ( ptr ) ;
}
2006-03-14 05:18:19 +03:00
2010-01-21 00:55:30 +03:00
extern void * kmem_zalloc_greedy ( size_t * , size_t , size_t ) ;
2013-11-04 14:21:05 +04:00
static inline void *
kmem_zalloc ( size_t size , xfs_km_flags_t flags )
{
return kmem_alloc ( size , flags | KM_ZERO ) ;
}
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
2016-01-15 02:18:21 +03:00
# define KM_ZONE_ACCOUNT SLAB_ACCOUNT
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
}
2012-04-02 14:24:04 +04:00
extern void * kmem_zone_alloc ( kmem_zone_t * , xfs_km_flags_t ) ;
2013-11-04 14:21:05 +04:00
static inline void *
kmem_zone_zalloc ( kmem_zone_t * zone , xfs_km_flags_t flags )
{
return kmem_zone_alloc ( zone , flags | KM_ZERO ) ;
}
2005-04-17 02:20:36 +04:00
# endif /* __XFS_SUPPORT_KMEM_H__ */