|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |