|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 1/2] xen: replace tlbflush check and operation with inline functions
On 20/09/16 03:31, Dongli Zhang wrote:
> This patch cleaned up the code by replacing complicated tlbflush check and
> operation with inline functions. We should use those inline functions to
> avoid the complicated tlbflush check and tlbflush operations when
> implementing TODOs left in commit a902c12ee45fc9389eb8fe54eeddaf267a555c58
> (More efficient TLB-flush filtering in alloc_heap_pages()).
>
> "#include <asm/flushtlb.h>" is removed from xen/arch/x86/acpi/suspend.c to
> avoid the compiling error after we include "<asm/flushtlb.h>" to
> xen/include/xen/mm.h.
>
> Signed-off-by: Dongli Zhang <dongli.zhang@xxxxxxxxxx>
Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> ---
> Changed since v5:
> * Move the if() and its body of tlbflush check into inline function.
>
> Changed since v4:
> * Wrap the filtered tlbflush mask operation as inline function (suggested
> by Jan).
> * Remove asm/flushtlb.h from suspend.c to avoid compiling error.
>
> Changed since v3:
> * Wrap the complicated tlbflush condition check as inline function
> (suggested by Dario).
>
> ---
> xen/arch/x86/acpi/suspend.c | 1 -
> xen/common/page_alloc.c | 19 ++-----------------
> xen/include/xen/mm.h | 29 +++++++++++++++++++++++++++++
> 3 files changed, 31 insertions(+), 18 deletions(-)
>
> diff --git a/xen/arch/x86/acpi/suspend.c b/xen/arch/x86/acpi/suspend.c
> index 1d8344c..d5c67ee 100644
> --- a/xen/arch/x86/acpi/suspend.c
> +++ b/xen/arch/x86/acpi/suspend.c
> @@ -10,7 +10,6 @@
> #include <asm/processor.h>
> #include <asm/msr.h>
> #include <asm/debugreg.h>
> -#include <asm/flushtlb.h>
> #include <asm/hvm/hvm.h>
> #include <asm/hvm/support.h>
> #include <asm/i387.h>
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 18ff6cf..d7ca3a0 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -827,14 +827,7 @@ static struct page_info *alloc_heap_pages(
> BUG_ON(pg[i].count_info != PGC_state_free);
> pg[i].count_info = PGC_state_inuse;
>
> - if ( pg[i].u.free.need_tlbflush &&
> - (pg[i].tlbflush_timestamp <= tlbflush_current_time()) &&
> - (!need_tlbflush ||
> - (pg[i].tlbflush_timestamp > tlbflush_timestamp)) )
> - {
> - need_tlbflush = 1;
> - tlbflush_timestamp = pg[i].tlbflush_timestamp;
> - }
> + accumulate_tlbflush(&need_tlbflush, &pg[i], &tlbflush_timestamp);
>
> /* Initialise fields which have other uses for free pages. */
> pg[i].u.inuse.type_info = 0;
> @@ -849,15 +842,7 @@ static struct page_info *alloc_heap_pages(
> spin_unlock(&heap_lock);
>
> if ( need_tlbflush )
> - {
> - cpumask_t mask = cpu_online_map;
> - tlbflush_filter(mask, tlbflush_timestamp);
> - if ( !cpumask_empty(&mask) )
> - {
> - perfc_incr(need_flush_tlb_flush);
> - flush_tlb_mask(&mask);
> - }
> - }
> + filtered_flush_tlb_mask(tlbflush_timestamp);
>
> return pg;
> }
> diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
> index f470e49..50db01d 100644
> --- a/xen/include/xen/mm.h
> +++ b/xen/include/xen/mm.h
> @@ -51,6 +51,7 @@
> #include <xen/spinlock.h>
> #include <xen/typesafe.h>
> #include <xen/kernel.h>
> +#include <xen/perfc.h>
> #include <public/memory.h>
>
> TYPE_SAFE(unsigned long, mfn);
> @@ -567,4 +568,32 @@ int prepare_ring_for_helper(struct domain *d, unsigned
> long gmfn,
> struct page_info **_page, void **_va);
> void destroy_ring_for_helper(void **_va, struct page_info *page);
>
> +#include <asm/flushtlb.h>
> +
> +static inline void accumulate_tlbflush(bool *need_tlbflush,
> + const struct page_info *page,
> + uint32_t *tlbflush_timestamp)
> +{
> + if ( page->u.free.need_tlbflush &&
> + page->tlbflush_timestamp <= tlbflush_current_time() &&
> + (!*need_tlbflush ||
> + page->tlbflush_timestamp > *tlbflush_timestamp) )
> + {
> + *need_tlbflush = true;
> + *tlbflush_timestamp = page->tlbflush_timestamp;
> + }
> +}
> +
> +static inline void filtered_flush_tlb_mask(uint32_t tlbflush_timestamp)
> +{
> + cpumask_t mask = cpu_online_map;
> +
> + tlbflush_filter(mask, tlbflush_timestamp);
> + if ( !cpumask_empty(&mask) )
> + {
> + perfc_incr(need_flush_tlb_flush);
> + flush_tlb_mask(&mask);
> + }
> +}
> +
> #endif /* __XEN_MM_H__ */
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |