xref: /openbmc/linux/include/linux/btree-128.h (revision b2441318)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
25db53f3eSJoern Engel extern struct btree_geo btree_geo128;
35db53f3eSJoern Engel 
45db53f3eSJoern Engel struct btree_head128 { struct btree_head h; };
55db53f3eSJoern Engel 
btree_init_mempool128(struct btree_head128 * head,mempool_t * mempool)65db53f3eSJoern Engel static inline void btree_init_mempool128(struct btree_head128 *head,
75db53f3eSJoern Engel 					 mempool_t *mempool)
85db53f3eSJoern Engel {
95db53f3eSJoern Engel 	btree_init_mempool(&head->h, mempool);
105db53f3eSJoern Engel }
115db53f3eSJoern Engel 
btree_init128(struct btree_head128 * head)125db53f3eSJoern Engel static inline int btree_init128(struct btree_head128 *head)
135db53f3eSJoern Engel {
145db53f3eSJoern Engel 	return btree_init(&head->h);
155db53f3eSJoern Engel }
165db53f3eSJoern Engel 
btree_destroy128(struct btree_head128 * head)175db53f3eSJoern Engel static inline void btree_destroy128(struct btree_head128 *head)
185db53f3eSJoern Engel {
195db53f3eSJoern Engel 	btree_destroy(&head->h);
205db53f3eSJoern Engel }
215db53f3eSJoern Engel 
btree_lookup128(struct btree_head128 * head,u64 k1,u64 k2)225db53f3eSJoern Engel static inline void *btree_lookup128(struct btree_head128 *head, u64 k1, u64 k2)
235db53f3eSJoern Engel {
245db53f3eSJoern Engel 	u64 key[2] = {k1, k2};
255db53f3eSJoern Engel 	return btree_lookup(&head->h, &btree_geo128, (unsigned long *)&key);
265db53f3eSJoern Engel }
275db53f3eSJoern Engel 
btree_get_prev128(struct btree_head128 * head,u64 * k1,u64 * k2)285db53f3eSJoern Engel static inline void *btree_get_prev128(struct btree_head128 *head,
295db53f3eSJoern Engel 				      u64 *k1, u64 *k2)
305db53f3eSJoern Engel {
315db53f3eSJoern Engel 	u64 key[2] = {*k1, *k2};
325db53f3eSJoern Engel 	void *val;
335db53f3eSJoern Engel 
345db53f3eSJoern Engel 	val = btree_get_prev(&head->h, &btree_geo128,
355db53f3eSJoern Engel 			     (unsigned long *)&key);
365db53f3eSJoern Engel 	*k1 = key[0];
375db53f3eSJoern Engel 	*k2 = key[1];
385db53f3eSJoern Engel 	return val;
395db53f3eSJoern Engel }
405db53f3eSJoern Engel 
btree_insert128(struct btree_head128 * head,u64 k1,u64 k2,void * val,gfp_t gfp)415db53f3eSJoern Engel static inline int btree_insert128(struct btree_head128 *head, u64 k1, u64 k2,
425db53f3eSJoern Engel 				  void *val, gfp_t gfp)
435db53f3eSJoern Engel {
445db53f3eSJoern Engel 	u64 key[2] = {k1, k2};
455db53f3eSJoern Engel 	return btree_insert(&head->h, &btree_geo128,
465db53f3eSJoern Engel 			    (unsigned long *)&key, val, gfp);
475db53f3eSJoern Engel }
485db53f3eSJoern Engel 
btree_update128(struct btree_head128 * head,u64 k1,u64 k2,void * val)495db53f3eSJoern Engel static inline int btree_update128(struct btree_head128 *head, u64 k1, u64 k2,
505db53f3eSJoern Engel 				  void *val)
515db53f3eSJoern Engel {
525db53f3eSJoern Engel 	u64 key[2] = {k1, k2};
535db53f3eSJoern Engel 	return btree_update(&head->h, &btree_geo128,
545db53f3eSJoern Engel 			    (unsigned long *)&key, val);
555db53f3eSJoern Engel }
565db53f3eSJoern Engel 
btree_remove128(struct btree_head128 * head,u64 k1,u64 k2)575db53f3eSJoern Engel static inline void *btree_remove128(struct btree_head128 *head, u64 k1, u64 k2)
585db53f3eSJoern Engel {
595db53f3eSJoern Engel 	u64 key[2] = {k1, k2};
605db53f3eSJoern Engel 	return btree_remove(&head->h, &btree_geo128, (unsigned long *)&key);
615db53f3eSJoern Engel }
625db53f3eSJoern Engel 
btree_last128(struct btree_head128 * head,u64 * k1,u64 * k2)635db53f3eSJoern Engel static inline void *btree_last128(struct btree_head128 *head, u64 *k1, u64 *k2)
645db53f3eSJoern Engel {
655db53f3eSJoern Engel 	u64 key[2];
665db53f3eSJoern Engel 	void *val;
675db53f3eSJoern Engel 
685db53f3eSJoern Engel 	val = btree_last(&head->h, &btree_geo128, (unsigned long *)&key[0]);
695db53f3eSJoern Engel 	if (val) {
705db53f3eSJoern Engel 		*k1 = key[0];
715db53f3eSJoern Engel 		*k2 = key[1];
725db53f3eSJoern Engel 	}
735db53f3eSJoern Engel 
745db53f3eSJoern Engel 	return val;
755db53f3eSJoern Engel }
765db53f3eSJoern Engel 
btree_merge128(struct btree_head128 * target,struct btree_head128 * victim,gfp_t gfp)775db53f3eSJoern Engel static inline int btree_merge128(struct btree_head128 *target,
785db53f3eSJoern Engel 				 struct btree_head128 *victim,
795db53f3eSJoern Engel 				 gfp_t gfp)
805db53f3eSJoern Engel {
815db53f3eSJoern Engel 	return btree_merge(&target->h, &victim->h, &btree_geo128, gfp);
825db53f3eSJoern Engel }
835db53f3eSJoern Engel 
845db53f3eSJoern Engel void visitor128(void *elem, unsigned long opaque, unsigned long *__key,
855db53f3eSJoern Engel 		size_t index, void *__func);
865db53f3eSJoern Engel 
875db53f3eSJoern Engel typedef void (*visitor128_t)(void *elem, unsigned long opaque,
885db53f3eSJoern Engel 			     u64 key1, u64 key2, size_t index);
895db53f3eSJoern Engel 
btree_visitor128(struct btree_head128 * head,unsigned long opaque,visitor128_t func2)905db53f3eSJoern Engel static inline size_t btree_visitor128(struct btree_head128 *head,
915db53f3eSJoern Engel 				      unsigned long opaque,
925db53f3eSJoern Engel 				      visitor128_t func2)
935db53f3eSJoern Engel {
945db53f3eSJoern Engel 	return btree_visitor(&head->h, &btree_geo128, opaque,
955db53f3eSJoern Engel 			     visitor128, func2);
965db53f3eSJoern Engel }
975db53f3eSJoern Engel 
btree_grim_visitor128(struct btree_head128 * head,unsigned long opaque,visitor128_t func2)985db53f3eSJoern Engel static inline size_t btree_grim_visitor128(struct btree_head128 *head,
995db53f3eSJoern Engel 					   unsigned long opaque,
1005db53f3eSJoern Engel 					   visitor128_t func2)
1015db53f3eSJoern Engel {
1025db53f3eSJoern Engel 	return btree_grim_visitor(&head->h, &btree_geo128, opaque,
1035db53f3eSJoern Engel 				  visitor128, func2);
1045db53f3eSJoern Engel }
1055db53f3eSJoern Engel 
1065db53f3eSJoern Engel #define btree_for_each_safe128(head, k1, k2, val)	\
1075db53f3eSJoern Engel 	for (val = btree_last128(head, &k1, &k2);	\
1085db53f3eSJoern Engel 	     val;					\
1095db53f3eSJoern Engel 	     val = btree_get_prev128(head, &k1, &k2))
1105db53f3eSJoern Engel 
111