migration: Move xbzrle cache resize error handling to xbzrle_cache_resize
Signed-off-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
		
							parent
							
								
									9ca3f96394
								
							
						
					
					
						commit
						8acabf69ea
					
				@ -1373,24 +1373,8 @@ void qmp_migrate_set_cache_size(int64_t value, Error **errp)
 | 
				
			|||||||
    MigrationState *s = migrate_get_current();
 | 
					    MigrationState *s = migrate_get_current();
 | 
				
			||||||
    int64_t new_size;
 | 
					    int64_t new_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Check for truncation */
 | 
					    new_size = xbzrle_cache_resize(value, errp);
 | 
				
			||||||
    if (value != (size_t)value) {
 | 
					 | 
				
			||||||
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
					 | 
				
			||||||
                   "exceeding address space");
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Cache should not be larger than guest ram size */
 | 
					 | 
				
			||||||
    if (value > ram_bytes_total()) {
 | 
					 | 
				
			||||||
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
					 | 
				
			||||||
                   "exceeds guest ram size ");
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    new_size = xbzrle_cache_resize(value);
 | 
					 | 
				
			||||||
    if (new_size < 0) {
 | 
					    if (new_size < 0) {
 | 
				
			||||||
        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
					 | 
				
			||||||
                   "is smaller than page size");
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -42,6 +42,7 @@
 | 
				
			|||||||
#include "postcopy-ram.h"
 | 
					#include "postcopy-ram.h"
 | 
				
			||||||
#include "migration/page_cache.h"
 | 
					#include "migration/page_cache.h"
 | 
				
			||||||
#include "qemu/error-report.h"
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
 | 
					#include "qapi/qmp/qerror.h"
 | 
				
			||||||
#include "trace.h"
 | 
					#include "trace.h"
 | 
				
			||||||
#include "exec/ram_addr.h"
 | 
					#include "exec/ram_addr.h"
 | 
				
			||||||
#include "qemu/rcu_queue.h"
 | 
					#include "qemu/rcu_queue.h"
 | 
				
			||||||
@ -113,13 +114,30 @@ static void XBZRLE_cache_unlock(void)
 | 
				
			|||||||
 * Returns the new_size or negative in case of error.
 | 
					 * Returns the new_size or negative in case of error.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @new_size: new cache size
 | 
					 * @new_size: new cache size
 | 
				
			||||||
 | 
					 * @errp: set *errp if the check failed, with reason
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int64_t xbzrle_cache_resize(int64_t new_size)
 | 
					int64_t xbzrle_cache_resize(int64_t new_size, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PageCache *new_cache;
 | 
					    PageCache *new_cache;
 | 
				
			||||||
    int64_t ret;
 | 
					    int64_t ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check for truncation */
 | 
				
			||||||
 | 
					    if (new_size != (size_t)new_size) {
 | 
				
			||||||
 | 
					        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
				
			||||||
 | 
					                   "exceeding address space");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Cache should not be larger than guest ram size */
 | 
				
			||||||
 | 
					    if (new_size > ram_bytes_total()) {
 | 
				
			||||||
 | 
					        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
				
			||||||
 | 
					                   "exceeds guest ram size");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (new_size < TARGET_PAGE_SIZE) {
 | 
					    if (new_size < TARGET_PAGE_SIZE) {
 | 
				
			||||||
 | 
					        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
 | 
				
			||||||
 | 
					                   "is smaller than one target page size");
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -132,7 +150,7 @@ int64_t xbzrle_cache_resize(int64_t new_size)
 | 
				
			|||||||
        new_cache = cache_init(new_size / TARGET_PAGE_SIZE,
 | 
					        new_cache = cache_init(new_size / TARGET_PAGE_SIZE,
 | 
				
			||||||
                                        TARGET_PAGE_SIZE);
 | 
					                                        TARGET_PAGE_SIZE);
 | 
				
			||||||
        if (!new_cache) {
 | 
					        if (!new_cache) {
 | 
				
			||||||
            error_report("Error creating cache");
 | 
					            error_setg(errp, "Error creating cache");
 | 
				
			||||||
            ret = -1;
 | 
					            ret = -1;
 | 
				
			||||||
            goto out;
 | 
					            goto out;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -35,7 +35,7 @@
 | 
				
			|||||||
extern MigrationStats ram_counters;
 | 
					extern MigrationStats ram_counters;
 | 
				
			||||||
extern XBZRLECacheStats xbzrle_counters;
 | 
					extern XBZRLECacheStats xbzrle_counters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64_t xbzrle_cache_resize(int64_t new_size);
 | 
					int64_t xbzrle_cache_resize(int64_t new_size, Error **errp);
 | 
				
			||||||
uint64_t ram_bytes_remaining(void);
 | 
					uint64_t ram_bytes_remaining(void);
 | 
				
			||||||
uint64_t ram_bytes_total(void);
 | 
					uint64_t ram_bytes_total(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user