[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 02/12] libxenguest: deal with log-dirty op stats overflow
On 25/06/2021 14:18, Jan Beulich wrote: > In send_memory_live() the precise value the dirty_count struct field > gets initialized to doesn't matter much (apart from the triggering of > the log message in send_dirty_pages(), see below), but it is important > that it not be zero on the first iteration (or else send_dirty_pages() > won't get called at all). Saturate the initializer value at the maximum > value the field can hold. I don't follow. Migration would be extremely broken if the first iteration didn't work correctly, so something else is going on here. > > While there also initialize struct precopy_stats' respective field to a > more sane value: We don't really know how many dirty pages there are at > that point. > > In suspend_and_send_dirty() and verify_frames() the local variables > don't need initializing at all, as they're only an output from the > hypercall which gets invoked first thing. > > In send_checkpoint_dirty_pfn_list() the local variable can be dropped > altogether: It's optional to xc_logdirty_control() and not used anywhere > else. > > Note that in case the clipping actually takes effect, the "Bitmap > contained more entries than expected..." log message will trigger. This > being just an informational message, I don't think this is overly > concerning. That message is currently a error, confirming that the VM will crash on the resuming side. This is a consequence of it attempting to balloon during the live phase of migration, and discussed in docs/features/migration.pandoc (well - at least mentioned on the "noone has fixed this yet" list). > --- a/tools/libs/guest/xg_sr_save.c > +++ b/tools/libs/guest/xg_sr_save.c > @@ -500,7 +500,9 @@ static int simple_precopy_policy(struct > static int send_memory_live(struct xc_sr_context *ctx) > { > xc_interface *xch = ctx->xch; > - xc_shadow_op_stats_t stats = { 0, ctx->save.p2m_size }; > + xc_shadow_op_stats_t stats = { > + .dirty_count = MIN(ctx->save.p2m_size, (typeof(stats.dirty_count))~0) > + }; > char *progress_str = NULL; > unsigned int x = 0; > int rc; > @@ -519,7 +521,7 @@ static int send_memory_live(struct xc_sr > goto out; > > ctx->save.stats = (struct precopy_stats){ > - .dirty_count = ctx->save.p2m_size, > + .dirty_count = -1, This is an external interface, and I'm not sure it will tolerate finding more than p2m_size allegedly dirty. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |