From patchwork Tue Jul 19 21:36:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 650476 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3rvD0D3XNqz9svs; Wed, 20 Jul 2016 07:37:16 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical-com.20150623.gappssmtp.com header.i=@canonical-com.20150623.gappssmtp.com header.b=Jw8Ikg7n; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1bPchT-0000k7-QA; Tue, 19 Jul 2016 21:37:11 +0000 Received: from mail-it0-f48.google.com ([209.85.214.48]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1bPchP-0000jV-68 for kernel-team@lists.ubuntu.com; Tue, 19 Jul 2016 21:37:07 +0000 Received: by mail-it0-f48.google.com with SMTP id u186so102447004ita.0 for ; Tue, 19 Jul 2016 14:37:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=4tsk3eBMnsBcBLjQTlCk0cRda2XRBOHNj5SQqEMh5OA=; b=Jw8Ikg7ngBaXQTeQ7hKMBkIT/CPSZdMQdsJ+sztIEY7Txf+CaHjVIKD9IKFqcFS9u/ 0xFso6hoG2PBw8/1bGjWflG7XbQ8RES1szpB9X+4jDQu9FDZRlvAApqpeTEONioUOfRJ qP3WyI5d1OtaRwTzyCM+avK/iYlbQdue8wbt5mz7cvGgCG7+oeAQF8xRtFY6RAlK/C3g 5wRWGeTD0N0KeL47HU4BVt9HnN8CDY57Aqo3knj2UJOzYVnCHRfqArP1OID31eyjKtkJ JR/oq32NHH3bghjsabn0W+79Hh1kBzoIExmRcUFresdeZdjRa68VP502JL9HLifFOcNq ebGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=4tsk3eBMnsBcBLjQTlCk0cRda2XRBOHNj5SQqEMh5OA=; b=BCaJku6PTMi5wr58e12Y9lu1PDLh9W7UwUNZPKBkwWiKTXtl0zGS+kesL8vok8hH0P H7+gz/jlZzLFSe2kpdW4JXlsCZEPvY1tqJdZZldo/lbTPeVbfPHL+xE1L4HrX5Np8Pto XEHqdBtHRFH/R1UAoklLKS3c9ExBNFf2dQ4VksKlq2x/YbRpEkQr7mmeTxtUD44Iz+kt PvG9foklJV9bD5NN6RUs6oRyMaR2vWbq30gw0SKR1yZk6TCkWaVxPdCz4LaU9o6MiK7a plvSGgglEslFfwaD2I4/LQWWdGfKsPSeEFFyAHZjtzNBDQfDpelAV9GmnShewxKdct3P BDnw== X-Gm-Message-State: ALyK8tKYA+1cH2HZM+SBhQxdR+b1/0YTXBInQME24RrE9njUYQa1+uE/tou0tohtYpkyCXuH X-Received: by 10.36.50.148 with SMTP id j142mr6756956ita.27.1468964225911; Tue, 19 Jul 2016 14:37:05 -0700 (PDT) Received: from localhost.localdomain (host-174-45-44-32.hln-mt.client.bresnan.net. [174.45.44.32]) by smtp.gmail.com with ESMTPSA id d126sm11610116iog.20.2016.07.19.14.37.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Jul 2016 14:37:05 -0700 (PDT) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/6 Xenial SRU V2] nvme: use a work item to submit async event requests Date: Tue, 19 Jul 2016 15:36:54 -0600 Message-Id: <1468964219-28023-2-git-send-email-tim.gardner@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1468964219-28023-1-git-send-email-tim.gardner@canonical.com> References: <20160719180800.GB13108@whence.com> <1468964219-28023-1-git-send-email-tim.gardner@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Christoph Hellwig BugLink: http://bugs.launchpad.net/bugs/1602724 Use a dedicated work item to submit async event requests instead of the global kthread. This simplifies the code and reduces the latencies to resubmit a request once an even notification happened. Signed-off-by: Christoph Hellwig Reviewed-by: Keith Busch Reviewed-by: Sagi Grimberg Reviewed-by: Johannes Thumshirn Signed-off-by: Jens Axboe (cherry picked from commit 9396dec916c052855dbb5b876c13d163df397319) Signed-off-by: Tim Gardner --- drivers/nvme/host/pci.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 3f895e9..277fc6c 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -111,6 +111,7 @@ struct nvme_dev { struct work_struct reset_work; struct work_struct scan_work; struct work_struct remove_work; + struct work_struct async_work; struct mutex shutdown_lock; bool subsystem; void __iomem *cmb; @@ -304,8 +305,11 @@ static void nvme_complete_async_event(struct nvme_dev *dev, u16 status = le16_to_cpu(cqe->status) >> 1; u32 result = le32_to_cpu(cqe->result); - if (status == NVME_SC_SUCCESS || status == NVME_SC_ABORT_REQ) + if (status == NVME_SC_SUCCESS || status == NVME_SC_ABORT_REQ) { ++dev->ctrl.event_limit; + queue_work(nvme_workq, &dev->async_work); + } + if (status != NVME_SC_SUCCESS) return; @@ -847,15 +851,22 @@ static int nvme_poll(struct blk_mq_hw_ctx *hctx, unsigned int tag) return 0; } -static void nvme_submit_async_event(struct nvme_dev *dev) +static void nvme_async_event_work(struct work_struct *work) { + struct nvme_dev *dev = container_of(work, struct nvme_dev, async_work); + struct nvme_queue *nvmeq = dev->queues[0]; struct nvme_command c; memset(&c, 0, sizeof(c)); c.common.opcode = nvme_admin_async_event; - c.common.command_id = NVME_AQ_BLKMQ_DEPTH + --dev->ctrl.event_limit; - __nvme_submit_cmd(dev->queues[0], &c); + spin_lock_irq(&nvmeq->q_lock); + while (dev->ctrl.event_limit > 0) { + c.common.command_id = NVME_AQ_BLKMQ_DEPTH + + --dev->ctrl.event_limit; + __nvme_submit_cmd(nvmeq, &c); + } + spin_unlock_irq(&nvmeq->q_lock); } static int adapter_delete_queue(struct nvme_dev *dev, u8 opcode, u16 id) @@ -1393,9 +1404,6 @@ static int nvme_kthread(void *data) continue; spin_lock_irq(&nvmeq->q_lock); nvme_process_cq(nvmeq); - - while (i == 0 && dev->ctrl.event_limit > 0) - nvme_submit_async_event(dev); spin_unlock_irq(&nvmeq->q_lock); } } @@ -1959,6 +1967,7 @@ static void nvme_reset_work(struct work_struct *work) goto free_tags; dev->ctrl.event_limit = NVME_NR_AEN_COMMANDS; + queue_work(nvme_workq, &dev->async_work); result = nvme_dev_list_add(dev); if (result) @@ -2093,6 +2102,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) INIT_WORK(&dev->scan_work, nvme_dev_scan); INIT_WORK(&dev->reset_work, nvme_reset_work); INIT_WORK(&dev->remove_work, nvme_remove_dead_ctrl_work); + INIT_WORK(&dev->async_work, nvme_async_event_work); mutex_init(&dev->shutdown_lock); init_completion(&dev->ioq_wait); @@ -2145,6 +2155,7 @@ static void nvme_remove(struct pci_dev *pdev) set_bit(NVME_CTRL_REMOVING, &dev->flags); pci_set_drvdata(pdev, NULL); + flush_work(&dev->async_work); flush_work(&dev->reset_work); flush_work(&dev->scan_work); nvme_remove_namespaces(&dev->ctrl);