summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/linux/crush/crush.h2
-rw-r--r--net/ceph/crush/mapper.c31
2 files changed, 23 insertions, 10 deletions
diff --git a/include/linux/crush/crush.h b/include/linux/crush/crush.h
index 4023b1b52296..2e50bab91655 100644
--- a/include/linux/crush/crush.h
+++ b/include/linux/crush/crush.h
@@ -46,6 +46,8 @@ enum {
CRUSH_RULE_EMIT = 4, /* no args */
CRUSH_RULE_CHOOSE_LEAF_FIRSTN = 6,
CRUSH_RULE_CHOOSE_LEAF_INDEP = 7,
+
+ CRUSH_RULE_SET_CHOOSE_LEAF_TRIES = 9,
};
/*
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c
index c727836b5860..e3ade074541c 100644
--- a/net/ceph/crush/mapper.c
+++ b/net/ceph/crush/mapper.c
@@ -455,11 +455,13 @@ reject:
*
*/
static void crush_choose_indep(const struct crush_map *map,
- struct crush_bucket *bucket,
- const __u32 *weight, int weight_max,
+ struct crush_bucket *bucket,
+ const __u32 *weight, int weight_max,
int x, int left, int numrep, int type,
- int *out, int outpos,
- int recurse_to_leaf,
+ int *out, int outpos,
+ unsigned int attempts,
+ unsigned int recurse_attempts,
+ int recurse_to_leaf,
int *out2,
int parent_r)
{
@@ -483,7 +485,7 @@ static void crush_choose_indep(const struct crush_map *map,
out2[rep] = CRUSH_ITEM_UNDEF;
}
- for (ftotal = 0; left > 0 && ftotal < map->choose_total_tries; ftotal++) {
+ for (ftotal = 0; left > 0 && ftotal < attempts; ftotal++) {
for (rep = outpos; rep < endpos; rep++) {
if (out[rep] != CRUSH_ITEM_UNDEF)
continue;
@@ -564,11 +566,12 @@ static void crush_choose_indep(const struct crush_map *map,
if (recurse_to_leaf) {
if (item < 0) {
crush_choose_indep(map,
- map->buckets[-1-item],
- weight, weight_max,
- x, 1, numrep, 0,
- out2, rep,
- 0, NULL, r);
+ map->buckets[-1-item],
+ weight, weight_max,
+ x, 1, numrep, 0,
+ out2, rep,
+ recurse_attempts, 0,
+ 0, NULL, r);
if (out2[rep] == CRUSH_ITEM_NONE) {
/* placed nothing; no leaf */
break;
@@ -631,6 +634,7 @@ int crush_do_rule(const struct crush_map *map,
__u32 step;
int i, j;
int numrep;
+ int choose_leaf_tries = 1;
const int descend_once = 0;
if ((__u32)ruleno >= map->max_rules) {
@@ -653,6 +657,11 @@ int crush_do_rule(const struct crush_map *map,
wsize = 1;
break;
+ case CRUSH_RULE_SET_CHOOSE_LEAF_TRIES:
+ if (curstep->arg1 > 0)
+ choose_leaf_tries = curstep->arg1;
+ break;
+
case CRUSH_RULE_CHOOSE_LEAF_FIRSTN:
case CRUSH_RULE_CHOOSE_FIRSTN:
firstn = 1;
@@ -702,6 +711,8 @@ int crush_do_rule(const struct crush_map *map,
x, numrep, numrep,
curstep->arg2,
o+osize, j,
+ map->choose_total_tries,
+ choose_leaf_tries,
recurse_to_leaf,
c+osize,
0);