10
10
11
11
#include <linux/slab.h>
12
12
13
- #define DARRAY ( type ) \
13
+ #define DARRAY_PREALLOCATED ( _type , _nr ) \
14
14
struct { \
15
15
size_t nr, size; \
16
- type *data; \
16
+ _type *data; \
17
+ _type preallocated[_nr]; \
17
18
}
18
19
19
- typedef DARRAY (void ) darray_void ;
20
+ #define DARRAY (_type ) DARRAY_PREALLOCATED(_type, 0)
20
21
21
- int __bch2_darray_resize ( darray_void * , size_t , size_t , gfp_t ) ;
22
+ typedef DARRAY ( char ) darray_char ;
22
23
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 ,
24
27
size_t new_size , gfp_t gfp )
25
28
{
26
29
return unlikely (new_size > d -> size )
@@ -29,18 +32,18 @@ static inline int __darray_resize(darray_void *d, size_t element_size,
29
32
}
30
33
31
34
#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) )
33
36
34
37
#define darray_resize (_d , _new_size ) \
35
38
darray_resize_gfp(_d, _new_size, GFP_KERNEL)
36
39
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 )
38
41
{
39
42
return __darray_resize (d , t_size , d -> nr + more , gfp );
40
43
}
41
44
42
45
#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)
44
47
45
48
#define darray_make_room (_d , _more ) \
46
49
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,
86
89
87
90
#define darray_init (_d ) \
88
91
do { \
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; \
91
95
} while (0)
92
96
93
97
#define darray_exit (_d ) \
94
98
do { \
95
- kvfree((_d)->data); \
99
+ if (!ARRAY_SIZE((_d)->preallocated) || \
100
+ (_d)->data != (_d)->preallocated) \
101
+ kvfree((_d)->data); \
96
102
darray_init(_d); \
97
103
} while (0)
98
104
0 commit comments