/* private: For charging the quota */
        unsigned long charged_sz;
        unsigned long charged_from;
+       struct damon_target *charge_target_from;
+       unsigned long charge_addr_from;
 };
 
 /**
 #define damon_prev_region(r) \
        (container_of(r->list.prev, struct damon_region, list))
 
+#define damon_last_region(t) \
+       (list_last_entry(&t->regions_list, struct damon_region, list))
+
 #define damon_for_each_region(r, t) \
        list_for_each_entry(r, &t->regions_list, list)
 
 
        scheme->quota.reset_interval = quota->reset_interval;
        scheme->quota.charged_sz = 0;
        scheme->quota.charged_from = 0;
+       scheme->quota.charge_target_from = NULL;
+       scheme->quota.charge_addr_from = 0;
 
        return scheme;
 }
                if (quota->sz && quota->charged_sz >= quota->sz)
                        continue;
 
+               /* Skip previously charged regions */
+               if (quota->charge_target_from) {
+                       if (t != quota->charge_target_from)
+                               continue;
+                       if (r == damon_last_region(t)) {
+                               quota->charge_target_from = NULL;
+                               quota->charge_addr_from = 0;
+                               continue;
+                       }
+                       if (quota->charge_addr_from &&
+                                       r->ar.end <= quota->charge_addr_from)
+                               continue;
+
+                       if (quota->charge_addr_from && r->ar.start <
+                                       quota->charge_addr_from) {
+                               sz = ALIGN_DOWN(quota->charge_addr_from -
+                                               r->ar.start, DAMON_MIN_REGION);
+                               if (!sz) {
+                                       if (r->ar.end - r->ar.start <=
+                                                       DAMON_MIN_REGION)
+                                               continue;
+                                       sz = DAMON_MIN_REGION;
+                               }
+                               damon_split_region_at(c, t, r, sz);
+                               r = damon_next_region(r);
+                               sz = r->ar.end - r->ar.start;
+                       }
+                       quota->charge_target_from = NULL;
+                       quota->charge_addr_from = 0;
+               }
+
                /* Check the target regions condition */
                if (sz < s->min_sz_region || s->max_sz_region < sz)
                        continue;
                        }
                        c->primitive.apply_scheme(c, t, r, s);
                        quota->charged_sz += sz;
+                       if (quota->sz && quota->charged_sz >= quota->sz) {
+                               quota->charge_target_from = t;
+                               quota->charge_addr_from = r->ar.end + 1;
+                       }
                }
                if (s->action != DAMOS_STAT)
                        r->age = 0;