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

Re: [PATCH] x86: Add Kconfig option for log-dirty tracking


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx>
  • Date: Mon, 9 Feb 2026 16:24:24 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=suse.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • 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=+fMWWQUBccgWkfSBLwgf2XCzwOW6dseuCIZp8QsjhLE=; b=b1EMDGci29mB5P7CV+m0vFEe/B6riM7zHcmSwNkv35opetH7QUOoqzHO5LqkK1R5rh+vXiD/ennhelzpunLHRovorrWKWVPT1/yKi/B2np8nOuk9XciEIN5G7ZEtieDSeNocXQeGQq+V0J2fpvwvPxenUE9aKL0KTLfXbUUwhXQIvzyxwqkVfqILJ1qhQVAspS8dU/yhFn5XqmAQ/5ZGTonnwJeeSlqGtMIbJPakx1DAGZELfYU3BuChqUGjLgDDmxmyOXi6krJ392sH4C0d0YrSY2zD0qjQRgR6z8stl16RWRq/QyflwpTL8sBY3YT9XQESo6Ldic7vlFmPaAxeeg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=S/O6DFAOWGIhrYqF1tALyHQ+cZBAA+5ALyMv8ROqUU9I1YTBAGOAgtsxjoMWy1U0DGwIMuVC5IO9vdyjbbkcWp3iuuMT/d+mRLbURl5XtyRiIEEWzaw7hwjkumE2/axsRItsqXKO8I9AowRo/liODDZBCtDmzzR5bAo8EuGyzwvF+tpxGRpBNBYgaL9+rev3JRmuIwwfmeRtYz9IlD+TmPyUFtDY1Ad3Z1IIoEioaivotOc1m3kTy+g4ypF6O4VXaklZOSyV4RTmVw8+C02I6l4eEM69MY7bfasUt/gP3URK1ybELbw5AOFWfucxNwSEDDLUp9aLOZXZKvkAE9OHzw==
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, "Julien Grall" <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 09 Feb 2026 15:24:44 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon Feb 9, 2026 at 3:48 PM CET, Jan Beulich wrote:
> On 09.02.2026 11:31, Alejandro Vallejo wrote:
>> --- a/xen/arch/x86/Kconfig
>> +++ b/xen/arch/x86/Kconfig
>> @@ -146,6 +146,7 @@ config XEN_IBT
>>  config SHADOW_PAGING
>>      bool "Shadow Paging"
>>      default !PV_SHIM_EXCLUSIVE
>> +    select LOG_DIRTY
>>      depends on PV || HVM
>>      help
>
> Why would this be? IOW why would shadow imply log-dirty, but HAP wouldn't?

The logic is rather opaque. I admit I'm a bit fuzzy on the uses of logdirty.

I know what it's for and I could navigate the code if a problem arose, but I'm
less clear about which other elements of the hypervisor rely on it (pod? nsvm?
vvmx? shadow? hap?).

If it's strictly toolstack/DM-driven maybe it'd be more apt to have a separate
LIVE_MIGRATION and SAVE_RESTORE configs where LM selects SAVE_RESTORE, which
selects LOG_DIRTY. That's also improve some defaults auto-downgraded from the
max policy just in case a VM is migrated.

>
>> @@ -166,6 +167,14 @@ config SHADOW_PAGING
>>  config PAGING
>>      def_bool HVM || SHADOW_PAGING
>>  
>> +config LOG_DIRTY
>
> PAGING_LOG_DIRTY?

sure.

>
>> --- a/xen/arch/x86/domctl.c
>> +++ b/xen/arch/x86/domctl.c
>> @@ -220,15 +220,15 @@ long arch_do_domctl(
>>      {
>>  
>>      case XEN_DOMCTL_shadow_op:
>> -#ifdef CONFIG_PAGING
>> +        ret = -EOPNOTSUPP;
>> +        if ( !IS_ENABLED(CONFIG_LOG_DIRTY) )
>> +            break;
>> +
>>          ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
>>          if ( ret == -ERESTART )
>>              return hypercall_create_continuation(
>>                         __HYPERVISOR_paging_domctl_cont, "h", u_domctl);
>>          copyback = true;
>> -#else
>> -        ret = -EOPNOTSUPP;
>> -#endif
>>          break;
>
> Can a HVM-only hypervisor create any guests with this? I simply fail to
> see how XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION would then make it through to
> hap_domctl().

xl doesn't seem to call it at all. hap_set_allocation() is implicitly called
through paging_enable() -> hap_enable() -> hap_set_allocation()

>
>> --- a/xen/arch/x86/include/asm/domain.h
>> +++ b/xen/arch/x86/include/asm/domain.h
>> @@ -226,7 +226,9 @@ struct paging_domain {
>>      unsigned int            p2m_pages;    /* number of pages allocated to 
>> p2m */
>>  
>>      /* log dirty support */
>> +#ifdef CONFIG_LOG_DIRTY
>>      struct log_dirty_domain log_dirty;
>> +#endif /* CONFIG_LOG_DIRTY */
>
> Such an #ifdef can likely replace the comment? Or else the comment would
> better also live inside the #ifdef?

true.

>
>> --- a/xen/arch/x86/include/asm/paging.h
>> +++ b/xen/arch/x86/include/asm/paging.h
>> @@ -55,12 +55,9 @@
>>  #define PG_translate   0
>>  #define PG_external    0
>>  #endif
>> -#if defined(CONFIG_PAGING) && !defined(CONFIG_PV_SHIM_EXCLUSIVE)
>>  /* Enable log dirty mode */
>> -#define PG_log_dirty   (XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY << PG_mode_shift)
>> -#else
>> -#define PG_log_dirty   0
>> -#endif
>> +#define PG_log_dirty   IS_ENABLED(CONFIG_LOG_DIRTY) * \
>> +                       (XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY << PG_mode_shift)
>
> Need wrapping in parentheses then.

true.

>
>> --- a/xen/arch/x86/mm/hap/hap.c
>> +++ b/xen/arch/x86/mm/hap/hap.c
>> @@ -50,7 +50,7 @@ struct hap_dirty_vram {
>>   * calling p2m_log_dirty_range(), which interrogates each vram
>>   * page's p2m type looking for pages that have been made writable.
>>   */
>> -
>> +#ifdef CONFIG_LOG_DIRTY
>
> This wants to move further up.

sure

>
>> --- a/xen/include/hypercall-defs.c
>> +++ b/xen/include/hypercall-defs.c
>> @@ -194,7 +194,7 @@ dm_op(domid_t domid, unsigned int nr_bufs, 
>> xen_dm_op_buf_t *bufs)
>>  #ifdef CONFIG_SYSCTL
>>  sysctl(xen_sysctl_t *u_sysctl)
>>  #endif
>> -#if defined(CONFIG_X86) && defined(CONFIG_PAGING) && 
>> !defined(CONFIG_PV_SHIM_EXCLUSIVE)
>> +#if defined(CONFIG_LOG_DIRTY)
>>  paging_domctl_cont(xen_domctl_t *u_domctl)
>>  #endif
>>  #ifndef CONFIG_PV_SHIM_EXCLUSIVE
>> @@ -292,7 +292,7 @@ dm_op                              compat   do       
>> compat   do       do
>>  hypfs_op                           do       do       do       do       do
>>  #endif
>>  mca                                do       do       -        -        -
>> -#if defined(CONFIG_X86) && defined(CONFIG_PAGING) && 
>> !defined(CONFIG_PV_SHIM_EXCLUSIVE)
>> +#if defined(CONFIG_LOG_DIRTY)
>>  paging_domctl_cont                 do       do       do       do       -
>>  #endif
>
> The CONFIG_X86 part of the checking wants to remain: Another port may also 
> gain
> a setting of this name, without necessarily having this auxiliary hypercall.

Hmmm. Makes sense.

>
> Jan




 


Rackspace

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