for (lvl = 0; lvl <= iocg->level - 1; lvl++) {
                struct ioc_gq *parent = iocg->ancestors[lvl];
                struct ioc_gq *child = iocg->ancestors[lvl + 1];
-               u32 active_sum = READ_ONCE(parent->child_active_sum);
-               u32 inuse_sum = READ_ONCE(parent->child_inuse_sum);
+               u64 active_sum = READ_ONCE(parent->child_active_sum);
+               u64 inuse_sum = READ_ONCE(parent->child_inuse_sum);
                u32 active = READ_ONCE(child->active);
                u32 inuse = READ_ONCE(child->inuse);
 
                if (!active_sum || !inuse_sum)
                        continue;
 
-               active_sum = max(active, active_sum);
-               hwa = hwa * active / active_sum;        /* max 16bits * 10000 */
+               active_sum = max_t(u64, active, active_sum);
+               hwa = div64_u64((u64)hwa * active, active_sum);
 
-               inuse_sum = max(inuse, inuse_sum);
-               hwi = hwi * inuse / inuse_sum;          /* max 16bits * 10000 */
+               inuse_sum = max_t(u64, inuse, inuse_sum);
+               hwi = div64_u64((u64)hwi * inuse, inuse_sum);
        }
 
        iocg->hweight_active = max_t(u32, hwa, 1);
        weight = iocg->cfg_weight ?: iocc->dfl_weight;
        if (weight != iocg->weight && iocg->active)
                propagate_weights(iocg, weight,
-                       DIV64_U64_ROUND_UP(iocg->inuse * weight, iocg->weight));
+                                 DIV64_U64_ROUND_UP((u64)iocg->inuse * weight,
+                                                    iocg->weight));
        iocg->weight = weight;
 }
 
        if (!iocc)
                return NULL;
 
-       iocc->dfl_weight = CGROUP_WEIGHT_DFL;
+       iocc->dfl_weight = CGROUP_WEIGHT_DFL * WEIGHT_ONE;
        return &iocc->cpd;
 }
 
        struct ioc_gq *iocg = pd_to_iocg(pd);
 
        if (dname && iocg->cfg_weight)
-               seq_printf(sf, "%s %u\n", dname, iocg->cfg_weight);
+               seq_printf(sf, "%s %u\n", dname, iocg->cfg_weight / WEIGHT_ONE);
        return 0;
 }
 
        struct blkcg *blkcg = css_to_blkcg(seq_css(sf));
        struct ioc_cgrp *iocc = blkcg_to_iocc(blkcg);
 
-       seq_printf(sf, "default %u\n", iocc->dfl_weight);
+       seq_printf(sf, "default %u\n", iocc->dfl_weight / WEIGHT_ONE);
        blkcg_print_blkgs(sf, blkcg, ioc_weight_prfill,
                          &blkcg_policy_iocost, seq_cft(sf)->private, false);
        return 0;
                        return -EINVAL;
 
                spin_lock(&blkcg->lock);
-               iocc->dfl_weight = v;
+               iocc->dfl_weight = v * WEIGHT_ONE;
                hlist_for_each_entry(blkg, &blkcg->blkg_list, blkcg_node) {
                        struct ioc_gq *iocg = blkg_to_iocg(blkg);
 
        }
 
        spin_lock(&iocg->ioc->lock);
-       iocg->cfg_weight = v;
+       iocg->cfg_weight = v * WEIGHT_ONE;
        weight_updated(iocg);
        spin_unlock(&iocg->ioc->lock);