xref: /openbmc/linux/net/ceph/crush/crush.c (revision 86403a92)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
23d14c5d2SYehuda Sadeh #ifdef __KERNEL__
33d14c5d2SYehuda Sadeh # include <linux/slab.h>
43d14c5d2SYehuda Sadeh # include <linux/crush/crush.h>
5b459be73SIlya Dryomov #else
6b459be73SIlya Dryomov # include "crush_compat.h"
7b459be73SIlya Dryomov # include "crush.h"
8b459be73SIlya Dryomov #endif
93d14c5d2SYehuda Sadeh 
crush_bucket_alg_name(int alg)103d14c5d2SYehuda Sadeh const char *crush_bucket_alg_name(int alg)
113d14c5d2SYehuda Sadeh {
123d14c5d2SYehuda Sadeh 	switch (alg) {
133d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_UNIFORM: return "uniform";
143d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_LIST: return "list";
153d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_TREE: return "tree";
163d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_STRAW: return "straw";
17958a2765SIlya Dryomov 	case CRUSH_BUCKET_STRAW2: return "straw2";
183d14c5d2SYehuda Sadeh 	default: return "unknown";
193d14c5d2SYehuda Sadeh 	}
203d14c5d2SYehuda Sadeh }
213d14c5d2SYehuda Sadeh 
223d14c5d2SYehuda Sadeh /**
233d14c5d2SYehuda Sadeh  * crush_get_bucket_item_weight - Get weight of an item in given bucket
243d14c5d2SYehuda Sadeh  * @b: bucket pointer
253d14c5d2SYehuda Sadeh  * @p: item index in bucket
263d14c5d2SYehuda Sadeh  */
crush_get_bucket_item_weight(const struct crush_bucket * b,int p)278b12d47bSSage Weil int crush_get_bucket_item_weight(const struct crush_bucket *b, int p)
283d14c5d2SYehuda Sadeh {
298b12d47bSSage Weil 	if ((__u32)p >= b->size)
303d14c5d2SYehuda Sadeh 		return 0;
313d14c5d2SYehuda Sadeh 
323d14c5d2SYehuda Sadeh 	switch (b->alg) {
333d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_UNIFORM:
343d14c5d2SYehuda Sadeh 		return ((struct crush_bucket_uniform *)b)->item_weight;
353d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_LIST:
363d14c5d2SYehuda Sadeh 		return ((struct crush_bucket_list *)b)->item_weights[p];
373d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_TREE:
38f671d4cdSSage Weil 		return ((struct crush_bucket_tree *)b)->node_weights[crush_calc_tree_node(p)];
393d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_STRAW:
403d14c5d2SYehuda Sadeh 		return ((struct crush_bucket_straw *)b)->item_weights[p];
41958a2765SIlya Dryomov 	case CRUSH_BUCKET_STRAW2:
42958a2765SIlya Dryomov 		return ((struct crush_bucket_straw2 *)b)->item_weights[p];
433d14c5d2SYehuda Sadeh 	}
443d14c5d2SYehuda Sadeh 	return 0;
453d14c5d2SYehuda Sadeh }
463d14c5d2SYehuda Sadeh 
crush_destroy_bucket_uniform(struct crush_bucket_uniform * b)473d14c5d2SYehuda Sadeh void crush_destroy_bucket_uniform(struct crush_bucket_uniform *b)
483d14c5d2SYehuda Sadeh {
493d14c5d2SYehuda Sadeh 	kfree(b->h.items);
503d14c5d2SYehuda Sadeh 	kfree(b);
513d14c5d2SYehuda Sadeh }
523d14c5d2SYehuda Sadeh 
crush_destroy_bucket_list(struct crush_bucket_list * b)533d14c5d2SYehuda Sadeh void crush_destroy_bucket_list(struct crush_bucket_list *b)
543d14c5d2SYehuda Sadeh {
553d14c5d2SYehuda Sadeh 	kfree(b->item_weights);
563d14c5d2SYehuda Sadeh 	kfree(b->sum_weights);
573d14c5d2SYehuda Sadeh 	kfree(b->h.items);
583d14c5d2SYehuda Sadeh 	kfree(b);
593d14c5d2SYehuda Sadeh }
603d14c5d2SYehuda Sadeh 
crush_destroy_bucket_tree(struct crush_bucket_tree * b)613d14c5d2SYehuda Sadeh void crush_destroy_bucket_tree(struct crush_bucket_tree *b)
623d14c5d2SYehuda Sadeh {
636eb43f4bSSage Weil 	kfree(b->h.items);
643d14c5d2SYehuda Sadeh 	kfree(b->node_weights);
653d14c5d2SYehuda Sadeh 	kfree(b);
663d14c5d2SYehuda Sadeh }
673d14c5d2SYehuda Sadeh 
crush_destroy_bucket_straw(struct crush_bucket_straw * b)683d14c5d2SYehuda Sadeh void crush_destroy_bucket_straw(struct crush_bucket_straw *b)
693d14c5d2SYehuda Sadeh {
703d14c5d2SYehuda Sadeh 	kfree(b->straws);
713d14c5d2SYehuda Sadeh 	kfree(b->item_weights);
723d14c5d2SYehuda Sadeh 	kfree(b->h.items);
733d14c5d2SYehuda Sadeh 	kfree(b);
743d14c5d2SYehuda Sadeh }
753d14c5d2SYehuda Sadeh 
crush_destroy_bucket_straw2(struct crush_bucket_straw2 * b)76958a2765SIlya Dryomov void crush_destroy_bucket_straw2(struct crush_bucket_straw2 *b)
77958a2765SIlya Dryomov {
78958a2765SIlya Dryomov 	kfree(b->item_weights);
79958a2765SIlya Dryomov 	kfree(b->h.items);
80958a2765SIlya Dryomov 	kfree(b);
81958a2765SIlya Dryomov }
82958a2765SIlya Dryomov 
crush_destroy_bucket(struct crush_bucket * b)833d14c5d2SYehuda Sadeh void crush_destroy_bucket(struct crush_bucket *b)
843d14c5d2SYehuda Sadeh {
853d14c5d2SYehuda Sadeh 	switch (b->alg) {
863d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_UNIFORM:
873d14c5d2SYehuda Sadeh 		crush_destroy_bucket_uniform((struct crush_bucket_uniform *)b);
883d14c5d2SYehuda Sadeh 		break;
893d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_LIST:
903d14c5d2SYehuda Sadeh 		crush_destroy_bucket_list((struct crush_bucket_list *)b);
913d14c5d2SYehuda Sadeh 		break;
923d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_TREE:
933d14c5d2SYehuda Sadeh 		crush_destroy_bucket_tree((struct crush_bucket_tree *)b);
943d14c5d2SYehuda Sadeh 		break;
953d14c5d2SYehuda Sadeh 	case CRUSH_BUCKET_STRAW:
963d14c5d2SYehuda Sadeh 		crush_destroy_bucket_straw((struct crush_bucket_straw *)b);
973d14c5d2SYehuda Sadeh 		break;
98958a2765SIlya Dryomov 	case CRUSH_BUCKET_STRAW2:
99958a2765SIlya Dryomov 		crush_destroy_bucket_straw2((struct crush_bucket_straw2 *)b);
100958a2765SIlya Dryomov 		break;
1013d14c5d2SYehuda Sadeh 	}
1023d14c5d2SYehuda Sadeh }
1033d14c5d2SYehuda Sadeh 
1043d14c5d2SYehuda Sadeh /**
1053d14c5d2SYehuda Sadeh  * crush_destroy - Destroy a crush_map
1063d14c5d2SYehuda Sadeh  * @map: crush_map pointer
1073d14c5d2SYehuda Sadeh  */
crush_destroy(struct crush_map * map)1083d14c5d2SYehuda Sadeh void crush_destroy(struct crush_map *map)
1093d14c5d2SYehuda Sadeh {
1103d14c5d2SYehuda Sadeh 	/* buckets */
1113d14c5d2SYehuda Sadeh 	if (map->buckets) {
1128b12d47bSSage Weil 		__s32 b;
1133d14c5d2SYehuda Sadeh 		for (b = 0; b < map->max_buckets; b++) {
1143d14c5d2SYehuda Sadeh 			if (map->buckets[b] == NULL)
1153d14c5d2SYehuda Sadeh 				continue;
1163d14c5d2SYehuda Sadeh 			crush_destroy_bucket(map->buckets[b]);
1173d14c5d2SYehuda Sadeh 		}
1183d14c5d2SYehuda Sadeh 		kfree(map->buckets);
1193d14c5d2SYehuda Sadeh 	}
1203d14c5d2SYehuda Sadeh 
1213d14c5d2SYehuda Sadeh 	/* rules */
1223d14c5d2SYehuda Sadeh 	if (map->rules) {
1238b12d47bSSage Weil 		__u32 b;
1243d14c5d2SYehuda Sadeh 		for (b = 0; b < map->max_rules; b++)
125bfb16d7dSIlya Dryomov 			crush_destroy_rule(map->rules[b]);
1263d14c5d2SYehuda Sadeh 		kfree(map->rules);
1273d14c5d2SYehuda Sadeh 	}
1283d14c5d2SYehuda Sadeh 
129b459be73SIlya Dryomov #ifndef __KERNEL__
130b459be73SIlya Dryomov 	kfree(map->choose_tries);
1315cf9c4a9SIlya Dryomov #else
13286403a92SIlya Dryomov 	clear_crush_names(&map->type_names);
13386403a92SIlya Dryomov 	clear_crush_names(&map->names);
1345cf9c4a9SIlya Dryomov 	clear_choose_args(map);
135b459be73SIlya Dryomov #endif
1363d14c5d2SYehuda Sadeh 	kfree(map);
1373d14c5d2SYehuda Sadeh }
1383d14c5d2SYehuda Sadeh 
crush_destroy_rule(struct crush_rule * rule)139bfb16d7dSIlya Dryomov void crush_destroy_rule(struct crush_rule *rule)
140bfb16d7dSIlya Dryomov {
141bfb16d7dSIlya Dryomov 	kfree(rule);
142bfb16d7dSIlya Dryomov }
143