xref: /OK3568_Linux_fs/kernel/net/ceph/crush/crush.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #ifdef __KERNEL__
3*4882a593Smuzhiyun # include <linux/slab.h>
4*4882a593Smuzhiyun # include <linux/crush/crush.h>
5*4882a593Smuzhiyun #else
6*4882a593Smuzhiyun # include "crush_compat.h"
7*4882a593Smuzhiyun # include "crush.h"
8*4882a593Smuzhiyun #endif
9*4882a593Smuzhiyun 
crush_bucket_alg_name(int alg)10*4882a593Smuzhiyun const char *crush_bucket_alg_name(int alg)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	switch (alg) {
13*4882a593Smuzhiyun 	case CRUSH_BUCKET_UNIFORM: return "uniform";
14*4882a593Smuzhiyun 	case CRUSH_BUCKET_LIST: return "list";
15*4882a593Smuzhiyun 	case CRUSH_BUCKET_TREE: return "tree";
16*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW: return "straw";
17*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW2: return "straw2";
18*4882a593Smuzhiyun 	default: return "unknown";
19*4882a593Smuzhiyun 	}
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /**
23*4882a593Smuzhiyun  * crush_get_bucket_item_weight - Get weight of an item in given bucket
24*4882a593Smuzhiyun  * @b: bucket pointer
25*4882a593Smuzhiyun  * @p: item index in bucket
26*4882a593Smuzhiyun  */
crush_get_bucket_item_weight(const struct crush_bucket * b,int p)27*4882a593Smuzhiyun int crush_get_bucket_item_weight(const struct crush_bucket *b, int p)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	if ((__u32)p >= b->size)
30*4882a593Smuzhiyun 		return 0;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	switch (b->alg) {
33*4882a593Smuzhiyun 	case CRUSH_BUCKET_UNIFORM:
34*4882a593Smuzhiyun 		return ((struct crush_bucket_uniform *)b)->item_weight;
35*4882a593Smuzhiyun 	case CRUSH_BUCKET_LIST:
36*4882a593Smuzhiyun 		return ((struct crush_bucket_list *)b)->item_weights[p];
37*4882a593Smuzhiyun 	case CRUSH_BUCKET_TREE:
38*4882a593Smuzhiyun 		return ((struct crush_bucket_tree *)b)->node_weights[crush_calc_tree_node(p)];
39*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW:
40*4882a593Smuzhiyun 		return ((struct crush_bucket_straw *)b)->item_weights[p];
41*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW2:
42*4882a593Smuzhiyun 		return ((struct crush_bucket_straw2 *)b)->item_weights[p];
43*4882a593Smuzhiyun 	}
44*4882a593Smuzhiyun 	return 0;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
crush_destroy_bucket_uniform(struct crush_bucket_uniform * b)47*4882a593Smuzhiyun void crush_destroy_bucket_uniform(struct crush_bucket_uniform *b)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	kfree(b->h.items);
50*4882a593Smuzhiyun 	kfree(b);
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
crush_destroy_bucket_list(struct crush_bucket_list * b)53*4882a593Smuzhiyun void crush_destroy_bucket_list(struct crush_bucket_list *b)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	kfree(b->item_weights);
56*4882a593Smuzhiyun 	kfree(b->sum_weights);
57*4882a593Smuzhiyun 	kfree(b->h.items);
58*4882a593Smuzhiyun 	kfree(b);
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
crush_destroy_bucket_tree(struct crush_bucket_tree * b)61*4882a593Smuzhiyun void crush_destroy_bucket_tree(struct crush_bucket_tree *b)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	kfree(b->h.items);
64*4882a593Smuzhiyun 	kfree(b->node_weights);
65*4882a593Smuzhiyun 	kfree(b);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
crush_destroy_bucket_straw(struct crush_bucket_straw * b)68*4882a593Smuzhiyun void crush_destroy_bucket_straw(struct crush_bucket_straw *b)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	kfree(b->straws);
71*4882a593Smuzhiyun 	kfree(b->item_weights);
72*4882a593Smuzhiyun 	kfree(b->h.items);
73*4882a593Smuzhiyun 	kfree(b);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
crush_destroy_bucket_straw2(struct crush_bucket_straw2 * b)76*4882a593Smuzhiyun void crush_destroy_bucket_straw2(struct crush_bucket_straw2 *b)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	kfree(b->item_weights);
79*4882a593Smuzhiyun 	kfree(b->h.items);
80*4882a593Smuzhiyun 	kfree(b);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
crush_destroy_bucket(struct crush_bucket * b)83*4882a593Smuzhiyun void crush_destroy_bucket(struct crush_bucket *b)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	switch (b->alg) {
86*4882a593Smuzhiyun 	case CRUSH_BUCKET_UNIFORM:
87*4882a593Smuzhiyun 		crush_destroy_bucket_uniform((struct crush_bucket_uniform *)b);
88*4882a593Smuzhiyun 		break;
89*4882a593Smuzhiyun 	case CRUSH_BUCKET_LIST:
90*4882a593Smuzhiyun 		crush_destroy_bucket_list((struct crush_bucket_list *)b);
91*4882a593Smuzhiyun 		break;
92*4882a593Smuzhiyun 	case CRUSH_BUCKET_TREE:
93*4882a593Smuzhiyun 		crush_destroy_bucket_tree((struct crush_bucket_tree *)b);
94*4882a593Smuzhiyun 		break;
95*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW:
96*4882a593Smuzhiyun 		crush_destroy_bucket_straw((struct crush_bucket_straw *)b);
97*4882a593Smuzhiyun 		break;
98*4882a593Smuzhiyun 	case CRUSH_BUCKET_STRAW2:
99*4882a593Smuzhiyun 		crush_destroy_bucket_straw2((struct crush_bucket_straw2 *)b);
100*4882a593Smuzhiyun 		break;
101*4882a593Smuzhiyun 	}
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /**
105*4882a593Smuzhiyun  * crush_destroy - Destroy a crush_map
106*4882a593Smuzhiyun  * @map: crush_map pointer
107*4882a593Smuzhiyun  */
crush_destroy(struct crush_map * map)108*4882a593Smuzhiyun void crush_destroy(struct crush_map *map)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	/* buckets */
111*4882a593Smuzhiyun 	if (map->buckets) {
112*4882a593Smuzhiyun 		__s32 b;
113*4882a593Smuzhiyun 		for (b = 0; b < map->max_buckets; b++) {
114*4882a593Smuzhiyun 			if (map->buckets[b] == NULL)
115*4882a593Smuzhiyun 				continue;
116*4882a593Smuzhiyun 			crush_destroy_bucket(map->buckets[b]);
117*4882a593Smuzhiyun 		}
118*4882a593Smuzhiyun 		kfree(map->buckets);
119*4882a593Smuzhiyun 	}
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	/* rules */
122*4882a593Smuzhiyun 	if (map->rules) {
123*4882a593Smuzhiyun 		__u32 b;
124*4882a593Smuzhiyun 		for (b = 0; b < map->max_rules; b++)
125*4882a593Smuzhiyun 			crush_destroy_rule(map->rules[b]);
126*4882a593Smuzhiyun 		kfree(map->rules);
127*4882a593Smuzhiyun 	}
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #ifndef __KERNEL__
130*4882a593Smuzhiyun 	kfree(map->choose_tries);
131*4882a593Smuzhiyun #else
132*4882a593Smuzhiyun 	clear_crush_names(&map->type_names);
133*4882a593Smuzhiyun 	clear_crush_names(&map->names);
134*4882a593Smuzhiyun 	clear_choose_args(map);
135*4882a593Smuzhiyun #endif
136*4882a593Smuzhiyun 	kfree(map);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
crush_destroy_rule(struct crush_rule * rule)139*4882a593Smuzhiyun void crush_destroy_rule(struct crush_rule *rule)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	kfree(rule);
142*4882a593Smuzhiyun }
143