From patchwork Wed Jun 2 16:08:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Sneddon X-Patchwork-Id: 12295243 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7093DC47083 for ; Wed, 2 Jun 2021 16:12:43 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 367996192C for ; Wed, 2 Jun 2021 16:12:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 367996192C Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=PHOSN+RYpOQyBlg/MmiAdVpgbMa83JC/J34TVPsqH/c=; b=EewPa1h2x0P4iT rY7eYNLOeUoauf756CZQuTFGjyvbKY6y68cFUCs4HqtfhxlAi7CuLoCx3XBuScgV1mbKOJYkwRFDK pbuE4RdHU5a+A0+azOIT19NvPmZogrGtCUd+oPcp+2ynKNCQzQoLLW5+u2d310zSGNI65NRDz5p8o ncKluONUBntikBo/D7jSBhHLNwtKnK5SBRh+H8jlGMchYziog16R/b18/4NLJOZGYwg5ZObQB9YMK MjQQLteoeGHVCcU6FgOXj1vrnMJezfGl/4ZQ19bc+1m14RaXQ6NPp4vZdlnbHDeNtOdBEJ3/ASn3w PTX66FfggeEM4VEayqbQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1loTSF-0053UI-5m; Wed, 02 Jun 2021 16:10:52 +0000 Received: from esa.microchip.iphmx.com ([68.232.153.233]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1loTQA-0052gb-7q for linux-arm-kernel@lists.infradead.org; Wed, 02 Jun 2021 16:08:43 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1622650123; x=1654186123; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=xM1Z4XPCdE5QfVSLjvhJSs57E9XcJ2Y6MAuOiSOnj9U=; b=TZQ8SZLYcEWzGlHwlSzf0Nl0pAQ9gUIb2EIyA9C3L7RCkLiY3fARk/In LsI8eZXI6az7iRFTNC1cahu4oluu1RB3VPKZkTQKPpgMIkk5d0WJ1Jol2 u9k1hZO5KedMcCIdBrjI24TnDWd6Z/M6pv7/qdt+zjvWaXuPuT9cDkflV og5bHD9+DAMqd+Qs9e+NZXSAaWHXdN0G3lZR0AMnwivqAUQsf/ZLD9MXo NOyfIxJvEC1KB+CGDS2mQaosd+QYQqyaiosERvwmSoAdM1hVWKaHkar/f BEzDyIBRE6oKHNCl/B6x5J1FQV764FPSkBBaoRTVS1SmDw2IcCMttm/ih w==; IronPort-SDR: lnKl10SvjnU5CCbCAzOVyTkuRemZZf9aV2vQmLZBkqnlh0mZGVM7+AR2oOaQl5SPwwu4Eyv2SW innJFxDpjploJtbMbDkiv4amsqHM/ZbsF0Xju/QU3JW/7Nr10UpUc/NH881V7rCJnbq4qwcSQ7 MIu86H9RTV5R9U1uP3YBb7XUxOAHYgF82GTPGvyuyK3PfeUBoDDN1/rKhuYku0DvkAhZXpJ3RH 09P9gNKxiFzkmvRsycUQCE+mJctnHOhjDIprSXhRYe0t+K2ZzohTt91TA6xF1tPw6cWRHRLeGP fyQ= X-IronPort-AV: E=Sophos;i="5.83,242,1616482800"; d="scan'208";a="123275443" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa5.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 02 Jun 2021 09:08:38 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Wed, 2 Jun 2021 09:08:36 -0700 Received: from dan-linux.microchip.com (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2176.2 via Frontend Transport; Wed, 2 Jun 2021 09:08:36 -0700 From: Dan Sneddon To: , , Subject: [PATCH 2/2] spi: atmel: Reduce spin lock usage Date: Wed, 2 Jun 2021 09:08:15 -0700 Message-ID: <20210602160816.4890-2-dan.sneddon@microchip.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210602160816.4890-1-dan.sneddon@microchip.com> References: <20210602160816.4890-1-dan.sneddon@microchip.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210602_090842_336219_C5073334 X-CRM114-Status: GOOD ( 16.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexandre Belloni , Tudor Ambarus , Dan Sneddon , Ludovic Desroches , Mark Brown Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The current implementation of the driver holds a spin lock for the duration of the transfer, releasing it only to enable interrupts for short periods of time. As this would prevent any interrupt from happening, this could cause system performance issues every time a SPI message is sent. Since the spi core now handles message syncronization we can reduce the amount of time the spin-lock is held to the regions where both the calling thread and the interrupt might interract. Signed-off-by: Dan Sneddon --- drivers/spi/spi-atmel.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 0e693e72c922..2ef74885ffa2 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -700,7 +700,6 @@ static void atmel_spi_next_xfer_pio(struct spi_master *master, static int atmel_spi_next_xfer_dma_submit(struct spi_master *master, struct spi_transfer *xfer, u32 *plen) - __must_hold(&as->lock) { struct atmel_spi *as = spi_master_get_devdata(master); struct dma_chan *rxchan = master->dma_rx; @@ -716,8 +715,6 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master, if (!rxchan || !txchan) return -ENODEV; - /* release lock for DMA operations */ - atmel_spi_unlock(as); *plen = xfer->len; @@ -786,15 +783,12 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master, rxchan->device->device_issue_pending(rxchan); txchan->device->device_issue_pending(txchan); - /* take back lock */ - atmel_spi_lock(as); return 0; err_dma: spi_writel(as, IDR, SPI_BIT(OVRES)); atmel_spi_stop_dma(master); err_exit: - atmel_spi_lock(as); return -ENOMEM; } @@ -1053,8 +1047,6 @@ atmel_spi_pump_pio_data(struct atmel_spi *as, struct spi_transfer *xfer) /* Interrupt * - * No need for locking in this Interrupt handler: done_status is the - * only information modified. */ static irqreturn_t atmel_spi_pio_interrupt(int irq, void *dev_id) @@ -1302,8 +1294,6 @@ static int atmel_spi_one_transfer(struct spi_master *master, unsigned long dma_timeout; as = spi_master_get_devdata(master); - /* This lock was orignally taken in atmel_spi_trasfer_one_message */ - atmel_spi_lock(as); asd = spi->controller_state; bits = (asd->csr >> 4) & 0xf; @@ -1332,7 +1322,9 @@ static int atmel_spi_one_transfer(struct spi_master *master, reinit_completion(&as->xfer_completion); if (as->use_pdc) { + atmel_spi_lock(as); atmel_spi_pdc_next_xfer(master, xfer); + atmel_spi_unlock(as); } else if (atmel_spi_use_dma(as, xfer)) { len = as->current_remaining_bytes; ret = atmel_spi_next_xfer_dma_submit(master, @@ -1348,14 +1340,13 @@ static int atmel_spi_one_transfer(struct spi_master *master, as->current_remaining_bytes = 0; } } else { + atmel_spi_lock(as); atmel_spi_next_xfer_pio(master, xfer); + atmel_spi_unlock(as); } - /* interrupts are disabled, so free the lock for schedule */ - atmel_spi_unlock(as); dma_timeout = wait_for_completion_timeout(&as->xfer_completion, SPI_DMA_TIMEOUT); - atmel_spi_lock(as); if (WARN_ON(dma_timeout == 0)) { dev_err(&spi->dev, "spi transfer timeout\n"); as->done_status = -EIO; @@ -1403,8 +1394,6 @@ static int atmel_spi_one_transfer(struct spi_master *master, if (as->use_pdc) atmel_spi_disable_pdc_transfer(as); - atmel_spi_unlock(as); - return as->done_status; }