diff -u linux-2.6.15-vs2.1.0.10.1/kernel/vserver/limit.c linux-2.6.15-vs2.1.0.10.1/kernel/vserver/limit.c --- linux-2.6.15-vs2.1.0.10.1/kernel/vserver/limit.c 2006-02-11 10:41:16 +0100 +++ linux-2.6.15-vs2.1.0.10.1/kernel/vserver/limit.c 2006-02-11 10:41:16 +0100 @@ -162,18 +162,19 @@ void vx_vsi_meminfo(struct sysinfo *val) { struct vx_info *vxi = current->vx_info; + unsigned long totalram, freeram; rlim_t v; + /* we blindly accept the max */ v = __rlim_soft(&vxi->limit, RLIMIT_RSS); - if (v == RLIM_INFINITY) - return; - - val->totalram = min((unsigned long)v, - (unsigned long)val->totalram); + totalram = (v != RLIM_INFINITY) ? v : val->totalram; + /* total minus used equals free */ v = __rlim_get(&vxi->limit, RLIMIT_RSS); - val->freeram = (v < val->totalram) ? val->totalram - v : 0; + freeram = (v < totalram) ? totalram - v : 0; + val->totalram = totalram; + val->freeram = freeram; val->bufferram = 0; val->totalhigh = 0; val->freehigh = 0; @@ -183,21 +184,28 @@ void vx_vsi_swapinfo(struct sysinfo *val) { struct vx_info *vxi = current->vx_info; + unsigned long totalswap, freeswap; rlim_t v, w; v = __rlim_soft(&vxi->limit, RLIMIT_RSS); - if (v == RLIM_INFINITY) + if (v == RLIM_INFINITY) { + val->freeswap = val->totalswap; return; + } + /* we blindly accept the max */ w = __rlim_hard(&vxi->limit, RLIMIT_RSS); - if (w == RLIM_INFINITY) - return; + totalswap = (w != RLIM_INFINITY) ? (w - v) : val->totalswap; + + /* currently 'used' swap */ + w = __rlim_get(&vxi->limit, RLIMIT_RSS); + w -= (w > v) ? v : w; - val->totalswap = min((unsigned long)(w - v), - (unsigned long)val->totalswap); + /* total minus used equals free */ + freeswap = (w < totalswap) ? totalswap - w : 0; - w = __rlim_get(&vxi->limit, RLIMIT_RSS) - v; - val->freeswap = (w < val->totalswap) ? val->totalswap - w : 0; + val->totalswap = totalswap; + val->freeswap = freeswap; return; } --- linux-2.6.15-vs2.1.0.10/mm/page_alloc.c 2006-01-04 22:00:00 +0100 +++ linux-2.6.15-vs2.1.0.10.1/mm/page_alloc.c 2006-02-11 09:22:43 +0100 @@ -1315,6 +1315,8 @@ void si_meminfo_node(struct sysinfo *val val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages; val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages; val->mem_unit = PAGE_SIZE; + if (vx_flags(VXF_VIRT_MEM, 0)) + vx_vsi_meminfo(val); } #endif