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

Re: [Xen-devel] [PATCH] x86/paging: Package up the log dirty function pointers



On 16/02/17 17:13, Andrew Cooper wrote:
> They depend soley on paging mode, so don't need to be repeated per domain, and
> can live in .rodata.  While making this change, drop the redundant log_dirty
> from the function pointer names.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx>

Sorry for the delay.



> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Tim Deegan <tim@xxxxxxx>
> CC: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> ---
>  xen/arch/x86/mm/hap/hap.c       | 10 +++++++---
>  xen/arch/x86/mm/paging.c        | 23 ++++++++---------------
>  xen/arch/x86/mm/shadow/common.c |  9 +++++++--
>  xen/include/asm-x86/domain.h    |  8 +++++---
>  xen/include/asm-x86/paging.h    |  6 +-----
>  5 files changed, 28 insertions(+), 28 deletions(-)
> 
> diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
> index b5870bf..e7bad69 100644
> --- a/xen/arch/x86/mm/hap/hap.c
> +++ b/xen/arch/x86/mm/hap/hap.c
> @@ -444,14 +444,18 @@ static void hap_destroy_monitor_table(struct vcpu* v, 
> mfn_t mmfn)
>  /************************************************/
>  void hap_domain_init(struct domain *d)
>  {
> +    static const struct log_dirty_ops hap_ops = {
> +        .enable  = hap_enable_log_dirty,
> +        .disable = hap_disable_log_dirty,
> +        .clean   = hap_clean_dirty_bitmap,
> +    };
> +
>      INIT_PAGE_LIST_HEAD(&d->arch.paging.hap.freelist);
>  
>      d->arch.paging.gfn_bits = hap_paddr_bits - PAGE_SHIFT;
>  
>      /* Use HAP logdirty mechanism. */
> -    paging_log_dirty_init(d, hap_enable_log_dirty,
> -                          hap_disable_log_dirty,
> -                          hap_clean_dirty_bitmap);
> +    paging_log_dirty_init(d, &hap_ops);
>  }
>  
>  /* return 0 for success, -errno for failure */
> diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> index d964ed5..58d7f13 100644
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -234,7 +234,7 @@ int paging_log_dirty_enable(struct domain *d, bool_t 
> log_global)
>          return -EINVAL;
>  
>      domain_pause(d);
> -    ret = d->arch.paging.log_dirty.enable_log_dirty(d, log_global);
> +    ret = d->arch.paging.log_dirty.ops->enable(d, log_global);
>      domain_unpause(d);
>  
>      return ret;
> @@ -250,7 +250,7 @@ static int paging_log_dirty_disable(struct domain *d, 
> bool_t resuming)
>          /* Safe because the domain is paused. */
>          if ( paging_mode_log_dirty(d) )
>          {
> -            ret = d->arch.paging.log_dirty.disable_log_dirty(d);
> +            ret = d->arch.paging.log_dirty.ops->disable(d);
>              ASSERT(ret <= 0);
>          }
>      }
> @@ -572,7 +572,7 @@ static int paging_log_dirty_op(struct domain *d,
>      {
>          /* We need to further call clean_dirty_bitmap() functions of specific
>           * paging modes (shadow or hap).  Safe because the domain is paused. 
> */
> -        d->arch.paging.log_dirty.clean_dirty_bitmap(d);
> +        d->arch.paging.log_dirty.ops->clean(d);
>      }
>      domain_unpause(d);
>      return rv;
> @@ -624,22 +624,15 @@ void paging_log_dirty_range(struct domain *d,
>      flush_tlb_mask(d->domain_dirty_cpumask);
>  }
>  
> -/* Note that this function takes three function pointers. Callers must supply
> - * these functions for log dirty code to call. This function usually is
> - * invoked when paging is enabled. Check shadow_enable() and hap_enable() for
> - * reference.
> +/* Callers must supply log_dirty_ops for the log dirty code to call. This
> + * function usually is invoked when paging is enabled. Check shadow_enable()
> + * and hap_enable() for reference.
>   *
>   * These function pointers must not be followed with the log-dirty lock held.
>   */
> -void paging_log_dirty_init(struct domain *d,
> -                           int    (*enable_log_dirty)(struct domain *d,
> -                                                      bool_t log_global),
> -                           int    (*disable_log_dirty)(struct domain *d),
> -                           void   (*clean_dirty_bitmap)(struct domain *d))
> +void paging_log_dirty_init(struct domain *d, const struct log_dirty_ops *ops)
>  {
> -    d->arch.paging.log_dirty.enable_log_dirty = enable_log_dirty;
> -    d->arch.paging.log_dirty.disable_log_dirty = disable_log_dirty;
> -    d->arch.paging.log_dirty.clean_dirty_bitmap = clean_dirty_bitmap;
> +    d->arch.paging.log_dirty.ops = ops;
>  }
>  
>  /************************************************/
> diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
> index 1c9d9b9..a18aa25 100644
> --- a/xen/arch/x86/mm/shadow/common.c
> +++ b/xen/arch/x86/mm/shadow/common.c
> @@ -48,6 +48,12 @@ static void sh_clean_dirty_bitmap(struct domain *);
>   * Called for every domain from arch_domain_create() */
>  int shadow_domain_init(struct domain *d, unsigned int domcr_flags)
>  {
> +    static const struct log_dirty_ops sh_ops = {
> +        .enable  = sh_enable_log_dirty,
> +        .disable = sh_disable_log_dirty,
> +        .clean   = sh_clean_dirty_bitmap,
> +    };
> +
>      INIT_PAGE_LIST_HEAD(&d->arch.paging.shadow.freelist);
>      INIT_PAGE_LIST_HEAD(&d->arch.paging.shadow.pinned_shadows);
>  
> @@ -62,8 +68,7 @@ int shadow_domain_init(struct domain *d, unsigned int 
> domcr_flags)
>  #endif
>  
>      /* Use shadow pagetables for log-dirty support */
> -    paging_log_dirty_init(d, sh_enable_log_dirty,
> -                          sh_disable_log_dirty, sh_clean_dirty_bitmap);
> +    paging_log_dirty_init(d, &sh_ops);
>  
>  #if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
>      d->arch.paging.shadow.oos_active = 0;
> diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
> index 9bb070f..f84f57b 100644
> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -175,9 +175,11 @@ struct log_dirty_domain {
>      unsigned int   dirty_count;
>  
>      /* functions which are paging mode specific */
> -    int            (*enable_log_dirty   )(struct domain *d, bool_t 
> log_global);
> -    int            (*disable_log_dirty  )(struct domain *d);
> -    void           (*clean_dirty_bitmap )(struct domain *d);
> +    const struct log_dirty_ops {
> +        int        (*enable  )(struct domain *d, bool log_global);
> +        int        (*disable )(struct domain *d);
> +        void       (*clean   )(struct domain *d);
> +    } *ops;
>  };
>  
>  struct paging_domain {
> diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h
> index cec6bfd..9ad74be 100644
> --- a/xen/include/asm-x86/paging.h
> +++ b/xen/include/asm-x86/paging.h
> @@ -150,11 +150,7 @@ void paging_log_dirty_range(struct domain *d,
>  int paging_log_dirty_enable(struct domain *d, bool_t log_global);
>  
>  /* log dirty initialization */
> -void paging_log_dirty_init(struct domain *d,
> -                           int  (*enable_log_dirty)(struct domain *d,
> -                                                    bool_t log_global),
> -                           int  (*disable_log_dirty)(struct domain *d),
> -                           void (*clean_dirty_bitmap)(struct domain *d));
> +void paging_log_dirty_init(struct domain *d, const struct log_dirty_ops 
> *ops);
>  
>  /* mark a page as dirty */
>  void paging_mark_dirty(struct domain *d, mfn_t gmfn);
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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