@@ -120,6 +120,43 @@ static int settings_zms_unlink_ll_node(struct settings_zms *cf, uint32_t name_ha
120120 return rc ;
121121}
122122
123+ #if CONFIG_SETTINGS_ZMS_NAME_CACHE
124+ static void settings_zms_cache_add (struct settings_zms * cf , uint32_t name_hash , uint8_t flags )
125+ {
126+ cf -> cache [cf -> cache_next ].name_hash = name_hash ;
127+ cf -> cache [cf -> cache_next ++ ].flags = flags ;
128+
129+ cf -> cache_next %= CONFIG_SETTINGS_ZMS_NAME_CACHE_SIZE ;
130+ }
131+
132+ static uint8_t settings_zms_cache_match (struct settings_zms * cf , uint32_t name_hash )
133+ {
134+ int cache_index ;
135+
136+ if (!cf -> cache_next ) {
137+ cache_index = CONFIG_SETTINGS_ZMS_NAME_CACHE_SIZE - 1 ;
138+ } else {
139+ cache_index = cf -> cache_next - 1 ;
140+ }
141+
142+ for (int i = 0 ; i < CONFIG_SETTINGS_ZMS_NAME_CACHE_SIZE ; i ++ ) {
143+ /* we check cache from recent values to old values */
144+ if (cf -> cache [cache_index ].name_hash != name_hash ) {
145+ cache_index -- ;
146+ if (cache_index < 0 ) {
147+ cache_index = CONFIG_SETTINGS_ZMS_NAME_CACHE_SIZE - 1 ;
148+ }
149+ continue ;
150+ }
151+
152+ /* set the BIT(0) to indicate that the name_hash exist in cache */
153+ return ZMS_CACHE_FLAG_SET_EXIST (cf -> cache [cache_index ].flags );
154+ }
155+
156+ return 0 ;
157+ }
158+ #endif /* CONFIG_SETTINGS_ZMS_NAME_CACHE */
159+
123160static int settings_zms_delete (struct settings_zms * cf , uint32_t name_hash )
124161{
125162 int rc = 0 ;
@@ -131,7 +168,6 @@ static int settings_zms_delete(struct settings_zms *cf, uint32_t name_hash)
131168 if (rc < 0 ) {
132169 return rc ;
133170 }
134-
135171 rc = settings_zms_unlink_ll_node (cf , name_hash );
136172 if (rc < 0 ) {
137173 return rc ;
@@ -143,6 +179,17 @@ static int settings_zms_delete(struct settings_zms *cf, uint32_t name_hash)
143179 return rc ;
144180 }
145181
182+ #ifdef CONFIG_SETTINGS_ZMS_NAME_CACHE
183+ /* Update the flag of the Settings entry in cache. */
184+ uint8_t cache_flags = 0 ;
185+
186+ if (ZMS_COLLISION_NUM (name_hash ) > 0 ) {
187+ cache_flags = ZMS_CACHE_FLAG_SET_COLLISION (cache_flags );
188+ }
189+ /* set the delete BIT(2) indicating that the entry is deleted. */
190+ cache_flags = ZMS_CACHE_FLAG_SET_DELETED (cache_flags );
191+ settings_zms_cache_add (cf , name_hash & ZMS_HASH_MASK , cache_flags );
192+ #endif
146193 return rc ;
147194}
148195
@@ -194,6 +241,16 @@ static int settings_zms_load(struct settings_store *cs, const struct settings_lo
194241 read_fn_arg .fs = & cf -> cf_zms ;
195242 read_fn_arg .id = ZMS_NAME_ID_FROM_LL_NODE (ll_hash_id ) + ZMS_DATA_ID_OFFSET ;
196243
244+ #if CONFIG_SETTINGS_ZMS_NAME_CACHE
245+ /* Add the linked list node to cache */
246+ uint8_t cache_flags = 0 ;
247+
248+ if (ZMS_COLLISION_NUM (ll_hash_id ) > 0 ) {
249+ cache_flags = ZMS_CACHE_FLAG_SET_COLLISION (cache_flags );
250+ }
251+ settings_zms_cache_add (cf , ll_hash_id & ZMS_HASH_MASK , cache_flags );
252+ #endif
253+
197254 ret = settings_call_set_handler (name , rc2 , settings_zms_read_fn , & read_fn_arg ,
198255 (void * )arg );
199256 if (ret ) {
@@ -222,7 +279,6 @@ static int settings_zms_save(struct settings_store *cs, const char *name, const
222279 uint32_t collision_num = 0 ;
223280 bool delete ;
224281 bool write_name ;
225- bool hash_collision ;
226282 int rc = 0 ;
227283 int first_available_hash_index = -1 ;
228284
@@ -237,9 +293,22 @@ static int settings_zms_save(struct settings_store *cs, const char *name, const
237293 /* MSB is always 1 */
238294 name_hash |= BIT (31 );
239295
240- /* Let's find out if there are hash collisions in the storage */
296+ #ifdef CONFIG_SETTINGS_ZMS_NAME_CACHE
297+ uint8_t cache_flags = 0 ;
298+
299+ cache_flags = settings_zms_cache_match (cf , name_hash & ZMS_HASH_MASK );
300+ if (ZMS_CACHE_EXIST (cache_flags ) && !ZMS_CACHE_HAS_COLLISION (cache_flags )) {
301+ if (ZMS_CACHE_IS_DELETED (cache_flags )) {
302+ write_name = true;
303+ } else {
304+ write_name = false;
305+ }
306+ goto no_hash_collision ;
307+ }
308+ #endif
309+
310+ /* Let's find out if there is no hash collisions in the storage */
241311 write_name = true;
242- hash_collision = true;
243312
244313 for (int i = 0 ; i <= cf -> hash_collision_num ; i ++ ) {
245314 rc = zms_read (& cf -> cf_zms , name_hash + i * LSB_GET (ZMS_COLLISIONS_MASK ), & rdname ,
@@ -296,7 +365,6 @@ static int settings_zms_save(struct settings_store *cs, const char *name, const
296365 /* hash doesn't exist, do not write anything here */
297366 return 0 ;
298367 }
299-
300368 rc = settings_zms_delete (cf , name_hash );
301369 return rc ;
302370 }
@@ -342,6 +410,14 @@ static int settings_zms_save(struct settings_store *cs, const char *name, const
342410 cf -> second_to_last_hash_id = cf -> last_hash_id ;
343411 cf -> last_hash_id = name_hash | 1 ;
344412 }
413+ #ifdef CONFIG_SETTINGS_ZMS_NAME_CACHE
414+ /* Add the flags of the written settings entry in cache */
415+ cache_flags = 0 ;
416+ if (ZMS_COLLISION_NUM (name_hash ) > 0 ) {
417+ cache_flags = ZMS_CACHE_FLAG_SET_COLLISION (cache_flags );
418+ }
419+ settings_zms_cache_add (cf , name_hash & ZMS_HASH_MASK , cache_flags );
420+ #endif /* CONFIG_SETTINGS_ZMS_NAME_CACHE */
345421
346422 return 0 ;
347423}
0 commit comments