On Thu, 19 Oct 2017 16:12:20 +0300 "Michael S. Tsirkin" <mst@xxxxxxxxxx> wrote: > On Thu, Sep 21, 2017 at 02:55:41PM +0200, Tomáš Golembiovský wrote: > > Add a new fields, VIRTIO_BALLOON_S_BUFFERS and VIRTIO_BALLOON_S_CACHED, > > to virtio_balloon memory statistics protocol. The values correspond to > > 'Buffers' and 'Cached' in /proc/meminfo. > > > > To be able to compute the value of 'Cached' memory it is necessary to > > export total_swapcache_pages() to modules. > > > > Signed-off-by: Tomáš Golembiovský <tgolembi@xxxxxxxxxx> > > Does 'Buffers' actually make sense? It's a temporary storage - > wouldn't it be significantly out of date by the time > host receives it? That would be best answered by somebody from kernel. But my personal opinion is that it would not be out of date. The amount of memory dedicated to Buffers does not seem to fluctuate too much. Tomas > > --- > > drivers/virtio/virtio_balloon.c | 11 +++++++++++ > > include/uapi/linux/virtio_balloon.h | 4 +++- > > mm/swap_state.c | 1 + > > 3 files changed, 15 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c > > index f0b3a0b9d42f..c2558ec47a62 100644 > > --- a/drivers/virtio/virtio_balloon.c > > +++ b/drivers/virtio/virtio_balloon.c > > @@ -244,12 +244,19 @@ static unsigned int update_balloon_stats(struct virtio_balloon *vb) > > struct sysinfo i; > > unsigned int idx = 0; > > long available; > > + long cached; > > > > all_vm_events(events); > > si_meminfo(&i); > > > > available = si_mem_available(); > > > > + cached = global_node_page_state(NR_FILE_PAGES) - > > + total_swapcache_pages() - i.bufferram; > > + if (cached < 0) > > + cached = 0; > > + > > + > > #ifdef CONFIG_VM_EVENT_COUNTERS > > update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN, > > pages_to_bytes(events[PSWPIN])); > > @@ -264,6 +271,10 @@ static unsigned int update_balloon_stats(struct virtio_balloon *vb) > > pages_to_bytes(i.totalram)); > > update_stat(vb, idx++, VIRTIO_BALLOON_S_AVAIL, > > pages_to_bytes(available)); > > + update_stat(vb, idx++, VIRTIO_BALLOON_S_BUFFERS, > > + pages_to_bytes(i.bufferram)); > > + update_stat(vb, idx++, VIRTIO_BALLOON_S_CACHED, > > + pages_to_bytes(cached)); > > > > return idx; > > } > > diff --git a/include/uapi/linux/virtio_balloon.h b/include/uapi/linux/virtio_balloon.h > > index 343d7ddefe04..d5dc8a56a497 100644 > > --- a/include/uapi/linux/virtio_balloon.h > > +++ b/include/uapi/linux/virtio_balloon.h > > @@ -52,7 +52,9 @@ struct virtio_balloon_config { > > #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_AVAIL 6 /* Available memory as in /proc */ > > -#define VIRTIO_BALLOON_S_NR 7 > > +#define VIRTIO_BALLOON_S_BUFFERS 7 /* Buffers memory as in /proc */ > > +#define VIRTIO_BALLOON_S_CACHED 8 /* Cached memory as in /proc */ > > +#define VIRTIO_BALLOON_S_NR 9 > > > > /* > > * Memory statistics structure. > > diff --git a/mm/swap_state.c b/mm/swap_state.c > > index 71ce2d1ccbf7..f3a4ff7d6c52 100644 > > --- a/mm/swap_state.c > > +++ b/mm/swap_state.c > > @@ -95,6 +95,7 @@ unsigned long total_swapcache_pages(void) > > rcu_read_unlock(); > > return ret; > > } > > +EXPORT_SYMBOL_GPL(total_swapcache_pages); > > > > static atomic_t swapin_readahead_hits = ATOMIC_INIT(4); > > Need an ack from MM crowd on that. > > > -- > > 2.14.1 -- Tomáš Golembiovský <tgolembi@xxxxxxxxxx>