virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] calculate 'available' memory in the separate function
       [not found] <1455637852-7323-1-git-send-email-den@openvz.org>
@ 2016-02-16 15:50 ` Denis V. Lunev
  2016-02-16 15:50 ` [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics Denis V. Lunev
       [not found] ` <1455637852-7323-3-git-send-email-den@openvz.org>
  2 siblings, 0 replies; 6+ messages in thread
From: Denis V. Lunev @ 2016-02-16 15:50 UTC (permalink / raw)
  Cc: Igor Redko, Michael S. Tsirkin, linux-kernel, virtualization,
	Denis V. Lunev, Andrew Morton

From: Igor Redko <redkoi@virtuozzo.com>

Factor out calculation of the available memory counter into a separate
exportable function, in order to be able to use it in other parts of
the kernel.

In particular, it appears a relevant metric to report to the
hypervisor via virtio-balloon statistics interface (in a followup
patch).

Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Michael S. Tsirkin <mst@redhat.com>
CC: Andrew Morton <akpm@linux-foundation.org>
---
 fs/proc/meminfo.c  | 31 +------------------------------
 include/linux/mm.h |  1 +
 mm/page_alloc.c    | 43 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 30 deletions(-)

diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index df4661a..8372046 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -29,10 +29,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 	unsigned long committed;
 	long cached;
 	long available;
-	unsigned long pagecache;
-	unsigned long wmark_low = 0;
 	unsigned long pages[NR_LRU_LISTS];
-	struct zone *zone;
 	int lru;
 
 /*
@@ -51,33 +48,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 	for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
 		pages[lru] = global_page_state(NR_LRU_BASE + lru);
 
-	for_each_zone(zone)
-		wmark_low += zone->watermark[WMARK_LOW];
-
-	/*
-	 * Estimate the amount of memory available for userspace allocations,
-	 * without causing swapping.
-	 */
-	available = i.freeram - totalreserve_pages;
-
-	/*
-	 * Not all the page cache can be freed, otherwise the system will
-	 * start swapping. Assume at least half of the page cache, or the
-	 * low watermark worth of cache, needs to stay.
-	 */
-	pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
-	pagecache -= min(pagecache / 2, wmark_low);
-	available += pagecache;
-
-	/*
-	 * Part of the reclaimable slab consists of items that are in use,
-	 * and cannot be freed. Cap this estimate at the low watermark.
-	 */
-	available += global_page_state(NR_SLAB_RECLAIMABLE) -
-		     min(global_page_state(NR_SLAB_RECLAIMABLE) / 2, wmark_low);
-
-	if (available < 0)
-		available = 0;
+	available = si_mem_available();
 
 	/*
 	 * Tagged format, for easy grepping and expansion.
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 516e149..a8c4144 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1862,6 +1862,7 @@ extern int __meminit init_per_zone_wmark_min(void);
 extern void mem_init(void);
 extern void __init mmap_init(void);
 extern void show_mem(unsigned int flags);
+extern long si_mem_available(void);
 extern void si_meminfo(struct sysinfo * val);
 extern void si_meminfo_node(struct sysinfo *val, int nid);
 
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 838ca8bb..dae813c 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3603,6 +3603,49 @@ static inline void show_node(struct zone *zone)
 		printk("Node %d ", zone_to_nid(zone));
 }
 
+long si_mem_available(void)
+{
+	long available;
+	unsigned long pagecache;
+	unsigned long wmark_low = 0;
+	unsigned long pages[NR_LRU_LISTS];
+	struct zone *zone;
+	int lru;
+
+	for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
+		pages[lru] = global_page_state(NR_LRU_BASE + lru);
+
+	for_each_zone(zone)
+		wmark_low += zone->watermark[WMARK_LOW];
+
+	/*
+	 * Estimate the amount of memory available for userspace allocations,
+	 * without causing swapping.
+	 */
+	available = global_page_state(NR_FREE_PAGES) - totalreserve_pages;
+
+	/*
+	 * Not all the page cache can be freed, otherwise the system will
+	 * start swapping. Assume at least half of the page cache, or the
+	 * low watermark worth of cache, needs to stay.
+	 */
+	pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
+	pagecache -= min(pagecache / 2, wmark_low);
+	available += pagecache;
+
+	/*
+	 * Part of the reclaimable slab consists of items that are in use,
+	 * and cannot be freed. Cap this estimate at the low watermark.
+	 */
+	available += global_page_state(NR_SLAB_RECLAIMABLE) -
+		     min(global_page_state(NR_SLAB_RECLAIMABLE) / 2, wmark_low);
+
+	if (available < 0)
+		available = 0;
+	return available;
+}
+EXPORT_SYMBOL_GPL(si_mem_available);
+
 void si_meminfo(struct sysinfo *val)
 {
 	val->totalram = totalram_pages;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics
       [not found] <1455637852-7323-1-git-send-email-den@openvz.org>
  2016-02-16 15:50 ` [PATCH 1/2] calculate 'available' memory in the separate function Denis V. Lunev
@ 2016-02-16 15:50 ` Denis V. Lunev
       [not found] ` <1455637852-7323-3-git-send-email-den@openvz.org>
  2 siblings, 0 replies; 6+ messages in thread
From: Denis V. Lunev @ 2016-02-16 15:50 UTC (permalink / raw)
  Cc: Igor Redko, Michael S. Tsirkin, linux-kernel, virtualization,
	Denis V. Lunev, Andrew Morton

From: Igor Redko <redkoi@virtuozzo.com>

Add a new field, VIRTIO_BALLOON_S_AVAIL, to virtio_balloon memory
statistics protocol, corresponding to 'Available' in /proc/meminfo.

It indicates to the hypervisor how big the balloon can be inflated
without pushing the guest system to swap.

Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Michael S. Tsirkin <mst@redhat.com>
CC: Andrew Morton <akpm@linux-foundation.org>
---
 drivers/virtio/virtio_balloon.c     | 6 ++++++
 include/uapi/linux/virtio_balloon.h | 3 ++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 0c3691f..f2b77de 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -30,6 +30,7 @@
 #include <linux/balloon_compaction.h>
 #include <linux/oom.h>
 #include <linux/wait.h>
+#include <linux/mm.h>
 
 /*
  * Balloon device works in 4K page units.  So each page is pointed to by
@@ -229,10 +230,13 @@ static void update_balloon_stats(struct virtio_balloon *vb)
 	unsigned long events[NR_VM_EVENT_ITEMS];
 	struct sysinfo i;
 	int idx = 0;
+	long available;
 
 	all_vm_events(events);
 	si_meminfo(&i);
 
+	available = si_mem_available();
+
 	update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN,
 				pages_to_bytes(events[PSWPIN]));
 	update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_OUT,
@@ -243,6 +247,8 @@ static void update_balloon_stats(struct virtio_balloon *vb)
 				pages_to_bytes(i.freeram));
 	update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMTOT,
 				pages_to_bytes(i.totalram));
+	update_stat(vb, idx++, VIRTIO_BALLOON_S_AVAIL,
+				pages_to_bytes(available));
 }
 
 /*
diff --git a/include/uapi/linux/virtio_balloon.h b/include/uapi/linux/virtio_balloon.h
index d7f1cbc..343d7dd 100644
--- a/include/uapi/linux/virtio_balloon.h
+++ b/include/uapi/linux/virtio_balloon.h
@@ -51,7 +51,8 @@ struct virtio_balloon_config {
 #define VIRTIO_BALLOON_S_MINFLT   3   /* Number of minor faults */
 #define VIRTIO_BALLOON_S_MEMFREE  4   /* Total amount of free memory */
 #define VIRTIO_BALLOON_S_MEMTOT   5   /* Total amount of memory */
-#define VIRTIO_BALLOON_S_NR       6
+#define VIRTIO_BALLOON_S_AVAIL    6   /* Available memory as in /proc */
+#define VIRTIO_BALLOON_S_NR       7
 
 /*
  * Memory statistics structure.
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics
       [not found] ` <1455637852-7323-3-git-send-email-den@openvz.org>
@ 2016-02-23 15:10   ` Michael S. Tsirkin
       [not found]   ` <20160223170828-mutt-send-email-mst@redhat.com>
  1 sibling, 0 replies; 6+ messages in thread
From: Michael S. Tsirkin @ 2016-02-23 15:10 UTC (permalink / raw)
  To: Denis V. Lunev; +Cc: Igor Redko, Andrew Morton, linux-kernel, virtualization

On Tue, Feb 16, 2016 at 06:50:52PM +0300, Denis V. Lunev wrote:
> From: Igor Redko <redkoi@virtuozzo.com>
> 
> Add a new field, VIRTIO_BALLOON_S_AVAIL, to virtio_balloon memory
> statistics protocol, corresponding to 'Available' in /proc/meminfo.
> 
> It indicates to the hypervisor how big the balloon can be inflated
> without pushing the guest system to swap.
> 
> Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Michael S. Tsirkin <mst@redhat.com>
> CC: Andrew Morton <akpm@linux-foundation.org>

Oops - I missed the fact that this affects host/guest ABI.

Can you please submit ABI update proposal to virtio tc?
Spec patch would be even better.

This is important to ensure there are no conflicts
with other features being developed in parallel.

> ---
>  drivers/virtio/virtio_balloon.c     | 6 ++++++
>  include/uapi/linux/virtio_balloon.h | 3 ++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> index 0c3691f..f2b77de 100644
> --- a/drivers/virtio/virtio_balloon.c
> +++ b/drivers/virtio/virtio_balloon.c
> @@ -30,6 +30,7 @@
>  #include <linux/balloon_compaction.h>
>  #include <linux/oom.h>
>  #include <linux/wait.h>
> +#include <linux/mm.h>
>  
>  /*
>   * Balloon device works in 4K page units.  So each page is pointed to by
> @@ -229,10 +230,13 @@ static void update_balloon_stats(struct virtio_balloon *vb)
>  	unsigned long events[NR_VM_EVENT_ITEMS];
>  	struct sysinfo i;
>  	int idx = 0;
> +	long available;
>  
>  	all_vm_events(events);
>  	si_meminfo(&i);
>  
> +	available = si_mem_available();
> +
>  	update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN,
>  				pages_to_bytes(events[PSWPIN]));
>  	update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_OUT,
> @@ -243,6 +247,8 @@ static void update_balloon_stats(struct virtio_balloon *vb)
>  				pages_to_bytes(i.freeram));
>  	update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMTOT,
>  				pages_to_bytes(i.totalram));
> +	update_stat(vb, idx++, VIRTIO_BALLOON_S_AVAIL,
> +				pages_to_bytes(available));
>  }
>  
>  /*
> diff --git a/include/uapi/linux/virtio_balloon.h b/include/uapi/linux/virtio_balloon.h
> index d7f1cbc..343d7dd 100644
> --- a/include/uapi/linux/virtio_balloon.h
> +++ b/include/uapi/linux/virtio_balloon.h
> @@ -51,7 +51,8 @@ struct virtio_balloon_config {
>  #define VIRTIO_BALLOON_S_MINFLT   3   /* Number of minor faults */
>  #define VIRTIO_BALLOON_S_MEMFREE  4   /* Total amount of free memory */
>  #define VIRTIO_BALLOON_S_MEMTOT   5   /* Total amount of memory */
> -#define VIRTIO_BALLOON_S_NR       6
> +#define VIRTIO_BALLOON_S_AVAIL    6   /* Available memory as in /proc */
> +#define VIRTIO_BALLOON_S_NR       7
>  
>  /*
>   * Memory statistics structure.
> -- 
> 2.5.0

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics
       [not found]   ` <20160223170828-mutt-send-email-mst@redhat.com>
@ 2016-02-23 15:26     ` Denis V. Lunev
       [not found]     ` <56CC7A37.2030807@openvz.org>
  1 sibling, 0 replies; 6+ messages in thread
From: Denis V. Lunev @ 2016-02-23 15:26 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Igor Redko, Andrew Morton, linux-kernel, virtualization

On 02/23/2016 06:10 PM, Michael S. Tsirkin wrote:
> On Tue, Feb 16, 2016 at 06:50:52PM +0300, Denis V. Lunev wrote:
>> From: Igor Redko <redkoi@virtuozzo.com>
>>
>> Add a new field, VIRTIO_BALLOON_S_AVAIL, to virtio_balloon memory
>> statistics protocol, corresponding to 'Available' in /proc/meminfo.
>>
>> It indicates to the hypervisor how big the balloon can be inflated
>> without pushing the guest system to swap.
>>
>> Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
>> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>> CC: Michael S. Tsirkin <mst@redhat.com>
>> CC: Andrew Morton <akpm@linux-foundation.org>
> Oops - I missed the fact that this affects host/guest ABI.
>
> Can you please submit ABI update proposal to virtio tc?
> Spec patch would be even better.
>
> This is important to ensure there are no conflicts
> with other features being developed in parallel.

hmmm

 From my point of view ABI remains untouched.
The guest can send any amount of <tag>;<value>
pairs and unknown tags are properly ignored
by the host.

That is why I think that this change is safe.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics
       [not found]     ` <56CC7A37.2030807@openvz.org>
@ 2016-02-23 15:53       ` Michael S. Tsirkin
  2016-02-23 16:12         ` Denis V. Lunev
  0 siblings, 1 reply; 6+ messages in thread
From: Michael S. Tsirkin @ 2016-02-23 15:53 UTC (permalink / raw)
  To: Denis V. Lunev; +Cc: Igor Redko, Andrew Morton, linux-kernel, virtualization

On Tue, Feb 23, 2016 at 06:26:47PM +0300, Denis V. Lunev wrote:
> On 02/23/2016 06:10 PM, Michael S. Tsirkin wrote:
> >On Tue, Feb 16, 2016 at 06:50:52PM +0300, Denis V. Lunev wrote:
> >>From: Igor Redko <redkoi@virtuozzo.com>
> >>
> >>Add a new field, VIRTIO_BALLOON_S_AVAIL, to virtio_balloon memory
> >>statistics protocol, corresponding to 'Available' in /proc/meminfo.
> >>
> >>It indicates to the hypervisor how big the balloon can be inflated
> >>without pushing the guest system to swap.
> >>
> >>Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
> >>Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
> >>Signed-off-by: Denis V. Lunev <den@openvz.org>
> >>CC: Michael S. Tsirkin <mst@redhat.com>
> >>CC: Andrew Morton <akpm@linux-foundation.org>
> >Oops - I missed the fact that this affects host/guest ABI.
> >
> >Can you please submit ABI update proposal to virtio tc?
> >Spec patch would be even better.
> >
> >This is important to ensure there are no conflicts
> >with other features being developed in parallel.
> 
> hmmm
> 
> From my point of view ABI remains untouched.

Anything exposed by guest to host is ABI.
Once we add stuff there, we never can remove it
as some host might rely on it.

> The guest can send any amount of <tag>;<value>
> pairs and unknown tags are properly ignored
> by the host.
> 
> That is why I think that this change is safe.

What happens if someone uses the tag you
used for VIRTIO_BALLOON_S_AVAIL, for some
other purpose?
Any tools using VIRTIO_BALLOON_S_AVAIL will be confused.

Really, it's not hard to get a tag number from virtio TC,
so please just do this.

-- 
MST

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics
  2016-02-23 15:53       ` Michael S. Tsirkin
@ 2016-02-23 16:12         ` Denis V. Lunev
  0 siblings, 0 replies; 6+ messages in thread
From: Denis V. Lunev @ 2016-02-23 16:12 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Igor Redko, Andrew Morton, linux-kernel, virtualization

On 02/23/2016 06:53 PM, Michael S. Tsirkin wrote:
> On Tue, Feb 23, 2016 at 06:26:47PM +0300, Denis V. Lunev wrote:
>> On 02/23/2016 06:10 PM, Michael S. Tsirkin wrote:
>>> On Tue, Feb 16, 2016 at 06:50:52PM +0300, Denis V. Lunev wrote:
>>>> From: Igor Redko <redkoi@virtuozzo.com>
>>>>
>>>> Add a new field, VIRTIO_BALLOON_S_AVAIL, to virtio_balloon memory
>>>> statistics protocol, corresponding to 'Available' in /proc/meminfo.
>>>>
>>>> It indicates to the hypervisor how big the balloon can be inflated
>>>> without pushing the guest system to swap.
>>>>
>>>> Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
>>>> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
>>>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>>>> CC: Michael S. Tsirkin <mst@redhat.com>
>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>> Oops - I missed the fact that this affects host/guest ABI.
>>>
>>> Can you please submit ABI update proposal to virtio tc?
>>> Spec patch would be even better.
>>>
>>> This is important to ensure there are no conflicts
>>> with other features being developed in parallel.
>> hmmm
>>
>>  From my point of view ABI remains untouched.
> Anything exposed by guest to host is ABI.
> Once we add stuff there, we never can remove it
> as some host might rely on it.
>
>> The guest can send any amount of <tag>;<value>
>> pairs and unknown tags are properly ignored
>> by the host.
>>
>> That is why I think that this change is safe.
> What happens if someone uses the tag you
> used for VIRTIO_BALLOON_S_AVAIL, for some
> other purpose?
> Any tools using VIRTIO_BALLOON_S_AVAIL will be confused.
actually this constant resides in QEMU only,
values are reported above using JSON and
string tags.

> Really, it's not hard to get a tag number from virtio TC,
> so please just do this.
>
ok. So do you propose to negotiate maximum allowed
tag to send at the driver start time?

we will have to guard this exchange with proper flag
in feature space then. This could be done but from my
point of view this looks like serious over-complication.
Do we have somebody who can judge?

Den

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-02-23 16:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1455637852-7323-1-git-send-email-den@openvz.org>
2016-02-16 15:50 ` [PATCH 1/2] calculate 'available' memory in the separate function Denis V. Lunev
2016-02-16 15:50 ` [PATCH 2/2] virtio_balloon: export 'available' memory to balloon statistics Denis V. Lunev
     [not found] ` <1455637852-7323-3-git-send-email-den@openvz.org>
2016-02-23 15:10   ` Michael S. Tsirkin
     [not found]   ` <20160223170828-mutt-send-email-mst@redhat.com>
2016-02-23 15:26     ` Denis V. Lunev
     [not found]     ` <56CC7A37.2030807@openvz.org>
2016-02-23 15:53       ` Michael S. Tsirkin
2016-02-23 16:12         ` Denis V. Lunev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).