From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40551) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vzj18-0007iI-OB for qemu-devel@nongnu.org; Sun, 05 Jan 2014 03:25:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vzj12-0001TJ-Dk for qemu-devel@nongnu.org; Sun, 05 Jan 2014 03:25:06 -0500 Received: from fgwmail7.fujitsu.co.jp ([192.51.44.37]:43515) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vzj11-0001TD-Te for qemu-devel@nongnu.org; Sun, 05 Jan 2014 03:25:00 -0500 Received: from fgwmail5.fujitsu.co.jp (fgwmail5.fujitsu.co.jp [192.51.44.35]) by fgwmail7.fujitsu.co.jp (Postfix) with ESMTP id 781141794840 for ; Sun, 5 Jan 2014 16:28:43 +0900 (JST) Received: from m3.gw.fujitsu.co.jp (unknown [10.0.50.73]) by fgwmail5.fujitsu.co.jp (Postfix) with ESMTP id 81C183EE1DA for ; Sun, 5 Jan 2014 16:28:42 +0900 (JST) Received: from smail (m3 [127.0.0.1]) by outgoing.m3.gw.fujitsu.co.jp (Postfix) with ESMTP id 72CFB45DEBB for ; Sun, 5 Jan 2014 16:28:42 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (s3.gw.nic.fujitsu.com [10.0.50.93]) by m3.gw.fujitsu.co.jp (Postfix) with ESMTP id 512E445DEB7 for ; Sun, 5 Jan 2014 16:28:42 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id 44B91E08002 for ; Sun, 5 Jan 2014 16:28:42 +0900 (JST) Received: from s00.gw.fujitsu.co.jp (s00.gw.nic.fujitsu.com [133.161.11.15]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id E0D94E08003 for ; Sun, 5 Jan 2014 16:28:41 +0900 (JST) Received: from s00.gw.fujitsu.co.jp (kw-mxio2.gw.nic.fujitsu.com [10.0.237.142]) by s00.gw.fujitsu.co.jp (Postfix) with ESMTP id B84421180EF for ; Sun, 5 Jan 2014 16:28:41 +0900 (JST) Received: from G08FNSTD100518.localdomain (unknown [10.167.226.68]) by s00.gw.fujitsu.co.jp (Postfix) with ESMTP id 9AB628A003 for ; Sun, 5 Jan 2014 16:28:41 +0900 (JST) From: Qiao Nuohan Date: Sun, 5 Jan 2014 15:27:41 +0800 Message-Id: <1388906864-1083-9-git-send-email-qiaonuohan@cn.fujitsu.com> In-Reply-To: <1388906864-1083-1-git-send-email-qiaonuohan@cn.fujitsu.com> References: <1388906864-1083-1-git-send-email-qiaonuohan@cn.fujitsu.com> Subject: [Qemu-devel] [PATCH v6 08/11] dump: Add APIs to operate DataCache List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: stefanha@gmail.com, lcapitulino@redhat.com, afaerber@suse.de, eblake@redhat.com Cc: qemu-devel@nongnu.org, qiaonuohan@cn.fujitsu.com, kumagai-atsushi@mxc.nes.nec.co.jp, anderson@redhat.com, akong@redhat.com, lersek@redhat.com DataCache is used to store data temporarily, then the data will be written to vmcore. These functions will be called later when writing data of page to vmcore. Signed-off-by: Qiao Nuohan --- dump.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ include/sysemu/dump.h | 9 ++++++++ 2 files changed, 61 insertions(+), 0 deletions(-) diff --git a/dump.c b/dump.c index 1fae152..b4c40f2 100644 --- a/dump.c +++ b/dump.c @@ -1088,6 +1088,58 @@ out: return ret; } +static void prepare_data_cache(DataCache *data_cache, DumpState *s) +{ + data_cache->fd = s->fd; + data_cache->data_size = 0; + data_cache->buf_size = BUFSIZE_DATA_CACHE; + data_cache->buf = g_malloc0(BUFSIZE_DATA_CACHE); +} + +static int write_cache(DataCache *dc, bool flag_flatten, void *buf, size_t size) +{ + /* + * check if the space is enough to cache data, if not, write the cached + * data to dc->fd and reset the buf + */ + if (dc->data_size + size > dc->buf_size) { + if (write_buffer(dc->fd, flag_flatten, dc->offset, dc->buf, + dc->data_size) < 0) { + return -1; + } + + dc->offset += dc->data_size; + dc->data_size = 0; + } + + memcpy(dc->buf + dc->data_size, buf, size); + dc->data_size += size; + + return 0; +} + +/* write the remaining data in dc->buf to dc->fd */ +static int sync_data_cache(DataCache *dc, bool flag_flatten) +{ + if (dc->data_size == 0) { + return 0; + } + + if (write_buffer(dc->fd, flag_flatten, dc->offset, dc->buf, + dc->data_size) < 0) { + return -1; + } + + dc->offset += dc->data_size; + + return 0; +} + +static void free_data_cache(DataCache *data_cache) +{ + g_free(data_cache->buf); +} + static ram_addr_t get_start_block(DumpState *s) { GuestPhysBlock *block; diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h index b5eaf8d..ab44af8 100644 --- a/include/sysemu/dump.h +++ b/include/sysemu/dump.h @@ -36,6 +36,7 @@ #define BUFSIZE_BITMAP (PAGE_SIZE) #define PFN_BUFBITMAP (CHAR_BIT * BUFSIZE_BITMAP) #define ARCH_PFN_OFFSET (0) +#define BUFSIZE_DATA_CACHE (PAGE_SIZE * 4) #define paddr_to_pfn(X, page_shift) \ (((unsigned long long)(X) >> (page_shift)) - ARCH_PFN_OFFSET) @@ -140,6 +141,14 @@ typedef struct QEMU_PACKED KdumpSubHeader64 { uint64_t max_mapnr_64; /* header_version 6 and later */ } KdumpSubHeader64; +typedef struct DataCache { + int fd; /* fd of the file where to write the cached data */ + char *buf; /* buffer for cached data */ + size_t buf_size; /* size of the buf */ + size_t data_size; /* size of cached data in buf */ + off_t offset; /* offset of the file */ +} DataCache; + struct GuestPhysBlockList; /* memory_mapping.h */ int cpu_get_dump_info(ArchDumpInfo *info, const struct GuestPhysBlockList *guest_phys_blocks); -- 1.7.1