[PATCH][SRU Disco] iommu/iova: Separate atomic variables to improve performance

Connor Kuehl connor.kuehl at canonical.com
Mon Jul 1 18:45:54 UTC 2019


On 6/14/19 1:57 PM, dann frazier wrote:
> From: Jinyu Qi <jinyuqi at huawei.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1832909
> 
> In struct iova_domain, there are three atomic variables, the former two
> are about TLB flush counters which use atomic_add operation, anoter is
> used to flush timer that use cmpxhg operation.
> These variables are in the same cache line, so it will cause some
> performance loss under the condition that many cores call queue_iova
> function, Let's isolate the two type atomic variables to different
> cache line to reduce cache line conflict.
> 
> Cc: Joerg Roedel <joro at 8bytes.org>
> Signed-off-by: Jinyu Qi <jinyuqi at huawei.com>
> Signed-off-by: Joerg Roedel <jroedel at suse.de>
> (cherry picked from commit 14bd9a607f9082e7b5690c27e69072f2aeae0de4)
> Signed-off-by: dann frazier <dann.frazier at canonical.com>

Acked-by: Connor Kuehl <connor.kuehl at canonical.com>

> ---
>  include/linux/iova.h | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/iova.h b/include/linux/iova.h
> index 0b93bf96693ef..28a5128405f82 100644
> --- a/include/linux/iova.h
> +++ b/include/linux/iova.h
> @@ -76,6 +76,14 @@ struct iova_domain {
>  	unsigned long	start_pfn;	/* Lower limit for this domain */
>  	unsigned long	dma_32bit_pfn;
>  	unsigned long	max32_alloc_size; /* Size of last failed allocation */
> +	struct iova_fq __percpu *fq;	/* Flush Queue */
> +
> +	atomic64_t	fq_flush_start_cnt;	/* Number of TLB flushes that
> +						   have been started */
> +
> +	atomic64_t	fq_flush_finish_cnt;	/* Number of TLB flushes that
> +						   have been finished */
> +
>  	struct iova	anchor;		/* rbtree lookup anchor */
>  	struct iova_rcache rcaches[IOVA_RANGE_CACHE_MAX_SIZE];	/* IOVA range caches */
>  
> @@ -85,14 +93,6 @@ struct iova_domain {
>  	iova_entry_dtor entry_dtor;	/* IOMMU driver specific destructor for
>  					   iova entry */
>  
> -	struct iova_fq __percpu *fq;	/* Flush Queue */
> -
> -	atomic64_t	fq_flush_start_cnt;	/* Number of TLB flushes that
> -						   have been started */
> -
> -	atomic64_t	fq_flush_finish_cnt;	/* Number of TLB flushes that
> -						   have been finished */
> -
>  	struct timer_list fq_timer;		/* Timer to regularily empty the
>  						   flush-queues */
>  	atomic_t fq_timer_on;			/* 1 when timer is active, 0
> 




More information about the kernel-team mailing list