ACK: [PATCH][SRU Disco] iommu/iova: Separate atomic variables to improve performance
Connor Kuehl
connor.kuehl at canonical.com
Mon Jul 1 18:46:29 UTC 2019
On 7/1/19 11:45 AM, Connor Kuehl wrote:
> 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>
Sorry, I meant to put ACK in the e-mail subject.
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