From patchwork Wed Jul 15 16:36:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 235605 Delivered-To: patch@linaro.org Received: by 2002:a92:d244:0:0:0:0:0 with SMTP id v4csp26713ilg; Wed, 15 Jul 2020 09:36:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwafdhtwC0GqFEhrLnqNUatX25ak2lA67+i/HU4qYBdsbrdz2IETI+KEczjsvfoPE/U5Wh X-Received: by 2002:a50:cf09:: with SMTP id c9mr475763edk.90.1594830984512; Wed, 15 Jul 2020 09:36:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594830984; cv=none; d=google.com; s=arc-20160816; b=t9Aka90a5LFyt0LaJ0ZJJFdgDfYjeMNhlO+yWLt+R/PCUqUydZubQLIYPdAcGPI6+9 vtdk8qYRRv1AFwxLt249lCTvcGWvg8hN452ryMqfOqIUJQ9fRotTHZeFtdCKB0nBrp6h fODNVTFBQTzyz4bd/Hq4uKUD8sFItjhl2+v4p1BIVRz00r9qAV5cbatbgbg+SJ8ZC0gm f5WFBSE4gzNfWND95c9eqip/hannVFbSYr6hYDi/1yQRXqEqqYot+m7wR3Qdgl5RlppD dUqxy6Lw51Km/HKAy6TjweVAKjXofpjEDq95hhVNA7ippCGc9gBrOoPg/E5CJFOTP1dz vNxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=UAl5dJQFxwnhlgjZU+rjS1XHedEi4HIGjQ/0hSyYr7Q=; b=FD1CBi56N40POvcIxRLE8KfSfi2R9JbrOyA3Yu5ezuegM9dVbHOfHvJPL+CwInXvPa dX/qSa9lJeTBEHEDUz602W/hDo2H1Xinhs2ereyfvzqkWXj5Q7aIW/hPuLOcTamGtYU6 ih2DPU2e2uPhEosihPRXkq+5PBOXBQxLFnM5gM1UwKkP6bqC8WstMQKeL9rgObGrPkYD CuzSOsIturF69o0gD5nMMO7lZD1wgzP8V4wS/1PEQZRtmOCkc+Lwd/zyewgp+pmcY6/L XeYqrb72oBQd8n9d6vk8Di/xXd5lytWgs0mHaTkFuu5rr+6/LuU0trst9k9Zkj5bMDMk HoJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2LossVdH; spf=pass (google.com: domain of linux-spi-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i23si1561707ejj.300.2020.07.15.09.36.24; Wed, 15 Jul 2020 09:36:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-spi-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2LossVdH; spf=pass (google.com: domain of linux-spi-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725832AbgGOQgX (ORCPT + 2 others); Wed, 15 Jul 2020 12:36:23 -0400 Received: from mail.kernel.org ([198.145.29.99]:40532 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725792AbgGOQgX (ORCPT ); Wed, 15 Jul 2020 12:36:23 -0400 Received: from localhost (fw-tnat.cambridge.arm.com [217.140.96.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 90D5520658; Wed, 15 Jul 2020 16:36:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1594830983; bh=vjax7ahxGdBn5nIvkGKgpkksllV5Z+xmIO6XyITIsos=; h=From:To:Cc:Subject:Date:From; b=2LossVdHtiGoxo44PEjzW81MKEHkkAfmO6bZK8okq5KqUvNOhZEQOw+JkbK5Jj/km CKpL/iRcFhMQjXJgX358Th/yRRmkE0YKqsgwNcFJuveCIsnAQ6G160Luw9lt8fivLO V54APDx5VYGlO6jS4UUBNnIxF/YJeWfpJmO54gIs= From: Mark Brown To: linux-spi@vger.kernel.org Cc: Mark Brown Subject: [PATCH] spi: Only defer to thread for cleanup when needed Date: Wed, 15 Jul 2020 17:36:10 +0100 Message-Id: <20200715163610.9475-1-broonie@kernel.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org Currently we always defer idling of controllers to the SPI thread, the goal being to ensure that we're doing teardown that's not suitable for atomic context in an appropriate context and to try to batch up more expensive teardown operations when the system is under higher load, allowing more work to be started before the SPI thread is scheduled. However when the controller does not require any substantial work to idle there is no need to do this, we can instead save the context switch and immediately mark the controller as idle. This is particularly useful for systems where there is frequent but not constant activity. Signed-off-by: Mark Brown --- drivers/spi/spi.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) -- 2.20.1 diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 19a03a8d6199..6626587e77b4 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1336,6 +1336,14 @@ void spi_finalize_current_transfer(struct spi_controller *ctlr) } EXPORT_SYMBOL_GPL(spi_finalize_current_transfer); +static void spi_idle_runtime_pm(struct spi_controller *ctlr) +{ + if (ctlr->auto_runtime_pm) { + pm_runtime_mark_last_busy(ctlr->dev.parent); + pm_runtime_put_autosuspend(ctlr->dev.parent); + } +} + /** * __spi_pump_messages - function which processes spi message queue * @ctlr: controller to process queue for @@ -1380,10 +1388,17 @@ static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread) return; } - /* Only do teardown in the thread */ + /* Defer any non-atomic teardown to the thread */ if (!in_kthread) { - kthread_queue_work(ctlr->kworker, - &ctlr->pump_messages); + if (!ctlr->dummy_rx && !ctlr->dummy_tx && + !ctlr->unprepare_transfer_hardware) { + spi_idle_runtime_pm(ctlr); + ctlr->busy = false; + trace_spi_controller_idle(ctlr); + } else { + kthread_queue_work(ctlr->kworker, + &ctlr->pump_messages); + } spin_unlock_irqrestore(&ctlr->queue_lock, flags); return; } @@ -1400,10 +1415,7 @@ static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread) ctlr->unprepare_transfer_hardware(ctlr)) dev_err(&ctlr->dev, "failed to unprepare transfer hardware\n"); - if (ctlr->auto_runtime_pm) { - pm_runtime_mark_last_busy(ctlr->dev.parent); - pm_runtime_put_autosuspend(ctlr->dev.parent); - } + spi_idle_runtime_pm(ctlr); trace_spi_controller_idle(ctlr); spin_lock_irqsave(&ctlr->queue_lock, flags);