]> git.karo-electronics.de Git - linux-beck.git/commitdiff
crush: eliminate CRUSH_MAX_SET result size limitation
authorIlya Dryomov <ilya.dryomov@inktank.com>
Tue, 24 Dec 2013 19:19:24 +0000 (21:19 +0200)
committerIlya Dryomov <ilya.dryomov@inktank.com>
Tue, 31 Dec 2013 18:32:14 +0000 (20:32 +0200)
This is only present to size the temporary scratch arrays that we put on
the stack.  Let the caller allocate them as they wish and remove the
limitation.

Reflects ceph.git commit 1cfe140bf2dab99517589a82a916f4c75b9492d1.

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
include/linux/crush/crush.h
include/linux/crush/mapper.h
net/ceph/crush/mapper.c
net/ceph/osdmap.c

index 09561a04c12708109078f0d832b65f34c5ce9c0e..83543c504b5a215ed36e9439147e0b7fb08b0437 100644 (file)
@@ -21,7 +21,6 @@
 
 
 #define CRUSH_MAX_DEPTH 10  /* max crush hierarchy depth */
-#define CRUSH_MAX_SET   10  /* max size of a mapping result */
 
 
 /*
index 69310b03187518ddeca8fc1cd09b78471b60f61e..eab367446eea7fa683cb4fd15e74ad3822bb35c8 100644 (file)
@@ -14,6 +14,7 @@ extern int crush_find_rule(const struct crush_map *map, int ruleset, int type, i
 extern int crush_do_rule(const struct crush_map *map,
                         int ruleno,
                         int x, int *result, int result_max,
-                        const __u32 *weights, int weight_max);
+                        const __u32 *weights, int weight_max,
+                        int *scratch);
 
 #endif
index 82cab7d3e89d61ec94a570936be56dd31b38efb0..dcf48bc504ea46137d4e89b9a31cfd0bc82c331b 100644 (file)
@@ -478,15 +478,17 @@ reject:
  * @result_max: maximum result size
  * @weight: weight vector (for map leaves)
  * @weight_max: size of weight vector
+ * @scratch: scratch vector for private use; must be >= 3 * result_max
  */
 int crush_do_rule(const struct crush_map *map,
                  int ruleno, int x, int *result, int result_max,
-                 const __u32 *weight, int weight_max)
+                 const __u32 *weight, int weight_max,
+                 int *scratch)
 {
        int result_len;
-       int a[CRUSH_MAX_SET];
-       int b[CRUSH_MAX_SET];
-       int c[CRUSH_MAX_SET];
+       int *a = scratch;
+       int *b = scratch + result_max;
+       int *c = scratch + result_max*2;
        int recurse_to_leaf;
        int *w;
        int wsize = 0;
index 6477a68ddecb7a01701f3e956b81e21bb45dc21f..8b1a6b48bb5d962d9877c1d66498b21077efcd56 100644 (file)
@@ -1110,6 +1110,16 @@ int ceph_calc_ceph_pg(struct ceph_pg *pg, const char *oid,
 }
 EXPORT_SYMBOL(ceph_calc_ceph_pg);
 
+static int crush_do_rule_ary(const struct crush_map *map, int ruleno, int x,
+                            int *result, int result_max,
+                            const __u32 *weight, int weight_max)
+{
+       int scratch[result_max * 3];
+
+       return crush_do_rule(map, ruleno, x, result, result_max,
+                            weight, weight_max, scratch);
+}
+
 /*
  * Calculate raw osd vector for the given pgid.  Return pointer to osd
  * array, or NULL on failure.
@@ -1163,9 +1173,9 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
                                      pool->pgp_num_mask) +
                        (unsigned)pgid.pool;
        }
-       r = crush_do_rule(osdmap->crush, ruleno, pps, osds,
-                         min_t(int, pool->size, *num),
-                         osdmap->osd_weight, osdmap->max_osd);
+       r = crush_do_rule_ary(osdmap->crush, ruleno, pps,
+                             osds, min_t(int, pool->size, *num),
+                             osdmap->osd_weight, osdmap->max_osd);
        if (r < 0) {
                pr_err("error %d from crush rule: pool %lld ruleset %d type %d"
                       " size %d\n", r, pgid.pool, pool->crush_ruleset,