@@ -158,6 +158,7 @@ static void io_mem_init(void);
158
158
static void memory_map_init (void );
159
159
static void tcg_log_global_after_sync (MemoryListener * listener );
160
160
static void tcg_commit (MemoryListener * listener );
161
+ static bool ram_is_cpr_compatible (RAMBlock * rb );
161
162
162
163
/**
163
164
* CPUAddressSpace: all the information a CPU needs about an AddressSpace
@@ -1908,13 +1909,18 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
1908
1909
goto out_free ;
1909
1910
}
1910
1911
1911
- error_setg (& new_block -> cpr_blocker ,
1912
- "Memory region %s uses guest_memfd, "
1913
- "which is not supported with CPR." ,
1914
- memory_region_name (new_block -> mr ));
1915
- migrate_add_blocker_modes (& new_block -> cpr_blocker , errp ,
1916
- MIG_MODE_CPR_TRANSFER ,
1917
- -1 );
1912
+ /*
1913
+ * Add a specific guest_memfd blocker if a generic one would not be
1914
+ * added by ram_block_add_cpr_blocker.
1915
+ */
1916
+ if (ram_is_cpr_compatible (new_block )) {
1917
+ error_setg (& new_block -> cpr_blocker ,
1918
+ "Memory region %s uses guest_memfd, "
1919
+ "which is not supported with CPR." ,
1920
+ memory_region_name (new_block -> mr ));
1921
+ migrate_add_blocker_modes (& new_block -> cpr_blocker , errp ,
1922
+ MIG_MODE_CPR_TRANSFER , -1 );
1923
+ }
1918
1924
}
1919
1925
1920
1926
ram_size = (new_block -> offset + new_block -> max_length ) >> TARGET_PAGE_BITS ;
0 commit comments