[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/3] x86/shadow: VRAM last_dirty tagging


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Wed, 20 May 2026 15:54:48 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6SGbwOpwSnbAXjVEgb37b75Phl/x2O+0FRj1Cy2LLmQ=; b=VnYLDZCjiY1K/Kj1ISYzqGv99+Dzl+sYlZOW3Q9+abJsfHfLkUetPo7vY5LajmKkrI+OfKPGMgb/ElRPUkV01C7eLx4BMlXsbdht0vJVI7BJdICfhHvNRGycDTG+p1+8gxjPRyEzPuDkV8JGQNtnyPyntyGHFk+204u7lfDwizcPWEKFntXLVoQv/HS8EeeXCL1GM/Qr2Gz3Bs5kpZaxW48yk6BxlEuJLD6pdRSRKtFkgyK0uaG3pWu3WMMlonmBxHgUNxeqO9w/B92i2BlglA0FTrRal/0k+hbPfcs7YYXvXrNA9smr4MpQVwj5zm47Ta6xGmM5GrYromJwEkD2jA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RpR4ifVe77t2GEop0aicxKo+RGpgDCTOQ1DE7CinXElZK9PaZhtVutTUIPgW/pgPtnUAXLpH9Y3DJHvxTGuUzOTnbr5+5kncRirsGBi+8LL5S/Sftfc4priWbUnQ1oHTnVjFd/cjdwbBaaVEhzF09lxfSlfXANNva3syqzHzRvD9P9Sjgj8diGD6YceFjJR55FesJsLginUUbFQHzudeEHyhNhY3BAYtSA2iZFlHz1zhb46POlA/+uAjSvHiH0BTDAxQQGlxzcGCisX5NRul2qrxVX+Ip6btZCE9hA+9U16W6eCg2AaYUokpfPQ5XI5gyLfkMCT56e8us/26rvWrSQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Delivery-date: Wed, 20 May 2026 13:55:03 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon, May 04, 2026 at 10:39:53AM +0200, Jan Beulich wrote:
> On 27.04.2026 11:28, Roger Pau Monné wrote:
> > On Tue, Feb 03, 2026 at 05:49:55PM +0100, Jan Beulich wrote:
> >> --- a/xen/arch/x86/mm/shadow/hvm.c
> >> +++ b/xen/arch/x86/mm/shadow/hvm.c
> >> @@ -1087,18 +1087,18 @@ int shadow_track_dirty_vram(struct domai
> >>          if ( (dirty_vram->dirty_bitmap = xzalloc_array(uint8_t, 
> >> dirty_size)) == NULL )
> >>              goto out_sl1ma;
> >>  
> >> -        dirty_vram->last_dirty = NOW();
> >> +        dirty_vram->last_dirty = -1;
> >>  
> >>          /* Tell the caller that this time we could not track dirty bits. 
> >> */
> >>          rc = -ENODATA;
> >>      }
> >> -    else if ( dirty_vram->last_dirty == -1 )
> >> -        /* still completely clean, just copy our empty bitmap */
> >> -        memcpy(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size);
> >> -    else
> >> +    /* Nothing to do when the bitmap is still completely clean. */
> >> +    else if ( dirty_vram->last_dirty != -1 )
> >>      {
> >>          mfn_t map_mfn = INVALID_MFN;
> >>          void *map_sl1p = NULL;
> >> +        bool any_dirty = false;
> >> +        s_time_t now;
> >>  
> >>          /* Iterate over VRAM to track dirty bits. */
> >>          for ( i = 0; i < nr_frames; i++ )
> >> @@ -1174,16 +1174,20 @@ int shadow_track_dirty_vram(struct domai
> >>              if ( dirty )
> >>              {
> >>                  dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
> >> -                dirty_vram->last_dirty = NOW();
> >> +                any_dirty = true;
> >>              }
> >>          }
> >>  
> >> +        now = NOW();
> >> +        if ( any_dirty )
> >> +            dirty_vram->last_dirty = now;
> > 
> > I'm a bit confused with the setting of ->last_dirty here ...
> > 
> >> +
> >>          if ( map_sl1p )
> >>              unmap_domain_page(map_sl1p);
> >>  
> >>          memcpy(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size);
> >>          memset(dirty_vram->dirty_bitmap, 0, dirty_size);
> > 
> > ... as here the bitmap is zeroed, and hence ->last_dirty should be set
> > to -1?
> 
> That's not how I understand the field is used. Aiui it identifies "was
> clean for more than 2 seconds". That's not the case here. Hence the
> setting to -1 only conditionally a few lines down from here.

Hm, OK, it seems like a very complicated way to signal this.  Won't it
be easier to unconditionally store the last write time in
->last_dirty, and let the consumer decide whether it's been more than
2s or not?

Maybe you could write a comment next to the field in the struct
declaration?

Either way:

Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>

> >> @@ -1216,6 +1220,7 @@ int shadow_track_dirty_vram(struct domai
> >>          paging_lock(d);
> >>          for ( i = 0; i < dirty_size; i++ )
> >>              dirty_vram->dirty_bitmap[i] |= dirty_bitmap[i];
> >> +        dirty_vram->last_dirty = NOW();
> > 
> > I think this is doesn't deserve a 'Fixes:' tag because the setting of
> > ->last_dirty unconditionally to NOW() regardless of whether the bitmap
> > is zeroed?
> 
> There was (and is) no unconditional setting of ->last_dirty. Technically
> maybe a Fixes: tag might be appropriate, but this is an error path which
> should never be taken (assuming a well behaved DM). Do you think I should
> dig out the offending commit?

I'm not specially fuzzed about backporting this, I think it's fine to
go in without a Fixes tag (and then no backport).

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.