The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at 
https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-123.1.2.vz7.4.9
------>
commit e6d640dd11fe7f1fc172f81d4a2e61d1d198eaf0
Author: Dmitry Monakhov <dmonak...@openvz.org>
Date:   Tue May 5 13:44:40 2015 +0400

    vziolimit: port diff-ubc-iolimit-precharge-dirty-pages-opensource
    
    https://jira.sw.ru/browse/PSBM-20104
    
    Signed-off-by: Dmitry Monakhov <dmonak...@openvz.org>
---
 kernel/ve/vziolimit.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/kernel/ve/vziolimit.c b/kernel/ve/vziolimit.c
index 7ff2854..19dd7ad 100644
--- a/kernel/ve/vziolimit.c
+++ b/kernel/ve/vziolimit.c
@@ -120,6 +120,35 @@ static unsigned long iolimit_timeout(struct iolimit 
*iolimit)
                        throttle_timeout(&iolimit->iops, now));
 }
 
+static void iolimit_balance_dirty(struct iolimit *iolimit,
+                                 struct user_beancounter *ub,
+                                 unsigned long write_chunk)
+{
+       struct throttle *th = &iolimit->throttle;
+       unsigned long flags, dirty, state;
+
+       if (!th->speed)
+               return;
+
+       /* can be non-atomic on i386, but ok. this just hint. */
+       state = th->state >> PAGE_SHIFT;
+       dirty = ub_stat_get(ub, dirty_pages) + write_chunk;
+       /* protect agains ub-stat percpu drift */
+       if (dirty + UB_STAT_BATCH * num_possible_cpus() < state)
+               return;
+       /* get exact value of for smooth throttling */
+       dirty = ub_stat_get_exact(ub, dirty_pages) + write_chunk;
+       if (dirty < state)
+               return;
+
+       spin_lock_irqsave(&ub->ub_lock, flags);
+       /* precharge dirty pages */
+       throttle_charge(th, (long long)dirty << PAGE_SHIFT);
+       /* set dirty_exceeded for smooth throttling */
+       ub->dirty_exceeded = 1;
+       spin_unlock_irqrestore(&ub->ub_lock, flags);
+}
+
 static int iolimit_virtinfo(struct vnotifier_block *nb,
                unsigned long cmd, void *arg, int old_ret)
 {
@@ -170,6 +199,9 @@ static int iolimit_virtinfo(struct vnotifier_block *nb,
                        if (timeout)
                                return NOTIFY_FAIL;
                        break;
+               case VIRTINFO_IO_BALANCE_DIRTY:
+                       iolimit_balance_dirty(iolimit, ub, (unsigned long)arg);
+                       break;
        }
 
        return NOTIFY_OK;
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to