1010
1111#include <linux/slab.h>
1212
13- #define DARRAY ( type ) \
13+ #define DARRAY_PREALLOCATED ( _type , _nr ) \
1414struct { \
1515 size_t nr, size; \
16- type *data; \
16+ _type *data; \
17+ _type preallocated[_nr]; \
1718}
1819
19- typedef DARRAY (void ) darray_void ;
20+ #define DARRAY (_type ) DARRAY_PREALLOCATED(_type, 0)
2021
21- int __bch2_darray_resize ( darray_void * , size_t , size_t , gfp_t ) ;
22+ typedef DARRAY ( char ) darray_char ;
2223
23- static inline int __darray_resize (darray_void * d , size_t element_size ,
24+ int __bch2_darray_resize (darray_char * , size_t , size_t , gfp_t );
25+
26+ static inline int __darray_resize (darray_char * d , size_t element_size ,
2427 size_t new_size , gfp_t gfp )
2528{
2629 return unlikely (new_size > d -> size )
@@ -29,18 +32,18 @@ static inline int __darray_resize(darray_void *d, size_t element_size,
2932}
3033
3134#define darray_resize_gfp (_d , _new_size , _gfp ) \
32- __darray_resize((darray_void *) (_d), sizeof((_d)->data[0]), (_new_size), _gfp)
35+ unlikely( __darray_resize((darray_char *) (_d), sizeof((_d)->data[0]), (_new_size), _gfp) )
3336
3437#define darray_resize (_d , _new_size ) \
3538 darray_resize_gfp(_d, _new_size, GFP_KERNEL)
3639
37- static inline int __darray_make_room (darray_void * d , size_t t_size , size_t more , gfp_t gfp )
40+ static inline int __darray_make_room (darray_char * d , size_t t_size , size_t more , gfp_t gfp )
3841{
3942 return __darray_resize (d , t_size , d -> nr + more , gfp );
4043}
4144
4245#define darray_make_room_gfp (_d , _more , _gfp ) \
43- __darray_make_room((darray_void *) (_d), sizeof((_d)->data[0]), (_more), _gfp)
46+ __darray_make_room((darray_char *) (_d), sizeof((_d)->data[0]), (_more), _gfp)
4447
4548#define darray_make_room (_d , _more ) \
4649 darray_make_room_gfp(_d, _more, GFP_KERNEL)
@@ -86,13 +89,16 @@ static inline int __darray_make_room(darray_void *d, size_t t_size, size_t more,
8689
8790#define darray_init (_d ) \
8891do { \
89- (_d)->data = NULL; \
90- (_d)->nr = (_d)->size = 0; \
92+ (_d)->nr = 0; \
93+ (_d)->size = ARRAY_SIZE((_d)->preallocated); \
94+ (_d)->data = (_d)->size ? (_d)->preallocated : NULL; \
9195} while (0)
9296
9397#define darray_exit (_d ) \
9498do { \
95- kvfree((_d)->data); \
99+ if (!ARRAY_SIZE((_d)->preallocated) || \
100+ (_d)->data != (_d)->preallocated) \
101+ kvfree((_d)->data); \
96102 darray_init(_d); \
97103} while (0)
98104
0 commit comments