Skip to content

Commit 099dc5c

Browse files
author
Kent Overstreet
committed
bcachefs: DARRAY_PREALLOCATED()
Add support to darray for preallocating some number of elements. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent a58a6a5 commit 099dc5c

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

fs/bcachefs/darray.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <linux/slab.h>
55
#include "darray.h"
66

7-
int __bch2_darray_resize(darray_void *d, size_t element_size, size_t new_size, gfp_t gfp)
7+
int __bch2_darray_resize(darray_char *d, size_t element_size, size_t new_size, gfp_t gfp)
88
{
99
if (new_size > d->size) {
1010
new_size = roundup_pow_of_two(new_size);
@@ -14,7 +14,8 @@ int __bch2_darray_resize(darray_void *d, size_t element_size, size_t new_size, g
1414
return -ENOMEM;
1515

1616
memcpy(data, d->data, d->size * element_size);
17-
kvfree(d->data);
17+
if (d->data != d->preallocated)
18+
kvfree(d->data);
1819
d->data = data;
1920
d->size = new_size;
2021
}

fs/bcachefs/darray.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,20 @@
1010

1111
#include <linux/slab.h>
1212

13-
#define DARRAY(type) \
13+
#define DARRAY_PREALLOCATED(_type, _nr) \
1414
struct { \
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) \
8891
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; \
9195
} while (0)
9296

9397
#define darray_exit(_d) \
9498
do { \
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

Comments
 (0)