From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42539) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yzj5G-00037f-F6 for qemu-devel@nongnu.org; Tue, 02 Jun 2015 06:06:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yzj5F-0003qh-Cm for qemu-devel@nongnu.org; Tue, 02 Jun 2015 06:06:10 -0400 Date: Tue, 2 Jun 2015 12:05:59 +0200 From: Kevin Wolf Message-ID: <20150602100559.GI3765@noname.str.redhat.com> References: <3587410bf941dc495ec4e41201d1d53a21f7e6fb.1432891306.git.berto@igalia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3587410bf941dc495ec4e41201d1d53a21f7e6fb.1432891306.git.berto@igalia.com> Subject: Re: [Qemu-devel] [PATCH 1/3] qcow2: mark the memory as no longer needed after qcow2_cache_empty() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alberto Garcia Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, Stefan Hajnoczi , Max Reitz Am 29.05.2015 um 11:24 hat Alberto Garcia geschrieben: > After having emptied the cache, the data in the cache tables is no > longer useful, so we can tell the kernel that we are done with it. In > Linux this frees the resources associated with it. > > The effect of this can be seen in the HMP commit operation: it moves > data from the top to the base image (and fills both caches), then it > empties the top image. At this point the data in that cache is no > longer needed so it's just wasting memory. > > Signed-off-by: Alberto Garcia > Reviewed-by: Max Reitz > --- > block/qcow2-cache.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/block/qcow2-cache.c b/block/qcow2-cache.c > index ed92a09..ed14a92 100644 > --- a/block/qcow2-cache.c > +++ b/block/qcow2-cache.c > @@ -22,8 +22,10 @@ > * THE SOFTWARE. > */ > > +#include > #include "block/block_int.h" > #include "qemu-common.h" > +#include "qemu/osdep.h" > #include "qcow2.h" > #include "trace.h" This breaks the mingw build: /mnt/qemu/block/qcow2-cache.c:25:22: fatal error: sys/mman.h: No such file or directory #include > @@ -60,6 +62,22 @@ static inline int qcow2_cache_get_table_idx(BlockDriverState *bs, > return idx; > } > > +static void qcow2_cache_table_release(BlockDriverState *bs, Qcow2Cache *c, > + int i, int num_tables) > +{ > +#if QEMU_MADV_DONTNEED != QEMU_MADV_INVALID > + BDRVQcowState *s = bs->opaque; > + void *t = qcow2_cache_get_table_addr(bs, c, i); > + long align = sysconf(_SC_PAGESIZE); It seems that getpagesize() is usually used in qemu. > + size_t mem_size = (size_t) s->cluster_size * num_tables; > + size_t offset = QEMU_ALIGN_UP((uintptr_t) t, align) - (uintptr_t) t; > + size_t length = QEMU_ALIGN_DOWN(mem_size - offset, align); Instead of all the aligning here, shouldn't we just make sure that the tables are created with the right alignment? > + if (length > 0) { > + qemu_madvise((uint8_t *) t + offset, length, QEMU_MADV_DONTNEED); > + } > +#endif > +} Kevin