Skip to content

Commit e57194b

Browse files
committed
fix issue
Signed-off-by: wuchangye <wuchangye@huawei.com>
1 parent 9ff142d commit e57194b

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

bpf/deserialization_to_bpf_map/deserialization_to_bpf_map.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,12 @@ struct inner_map_stat {
7474
unsigned int resv : 30;
7575
};
7676

77-
#define MIM_BITMAP_SIZE (MAP_MAX_ENTRIES / 8)
77+
#define BITMAP_SIZE (MAP_MAX_ENTRIES / 8)
7878
struct map_mng {
7979
int inner_fds[MAP_TYPE_MAX];
8080
struct bpf_map_info inner_infos[MAP_TYPE_MAX];
81-
unsigned char mim_used_bitmap[MAP_TYPE_MAX][MIM_BITMAP_SIZE];
81+
unsigned char used_bitmap[MAP_TYPE_MAX][BITMAP_SIZE];
82+
unsigned int start_pos[MAP_TYPE_MAX];
8283
};
8384

8485
struct map_mng g_map_mng = {0};
@@ -238,38 +239,45 @@ static int free_outter_map_entry(struct op_context *ctx, unsigned int *outer_key
238239
if (type >= MAP_TYPE_MAX || inner_idx >= MAP_MAX_ENTRIES)
239240
return -1;
240241

241-
CLEAR_BIT(g_map_mng.mim_used_bitmap[type], inner_idx);
242+
CLEAR_BIT(g_map_mng.used_bitmap[type], inner_idx);
242243
*outer_key = 0;
243244
return 0;
244245
}
245246

246-
static int bitmap_find_first_clear(unsigned char *bitmap, int len)
247+
static unsigned int bitmap_find_first_clear(unsigned char *bitmap, unsigned int *start_pos, unsigned int bitmap_size)
247248
{
248-
int i, j;
249+
unsigned int i = *start_pos, j;
249250
unsigned char bmp;
250251

251-
for (i = 0; i < len; i++) {
252+
if (i && IS_SET(bitmap, i) == 0) {
253+
*start_pos = ((i + 1) % bitmap_size) ?: 1;
254+
return i;
255+
}
256+
257+
for (i = 0; i < (bitmap_size / 8); i++) {
252258
bmp = bitmap[i];
253259
for (j = 0; j < 8; j++) {
254260
if (i == 0 && j == 0)
255261
continue;
256-
if (!(bmp & (1U << j)))
262+
if (!(bmp & (1U << j))) {
263+
*start_pos = ((i * 8 + j + 1) % bitmap_size) ?: 1;
257264
return (i * 8 + j);
265+
}
258266
}
259267
}
260268
return -1;
261269
}
262270

263271
static unsigned int alloc_outer_key(struct op_context *ctx, int size)
264272
{
265-
int i, j;
273+
unsigned int i, j;
266274
if (size <= 0)
267275
return -1;
268276
for (i = 0; i < MAP_TYPE_MAX; i++) {
269277
if (size > g_map_mng.inner_infos[i].value_size)
270278
continue;
271279

272-
j = bitmap_find_first_clear(&g_map_mng.mim_used_bitmap[i][0], MIM_BITMAP_SIZE);
280+
j = bitmap_find_first_clear(&g_map_mng.used_bitmap[i][0], &g_map_mng.start_pos[i], MAP_MAX_ENTRIES);
273281
if (j > 0 && j < MAP_MAX_ENTRIES)
274282
break;
275283
}
@@ -279,7 +287,7 @@ static unsigned int alloc_outer_key(struct op_context *ctx, int size)
279287
return -1;
280288
}
281289

282-
SET_BIT(g_map_mng.mim_used_bitmap[i], j);
290+
SET_BIT(g_map_mng.used_bitmap[i], j);
283291
return MAP_GEN_OUTER_KEY(i, j);
284292
}
285293

@@ -1346,20 +1354,22 @@ void deserial_uninit()
13461354
return;
13471355
}
13481356

1349-
int map_restore(int map_fd, struct bpf_map_info *map_info, unsigned char *bitmap)
1357+
int map_restore(int map_fd, struct bpf_map_info *map_info, unsigned char *bitmap, unsigned int *start_pos)
13501358
{
13511359
void *prev_key;
1352-
unsigned int key;
1360+
unsigned int key = 0;
13531361

13541362
while (!bpf_map_get_next_key(map_fd, prev_key, &key)) {
1355-
if (MAP_GET_TYPE(key) >= MAP_TYPE_MAX || MAP_GET_INDEX(key) >= MAP_MAX_ENTRIES) {
1363+
if (MAP_GET_INDEX(key) >= MAP_MAX_ENTRIES) {
13561364
LOG_ERR("bpf_map_get_next_key key:%u invalid.", key);
13571365
return -1;
13581366
}
13591367

13601368
SET_BIT(bitmap, key);
13611369
prev_key = &key;
13621370
}
1371+
1372+
*start_pos = ((key + 1) % MAP_MAX_ENTRIES) ?: 1;
13631373
return 0;
13641374
}
13651375

@@ -1369,7 +1379,8 @@ int maps_restore()
13691379
int i, ret = 0;
13701380

13711381
for (i = 0; i < MAP_TYPE_MAX; i++) {
1372-
ret = map_restore(g_map_mng.inner_fds[i], &g_map_mng.inner_infos[i], g_map_mng.mim_used_bitmap[i]);
1382+
ret = map_restore(
1383+
g_map_mng.inner_fds[i], &g_map_mng.inner_infos[i], g_map_mng.used_bitmap[i], &g_map_mng.start_pos[i]);
13731384
if (ret) {
13741385
LOG_ERR("map_restore %d failed:%d", i, ret);
13751386
break;

bpf/include/bpf_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,15 @@ struct {
7070
__uint(max_entries, MAP_MAX_ENTRIES);
7171
__uint(map_flags, BPF_F_NO_PREALLOC);
7272
} kmesh_map192 SEC(".maps");
73+
7374
struct {
7475
__uint(type, BPF_MAP_TYPE_HASH);
7576
__uint(key_size, sizeof(__u32));
7677
__uint(value_size, MAP_VAL_SIZE_296);
7778
__uint(max_entries, MAP_MAX_ENTRIES);
7879
__uint(map_flags, BPF_F_NO_PREALLOC);
7980
} kmesh_map296 SEC(".maps");
81+
8082
struct {
8183
__uint(type, BPF_MAP_TYPE_HASH);
8284
__uint(key_size, sizeof(__u32));

0 commit comments

Comments
 (0)