@@ -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)
7878struct 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
8485struct 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
263271static 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 ;
0 commit comments