Received: by 10.192.165.156 with SMTP id m28csp1099031imm; Wed, 11 Apr 2018 12:23:09 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/M2Mn9pX7XMoWZHZlmirjUjyMLrCElDRbTU24UJeWXru5RzPRPpZpK55Ne4zaj2aFw5sM6 X-Received: by 10.99.2.202 with SMTP id 193mr4408268pgc.117.1523474589186; Wed, 11 Apr 2018 12:23:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523474589; cv=none; d=google.com; s=arc-20160816; b=dk7mA7ybqbdxKJV7TIOCW2KMXLJCZ4R21SC09Q/j4ZUKa6He4EFW96wXdr2QORUcQM UpuaWViPWY6bq8ZFrngVmspcm1i6iSeVdix8ASUck2S6n8HTyPrIggQ+f3Rk13gAzfvq 0hL/8xjKsmxq8iyWUAtXVd5ZI4StjB4WL2NeCurear/whWjVuv5Kpg3VM6JqDZskb2g0 hMgKZ+Kg0qksmMA4rv3azl3EyVIn9s/hL66L6mSOeXebExJT7dlvIgzA84tJwf7vzZEe qFVJj9Q2ipjdecSNrLR/eDcFYK+5dHz/e2kMVz9pAlJkIDLLiEC2SWJ1ADNHy/8Q5L+G TcGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=jcWIEz66qI2xqfdcBh0MaryqLgR03e4iYanAy4KAnrs=; b=bE8eEravNE2JD+a11pni8/wvNyhDI25ZkmZMp0KiWLxtue1FrrphWtr3z4nDtaqaGu mIjDCt4evYUVE9IYz1HEi5KyPvO/42x1402blneTR2Kq7g+S4wdyZgrpAjrqK/lWNp5N DD2Qg5kUXCYcseWOBdtf+wSs26VdNv8OY3HEyjtaXMWpEEBFrtHoFFkt8aoFqO/JYrko YokxZs3ywpR2nE7guu8vHwMq88lUvfjlMfeJEMtZEKKhKesA7i+3VDFcg6iayX1i1tOl tIagawe3WncTGUalYEcZGCBU7jagQAztVx8/6cvaxuw486lAhENjqEJ1X2h1JaSuz3wn NPsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RPfslE34; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s3-v6si1619048plb.418.2018.04.11.12.22.32; Wed, 11 Apr 2018 12:23:09 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RPfslE34; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753919AbeDKTR3 (ORCPT + 99 others); Wed, 11 Apr 2018 15:17:29 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:33234 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753602AbeDKTRM (ORCPT ); Wed, 11 Apr 2018 15:17:12 -0400 Received: by mail-lf0-f68.google.com with SMTP id x70-v6so4218514lfa.0 for ; Wed, 11 Apr 2018 12:17:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=jcWIEz66qI2xqfdcBh0MaryqLgR03e4iYanAy4KAnrs=; b=RPfslE34YZMUPmECvXzSDJqGsBKssBlFNhab3vX+E0Ew7pieh8GvSb5qFw4skLJpeo ssd6/edTd65WEOsn8Lpm6KVW+Ei2HmXoNPLSt19iPLmb3zwPiIgLx7gcE2Ecy7cw5aAj A2J5gSwggHrEOCPEmtlqbm5jEORztbvMwAANGRUmIVuwX0kZ60Ua1u/4U7MBsHPcYJIx 7NeypF70CPSLHRNZZ4cvN8BEYTspcG7D5Nvm+C24m3B5DxlDUzstztvi7BlR/qRrb2MJ e7wJYWGflQXVtlQ5IArQPTbTRCGrPO8Yo11+PDEzUdvfqo/6VkTb0FetZ0S8+8pq3S9K RbxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=jcWIEz66qI2xqfdcBh0MaryqLgR03e4iYanAy4KAnrs=; b=SDBALT5VE0xnerT1CT0hcJGWA7c7Bvv9deLA+2VLa0WjIOfp1nuLh6g/e8A35K6VT1 XrwMsCFlswTy6hjV9GU+QATRkGGpGQbY1uo+xJ/Tw2L4qIstLnYLxb8rWpuoD72S6xec 19173iDsCvJ7gT16BZAV70GVRz73Wcl49uZXexyMC2boQl8g40HoOja8uBM7vaRT7NVH fiD0Zr3MwIjq5TebeSH7uMsYqmn9pV3EshR5vCYC5meapweo3xt7poFyRve9YBFMU/3D 9mauPMO1J84Rpyne6+vI8SqDi1Qo0sQ3N2fPTmrtx05fvIvidLuZ7mEE7O9zK+gNFN3m h82g== X-Gm-Message-State: ALQs6tCFKAdmYe4DTN+Vy4PqwVYglbTZlwgED0iofWSnE1efyGYZvLSi yTzwIt+USloIf6ePAHqCxOw= X-Received: by 2002:a19:12c1:: with SMTP id 62-v6mr1306917lfs.21.1523474230986; Wed, 11 Apr 2018 12:17:10 -0700 (PDT) Received: from localhost.localdomain ([195.254.138.66]) by smtp.gmail.com with ESMTPSA id p1sm311987lje.56.2018.04.11.12.17.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Apr 2018 12:17:09 -0700 (PDT) From: Vasyl Gomonovych To: gomonovych@gmail.com, ssantosh@kernel.org Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH] soc: ti: knav_qmss: Use percpu instead atomic for stats counter Date: Wed, 11 Apr 2018 21:16:29 +0200 Message-Id: <20180411191629.21545-1-gomonovych@gmail.com> X-Mailer: git-send-email 2.14.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hwqueue has collect statistics in heavy use queue_pop/queu_push functions for cache efficiency and make push/pop faster use percpu variables. For performance reasons, driver should keep descriptor in software handler as short as possible and quickly return it back to hardware queue. Descriptors coming into driver from hardware after pop and return back by push to reduce descriptor lifetime in driver collect statistics on percpu. Signed-off-by: Vasyl Gomonovych --- drivers/soc/ti/knav_qmss.h | 14 ++++++---- drivers/soc/ti/knav_qmss_queue.c | 60 ++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/drivers/soc/ti/knav_qmss.h b/drivers/soc/ti/knav_qmss.h index 905b974d1bdc..22f409b86107 100644 --- a/drivers/soc/ti/knav_qmss.h +++ b/drivers/soc/ti/knav_qmss.h @@ -19,6 +19,8 @@ #ifndef __KNAV_QMSS_H__ #define __KNAV_QMSS_H__ +#include + #define THRESH_GTE BIT(7) #define THRESH_LT 0 @@ -162,11 +164,11 @@ struct knav_qmgr_info { * notifies: notifier counts */ struct knav_queue_stats { - atomic_t pushes; - atomic_t pops; - atomic_t push_errors; - atomic_t pop_errors; - atomic_t notifies; + unsigned int pushes; + unsigned int pops; + unsigned int push_errors; + unsigned int pop_errors; + unsigned int notifies; }; /** @@ -283,7 +285,7 @@ struct knav_queue_inst { struct knav_queue { struct knav_reg_queue __iomem *reg_push, *reg_pop, *reg_peek; struct knav_queue_inst *inst; - struct knav_queue_stats stats; + struct knav_queue_stats __percpu *stats; knav_queue_notify_fn notifier_fn; void *notifier_fn_arg; atomic_t notifier_enabled; diff --git a/drivers/soc/ti/knav_qmss_queue.c b/drivers/soc/ti/knav_qmss_queue.c index 77d6b5c03aae..384d70bd8605 100644 --- a/drivers/soc/ti/knav_qmss_queue.c +++ b/drivers/soc/ti/knav_qmss_queue.c @@ -83,7 +83,7 @@ void knav_queue_notify(struct knav_queue_inst *inst) continue; if (WARN_ON(!qh->notifier_fn)) continue; - atomic_inc(&qh->stats.notifies); + this_cpu_inc(qh->stats->notifies); qh->notifier_fn(qh->notifier_fn_arg); } rcu_read_unlock(); @@ -214,6 +214,12 @@ static struct knav_queue *__knav_queue_open(struct knav_queue_inst *inst, if (!qh) return ERR_PTR(-ENOMEM); + qh->stats = alloc_percpu(struct knav_queue_stats); + if (!qh->stats) { + ret = -ENOMEM; + goto err; + } + qh->flags = flags; qh->inst = inst; id = inst->id - inst->qmgr->start_queue; @@ -229,13 +235,17 @@ static struct knav_queue *__knav_queue_open(struct knav_queue_inst *inst, if (range->ops && range->ops->open_queue) ret = range->ops->open_queue(range, inst, flags); - if (ret) { - devm_kfree(inst->kdev->dev, qh); - return ERR_PTR(ret); - } + if (ret) + goto err; } list_add_tail_rcu(&qh->list, &inst->handles); return qh; + +err: + if (qh->stats) + free_percpu(qh->stats); + devm_kfree(inst->kdev->dev, qh); + return ERR_PTR(ret); } static struct knav_queue * @@ -411,6 +421,12 @@ static void knav_queue_debug_show_instance(struct seq_file *s, { struct knav_device *kdev = inst->kdev; struct knav_queue *qh; + int cpu = 0; + int pushes = 0; + int pops = 0; + int push_errors = 0; + int pop_errors = 0; + int notifies = 0; if (!knav_queue_is_busy(inst)) return; @@ -418,19 +434,22 @@ static void knav_queue_debug_show_instance(struct seq_file *s, seq_printf(s, "\tqueue id %d (%s)\n", kdev->base_id + inst->id, inst->name); for_each_handle_rcu(qh, inst) { - seq_printf(s, "\t\thandle %p: ", qh); - seq_printf(s, "pushes %8d, ", - atomic_read(&qh->stats.pushes)); - seq_printf(s, "pops %8d, ", - atomic_read(&qh->stats.pops)); - seq_printf(s, "count %8d, ", - knav_queue_get_count(qh)); - seq_printf(s, "notifies %8d, ", - atomic_read(&qh->stats.notifies)); - seq_printf(s, "push errors %8d, ", - atomic_read(&qh->stats.push_errors)); - seq_printf(s, "pop errors %8d\n", - atomic_read(&qh->stats.pop_errors)); + for_each_possible_cpu(cpu) { + pushes += per_cpu_ptr(qh->stats, cpu)->pushes; + pops += per_cpu_ptr(qh->stats, cpu)->pops; + push_errors += per_cpu_ptr(qh->stats, cpu)->push_errors; + pop_errors += per_cpu_ptr(qh->stats, cpu)->pop_errors; + notifies += per_cpu_ptr(qh->stats, cpu)->notifies; + } + + seq_printf(s, "\t\thandle %p: pushes %8d, pops %8d, count %8d, notifies %8d, push errors %8d, pop errors %8d\n", + qh, + pushes, + pops, + knav_queue_get_count(qh), + notifies, + push_errors, + pop_errors); } } @@ -547,6 +566,7 @@ void knav_queue_close(void *qhandle) if (range->ops && range->ops->close_queue) range->ops->close_queue(range, inst); } + free_percpu(qh->stats); devm_kfree(inst->kdev->dev, qh); } EXPORT_SYMBOL_GPL(knav_queue_close); @@ -620,7 +640,7 @@ int knav_queue_push(void *qhandle, dma_addr_t dma, val = (u32)dma | ((size / 16) - 1); writel_relaxed(val, &qh->reg_push[0].ptr_size_thresh); - atomic_inc(&qh->stats.pushes); + this_cpu_inc(qh->stats->pushes); return 0; } EXPORT_SYMBOL_GPL(knav_queue_push); @@ -658,7 +678,7 @@ dma_addr_t knav_queue_pop(void *qhandle, unsigned *size) if (size) *size = ((val & DESC_SIZE_MASK) + 1) * 16; - atomic_inc(&qh->stats.pops); + this_cpu_inc(qh->stats->pops); return dma; } EXPORT_SYMBOL_GPL(knav_queue_pop); -- 2.14.1