From mboxrd@z Thu Jan 1 00:00:00 1970 From: Don Slutz Subject: [PATCH v2 1/1] tools: Handle xc_maxmem adjustments Date: Tue, 14 Apr 2015 18:06:26 -0400 Message-ID: <1429049186-27343-1-git-send-email-dslutz@verizon.com> References: <20150414175437.GB11717@zion.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20150414175437.GB11717@zion.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , Ian Campbell , Stefano Stabellini , Andrew Cooper , Ian Jackson , Don Slutz , Shriram Rajagopalan , Yang Hongyang List-Id: xen-devel@lists.xenproject.org This fixes an issue where "xl save" followed by "xl restore" reports: "xc: error: Failed to allocate memory for batch.!: Internal error" One of the ways to get into this state is to have more then 4 e1000 nics configured. Signed-off-by: Don Slutz --- Changes from v1 to v2: Renamed from "xc_domain_restore: Allow QEMU to increase memory" Reworked completely to have xc_domain_save save the domain config data that is needed. And xc_domain_restore to use the new saved data in recreating the domain. tools/libxc/xc_domain_restore.c | 21 +++++++++++++++++++++ tools/libxc/xc_domain_save.c | 16 ++++++++++++++++ tools/libxc/xg_save_restore.h | 2 ++ 3 files changed, 39 insertions(+) diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c index a382701..359fe41 100644 --- a/tools/libxc/xc_domain_restore.c +++ b/tools/libxc/xc_domain_restore.c @@ -769,6 +769,19 @@ static void pagebuf_free(pagebuf_t* buf) } } +static int xc_maxmem_restore(xc_interface *xch, struct restore_ctx *ctx, + int dom, int fd) +{ + uint64_t maxkb; + + if ( RDEXACT(fd, &maxkb, sizeof(maxkb)) ) + { + PERROR("Error when reading maxmem"); + return -1; + } + return xc_domain_setmaxmem(xch, dom, maxkb); +} + static int pagebuf_get_one(xc_interface *xch, struct restore_ctx *ctx, pagebuf_t* buf, int fd, uint32_t dom) { @@ -1013,6 +1026,14 @@ static int pagebuf_get_one(xc_interface *xch, struct restore_ctx *ctx, } return pagebuf_get_one(xch, ctx, buf, fd, dom); + case XC_SAVE_ID_XC_MAXMEM: + DPRINTF("xc_domain_restore start maxmem\n"); + if ( xc_maxmem_restore(xch, ctx, dom, fd) ) { + PERROR("error reading/restoring maxmem"); + return -1; + } + return pagebuf_get_one(xch, ctx, buf, fd, dom); + default: if ( (count > MAX_BATCH_SIZE) || (count < 0) ) { ERROR("Max batch size exceeded (%d). Giving up.", count); diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index 254fdb3..381b95e 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -782,6 +782,16 @@ static xen_pfn_t *map_and_save_p2m_table(xc_interface *xch, return success ? p2m : NULL; } +static int xc_maxmem_save(int io_fd, uint64_t maxkb) +{ + int marker = XC_SAVE_ID_XC_MAXMEM; + + if ( write_exact(io_fd, &marker, sizeof(marker)) || + write_exact(io_fd, &maxkb, sizeof(maxkb)) ) + return -1; + return 0; +} + /* must be done AFTER suspend_and_state() */ static int save_tsc_info(xc_interface *xch, uint32_t dom, int io_fd) { @@ -1098,6 +1108,12 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter print_stats(xch, dom, 0, &time_stats, &shadow_stats, 0); + if ( xc_maxmem_save(io_fd, info.max_memkb) < 0 ) + { + PERROR("Error when writing to state file (maxmem)"); + goto out; + } + tmem_saved = xc_tmem_save(xch, dom, io_fd, live, XC_SAVE_ID_TMEM); if ( tmem_saved == -1 ) { diff --git a/tools/libxc/xg_save_restore.h b/tools/libxc/xg_save_restore.h index bdd9009..4123a84 100644 --- a/tools/libxc/xg_save_restore.h +++ b/tools/libxc/xg_save_restore.h @@ -262,6 +262,8 @@ /* These are a pair; it is an error for one to exist without the other */ #define XC_SAVE_ID_HVM_IOREQ_SERVER_PFN -19 #define XC_SAVE_ID_HVM_NR_IOREQ_SERVER_PAGES -20 +/* QEMU auto size handling */ +#define XC_SAVE_ID_XC_MAXMEM -21 /* ** We process save/restore/migrate in batches of pages; the below -- 1.8.4