Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp441669ybv; Thu, 20 Feb 2020 01:10:02 -0800 (PST) X-Google-Smtp-Source: APXvYqxAgebxFiYQHT2Wiw3YnZU8Yq68FtJaQ0CxIePJO2LUdwSZUQx4gH7FqFQXEPOcETyk0XSH X-Received: by 2002:a05:6830:140f:: with SMTP id v15mr22850511otp.218.1582189802260; Thu, 20 Feb 2020 01:10:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582189802; cv=none; d=google.com; s=arc-20160816; b=HOMV/gAH9xM1o3W3oM6+LrGJ8m3Y3hFx4dylD9r8SuQbZ5ju9AC90Avz2MxCMJ5iPt PjTB/QpbHse5sWWVzRj7JdQCwclHc+TyShjtrk1SYJOcFWCADHyyWoq00GPiklyNDfCz SmJ83val7XwAQ1NLk2gT987X87uqsFmj+J0iDMBamAeEK/KNXEQ9ogfGAWEWJTJfAZGz gRg5iQiTcAinIDtLHhCPCtt42zjl31L+Gc8vKPjXWgJo0Ig2XWYx8A+40rPoLNtbsVdo L82XHeEwkKW/CC8Gfg6wgg6sVFoRCeEI4oh6KMuSwftHXk3B4+Ry11rCsjJ2cao21Dmb U0CQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=zylYQvVAGMjwHNUDNr3Yv8sHWJ1nA5Xj5ztUwoAYamU=; b=Uxi+alVZR+52W9eCbTs3npUnP1bMBipX3Mw5spWQrvBYuI6z4+QbfWy0CmhAuU+Xq+ JBH+/nrNnOSKEtGpUMr9H2BEkZst52R4bEe2gQ9P5pazGDZUiJAfaqyBz9Bz9vPkqQKY 4IIKngYFlOKCILGLrb7fo8xyLagn/k+/6wr6fwqasp2eusGV46YY7BiQnbc1jev4gVwH dKRzm1imF5fOwqZMMmmOGnF07s2tVi+WNZ6KLgAp0DoLkuU7bAbddWAytrx7JH5VbYjF 469dW2aZxA08flwv8b7t1rs8LNHOOp+pgfpZ1NDdZR3ckmETLaMH8/tX+q52d7+VpfOF VWFQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g98si1445553otg.4.2020.02.20.01.09.50; Thu, 20 Feb 2020 01:10:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726830AbgBTJJJ (ORCPT + 99 others); Thu, 20 Feb 2020 04:09:09 -0500 Received: from szxga07-in.huawei.com ([45.249.212.35]:56082 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726771AbgBTJJJ (ORCPT ); Thu, 20 Feb 2020 04:09:09 -0500 Received: from DGGEMS407-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 47ABB268E60EEAE15F16; Thu, 20 Feb 2020 17:09:06 +0800 (CST) Received: from localhost.localdomain (10.67.165.24) by DGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP Server id 14.3.439.0; Thu, 20 Feb 2020 17:08:56 +0800 From: Zaibo Xu To: , CC: , , , , , , , , , , , Subject: [PATCH 1/4] crypto: hisilicon - Use one workqueue per qm instead of per qp Date: Thu, 20 Feb 2020 17:04:52 +0800 Message-ID: <1582189495-38051-2-git-send-email-xuzaibo@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1582189495-38051-1-git-send-email-xuzaibo@huawei.com> References: <1582189495-38051-1-git-send-email-xuzaibo@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.67.165.24] X-CFilter-Loop: Reflected Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org From: Shukun Tan Because so many work queues are not needed. Using one workqueue per QM will reduce the number of kworker threads as well as reducing usage of CPU.This would not degrade any performance. Signed-off-by: Shukun Tan Signed-off-by: Zaibo Xu --- drivers/crypto/hisilicon/qm.c | 38 +++++++++++++++----------------------- drivers/crypto/hisilicon/qm.h | 4 ++-- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c index 79f84dc6..a3510c9 100644 --- a/drivers/crypto/hisilicon/qm.c +++ b/drivers/crypto/hisilicon/qm.c @@ -486,17 +486,9 @@ static void qm_poll_qp(struct hisi_qp *qp, struct hisi_qm *qm) } } -static void qm_qp_work_func(struct work_struct *work) +static void qm_work_process(struct work_struct *work) { - struct hisi_qp *qp; - - qp = container_of(work, struct hisi_qp, work); - qm_poll_qp(qp, qp->qm); -} - -static irqreturn_t qm_irq_handler(int irq, void *data) -{ - struct hisi_qm *qm = data; + struct hisi_qm *qm = container_of(work, struct hisi_qm, work); struct qm_eqe *eqe = qm->eqe + qm->status.eq_head; struct hisi_qp *qp; int eqe_num = 0; @@ -505,7 +497,7 @@ static irqreturn_t qm_irq_handler(int irq, void *data) eqe_num++; qp = qm_to_hisi_qp(qm, eqe); if (qp) - queue_work(qp->wq, &qp->work); + qm_poll_qp(qp, qm); if (qm->status.eq_head == QM_Q_DEPTH - 1) { qm->status.eqc_phase = !qm->status.eqc_phase; @@ -523,6 +515,16 @@ static irqreturn_t qm_irq_handler(int irq, void *data) } qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); +} + +static irqreturn_t do_qm_irq(int irq, void *data) +{ + struct hisi_qm *qm = (struct hisi_qm *)data; + + if (qm->wq) + queue_work(qm->wq, &qm->work); + else + schedule_work(&qm->work); return IRQ_HANDLED; } @@ -532,7 +534,7 @@ static irqreturn_t qm_irq(int irq, void *data) struct hisi_qm *qm = data; if (readl(qm->io_base + QM_VF_EQ_INT_SOURCE)) - return qm_irq_handler(irq, data); + return do_qm_irq(irq, data); dev_err(&qm->pdev->dev, "invalid int source\n"); qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); @@ -1151,20 +1153,9 @@ struct hisi_qp *hisi_qm_create_qp(struct hisi_qm *qm, u8 alg_type) qp->qp_id = qp_id; qp->alg_type = alg_type; - INIT_WORK(&qp->work, qm_qp_work_func); - qp->wq = alloc_workqueue("hisi_qm", WQ_UNBOUND | WQ_HIGHPRI | - WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 0); - if (!qp->wq) { - ret = -EFAULT; - goto err_free_qp_mem; - } return qp; -err_free_qp_mem: - if (qm->use_dma_api) - dma_free_coherent(dev, qp->qdma.size, qp->qdma.va, - qp->qdma.dma); err_clear_bit: write_lock(&qm->qps_lock); qm->qp_array[qp_id] = NULL; @@ -1483,6 +1474,7 @@ int hisi_qm_init(struct hisi_qm *qm) qm->qp_in_used = 0; mutex_init(&qm->mailbox_lock); rwlock_init(&qm->qps_lock); + INIT_WORK(&qm->work, qm_work_process); dev_dbg(dev, "init qm %s with %s\n", pdev->is_physfn ? "pf" : "vf", qm->use_dma_api ? "dma api" : "iommu api"); diff --git a/drivers/crypto/hisilicon/qm.h b/drivers/crypto/hisilicon/qm.h index cae26ea..4c0a2d81 100644 --- a/drivers/crypto/hisilicon/qm.h +++ b/drivers/crypto/hisilicon/qm.h @@ -181,6 +181,8 @@ struct hisi_qm { u32 msi_mask; bool use_dma_api; + struct workqueue_struct *wq; + struct work_struct work; }; struct hisi_qp_status { @@ -210,8 +212,6 @@ struct hisi_qp { struct hisi_qp_ops *hw_ops; void *qp_ctx; void (*req_cb)(struct hisi_qp *qp, void *data); - struct work_struct work; - struct workqueue_struct *wq; struct hisi_qm *qm; }; -- 2.8.1