Subject: Re: virtmen on 4.4 solved
From: Ghislain Adnet <gadnet@aqueos.com>
Date: Sat, 20 Jan 2018 10:48:49 +0100


> 
> Dividing inside the kernel (especially by a variable) is a
> recipe for disaster - don't do that ... ever! :)

You dont want me to wear that tshirt i see !

So we can account only for PAGE_SIZE or 1:


----------------------------------------------------------------
--- ../linux-4.4.111/kernel/vserver/limit.c     2018-01-14 10:20:44.395367243 +0100
+++ ./kernel/vserver/limit.c    2018-01-20 10:45:34.396558271 +0100
@@ -270,9 +270,15 @@
        res_limit = mem_cgroup_mem_limit_pages(mcg);
        res_usage = mem_cgroup_mem_usage_pages(mcg);

-       if (res_limit != PAGE_COUNTER_MAX)
-               val->totalram = res_limit;
-       val->freeram = val->totalram - res_usage;
+       if (res_limit != PAGE_COUNTER_MAX) {
+               if ( val->mem_unit == 1 ) {
+                       val->totalram = res_limit >> PAGE_SHIFT;
+                       val->freeram = val->totalram - ( res_usage >> PAGE_SHIFT );
+               } else {
+                       val->totalram = res_limit;
+                       val->freeram = val->totalram - res_usage;
+               }
+       }
        val->bufferram = 0;
        val->totalhigh = 0;
        val->freehigh = 0;
@@ -303,17 +309,21 @@
                goto out;

        swap_limit = memsw_limit - res_limit;
-       /* we have a swap limit? */
-       if (memsw_limit != PAGE_COUNTER_MAX)
-               val->totalswap = swap_limit;
+        /* calculate swap part */
+        swap_usage = (memsw_usage > res_usage) ? memsw_usage - res_usage : 0;

-       /* calculate swap part */
-       swap_usage = (memsw_usage > res_usage) ?
-               memsw_usage - res_usage : 0;
-
-       /* total shown minus usage gives free swap */
-       val->freeswap = (swap_usage < swap_limit) ?
-               val->totalswap - swap_usage : 0;
+       /* we have a swap limit? */
+       if (memsw_limit != PAGE_COUNTER_MAX){
+               /* sysinfo unit is bytes OR PAGE_SIZE ? */
+               if ( val->mem_unit == 1 ) {
+                       val->totalswap = swap_limit >> PAGE_SHIFT;
+                       val->freeswap = (swap_usage < swap_limit) ? ( swap_limit - swap_usage
) >> PAGE_SHIFT : 0;
+               } else {
+                       val->totalswap = swap_limit;
+                       val->freeswap = (swap_usage < swap_limit) ? swap_limit - swap_usage
: 0;
+
+               }
+       }
 out:
 #else  /* !CONFIG_MEMCG_SWAP */
        val->totalswap = 0;
----------------------------------------------------------------


sounds cool ?

Ghislain.