return 0;
 }
 
+static unsigned long damos_sysfs_get_quota_score(void *arg)
+{
+       return (unsigned long)arg;
+}
+
+static void damos_sysfs_set_quota_score(
+               struct damos_sysfs_quota_goals *sysfs_goals,
+               struct damos_quota *quota)
+{
+       struct damos_sysfs_quota_goal *sysfs_goal;
+       int i;
+
+       quota->get_score = NULL;
+       quota->get_score_arg = (void *)0;
+       for (i = 0; i < sysfs_goals->nr; i++) {
+               sysfs_goal = sysfs_goals->goals_arr[i];
+               if (!sysfs_goal->target_value)
+                       continue;
+
+               /* Higher score makes scheme less aggressive */
+               quota->get_score_arg = (void *)max(
+                               (unsigned long)quota->get_score_arg,
+                               sysfs_goal->current_value * 10000 /
+                               sysfs_goal->target_value);
+               quota->get_score = damos_sysfs_get_quota_score;
+       }
+}
+
 static struct damos *damon_sysfs_mk_scheme(
                struct damon_sysfs_scheme *sysfs_scheme)
 {
                .low = sysfs_wmarks->low,
        };
 
+       damos_sysfs_set_quota_score(sysfs_quotas->goals, "a);
+
        scheme = damon_new_scheme(&pattern, sysfs_scheme->action,
                        sysfs_scheme->apply_interval_us, "a, &wmarks);
        if (!scheme)
        scheme->quota.weight_nr_accesses = sysfs_weights->nr_accesses;
        scheme->quota.weight_age = sysfs_weights->age;
 
+       damos_sysfs_set_quota_score(sysfs_quotas->goals, &scheme->quota);
+
        scheme->wmarks.metric = sysfs_wmarks->metric;
        scheme->wmarks.interval = sysfs_wmarks->interval_us;
        scheme->wmarks.high = sysfs_wmarks->high;