From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40277) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aO11C-0003x3-H3 for qemu-devel@nongnu.org; Tue, 26 Jan 2016 05:38:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aO119-0007D5-7s for qemu-devel@nongnu.org; Tue, 26 Jan 2016 05:38:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:32999) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aO119-0007Cz-0R for qemu-devel@nongnu.org; Tue, 26 Jan 2016 05:38:35 -0500 Date: Tue, 26 Jan 2016 11:38:30 +0100 From: Igor Mammedov Message-ID: <20160126113830.3c81b616@nial.brq.redhat.com> In-Reply-To: <1453740631-23259-1-git-send-email-den@openvz.org> References: <1453740631-23259-1-git-send-email-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 1/1] nvdimm: disable balloon List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Denis V. Lunev" Cc: Vladimir Sementsov-Ogievskiy , Xiao Guangrong , "Michael S. Tsirkin" , Markus Armbruster , qemu-devel@nongnu.org, Stefan Hajnoczi On Mon, 25 Jan 2016 19:50:31 +0300 "Denis V. Lunev" wrote: > From: Vladimir Sementsov-Ogievskiy > > NVDIMM for now is planned to use as a backing store for DAX filesystem > in the guest and thus this memory is excluded from guest memory management > and LRUs. > > In this case libvirt running QEMU along with configured balloon almost > immediately inflates balloon and effectively kill the guest as > qemu counts nvdimm as part of the ram. Isn't issue in ballooning impl. and not of pc-dimm/nvdimm, so make ballooning code to distinguish between kinds of memory rather than adding not related fields to PCDIMMDeviceClass why don't just move get_current_ram_size() into the sole user virtio-balloon.c and ignore NVDIMMs when counting ram in get_current_ram_size(), that would be much less intrusive patch. > > Counting dimm devices as part of the ram for ballooning was started from > commit 463756d03: > virtio-balloon: Fix balloon not working correctly when hotplug memory > > Signed-off-by: Vladimir Sementsov-Ogievskiy > Signed-off-by: Denis V. Lunev > CC: Stefan Hajnoczi > CC: Xiao Guangrong > CC: "Michael S. Tsirkin" > CC: Igor Mammedov > CC: Eric Blake > CC: Markus Armbruster > --- > v2: > - some rewordings, thanks to Eric Blake > > hw/mem/nvdimm.c | 4 ++++ > hw/mem/pc-dimm.c | 7 ++++++- > include/hw/mem/pc-dimm.h | 1 + > qapi-schema.json | 5 ++++- > 4 files changed, 15 insertions(+), 2 deletions(-) > > diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c > index 4fd397f..4f4d29a 100644 > --- a/hw/mem/nvdimm.c > +++ b/hw/mem/nvdimm.c > @@ -27,9 +27,13 @@ > static void nvdimm_class_init(ObjectClass *oc, void *data) > { > DeviceClass *dc = DEVICE_CLASS(oc); > + PCDIMMDeviceClass *ddc = PC_DIMM_CLASS(oc); > > /* nvdimm hotplug has not been supported yet. */ > dc->hotpluggable = false; > + > + /* ballooning is not supported */ > + ddc->in_ram = false; > } > > static TypeInfo nvdimm_info = { > diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c > index d5cdab2..e0f869d 100644 > --- a/hw/mem/pc-dimm.c > +++ b/hw/mem/pc-dimm.c > @@ -164,6 +164,7 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque) > MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1); > PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1); > DeviceClass *dc = DEVICE_GET_CLASS(obj); > + PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj); > PCDIMMDevice *dimm = PC_DIMM(obj); > > if (dev->id) { > @@ -172,6 +173,7 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque) > } > di->hotplugged = dev->hotplugged; > di->hotpluggable = dc->hotpluggable; > + di->in_ram = ddc->in_ram; > di->addr = dimm->addr; > di->slot = dimm->slot; > di->node = dimm->node; > @@ -205,7 +207,9 @@ ram_addr_t get_current_ram_size(void) > if (value) { > switch (value->type) { > case MEMORY_DEVICE_INFO_KIND_DIMM: > - size += value->u.dimm->size; > + if (value->u.dimm->in_ram) { > + size += value->u.dimm->size; > + } > break; > default: > break; > @@ -444,6 +448,7 @@ static void pc_dimm_class_init(ObjectClass *oc, void *data) > dc->props = pc_dimm_properties; > dc->desc = "DIMM memory module"; > > + ddc->in_ram = true; > ddc->get_memory_region = pc_dimm_get_memory_region; > } > > diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h > index d83bf30..3bcb505 100644 > --- a/include/hw/mem/pc-dimm.h > +++ b/include/hw/mem/pc-dimm.h > @@ -65,6 +65,7 @@ typedef struct PCDIMMDevice { > typedef struct PCDIMMDeviceClass { > /* private */ > DeviceClass parent_class; > + bool in_ram; > > /* public */ > MemoryRegion *(*get_memory_region)(PCDIMMDevice *dimm); > diff --git a/qapi-schema.json b/qapi-schema.json > index 2e960db..3cafa2b 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -3922,6 +3922,8 @@ > # > # @hotpluggable: true if device if could be added/removed while machine is running > # > +# @in-ram: true if device is counted in current ram size (since 2.6) > +# > # Since: 2.1 > ## > { 'struct': 'PCDIMMDeviceInfo', > @@ -3932,7 +3934,8 @@ > 'node': 'int', > 'memdev': 'str', > 'hotplugged': 'bool', > - 'hotpluggable': 'bool' > + 'hotpluggable': 'bool', > + 'in-ram': 'bool' > } > } >