Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752514AbbBRKUH (ORCPT ); Wed, 18 Feb 2015 05:20:07 -0500 Received: from down.free-electrons.com ([37.187.137.238]:38278 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751010AbbBRKUF (ORCPT ); Wed, 18 Feb 2015 05:20:05 -0500 Date: Wed, 18 Feb 2015 11:16:46 +0100 From: Maxime Ripard To: Robert Jarzmik Cc: Ezequiel Garcia , David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mtd: pxa3xx-nand: handle PIO in threaded interrupt Message-ID: <20150218101646.GO25269@lukather> References: <1424203617-29431-1-git-send-email-robert.jarzmik@free.fr> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="8WA4ILJSyYAmUzbY" Content-Disposition: inline In-Reply-To: <1424203617-29431-1-git-send-email-robert.jarzmik@free.fr> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4319 Lines: 130 --8WA4ILJSyYAmUzbY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Feb 17, 2015 at 09:06:57PM +0100, Robert Jarzmik wrote: > Change the handling of the data stage in the driver : don't pump data in > the top-half interrupt, but rather schedule a thread for non dma cases. >=20 > This will enable latencies in the data pumping, especially if delays are > required. Moreover platform shall be more reactive as other interrupts > can be served while pumping data. >=20 > No throughput degradation was observed, at least on the zylonite > platform, while a slight degradation was being expected. >=20 > Signed-off-by: Robert Jarzmik Tested-by: Maxime Ripard On a sidenote... > --- > drivers/mtd/nand/pxa3xx_nand.c | 23 ++++++++++++++++++++--- > 1 file changed, 20 insertions(+), 3 deletions(-) >=20 > diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nan= d.c > index 96b0b1d..237c92c 100644 > --- a/drivers/mtd/nand/pxa3xx_nand.c > +++ b/drivers/mtd/nand/pxa3xx_nand.c > @@ -569,11 +569,25 @@ static void start_data_dma(struct pxa3xx_nand_info = *info) > {} > #endif > =20 > +static irqreturn_t pxa3xx_nand_irq_thread(int irq, void *data) > +{ > + struct pxa3xx_nand_info *info =3D data; > + > + handle_data_pio(info); > + > + info->state =3D STATE_CMD_DONE; > + nand_writel(info, NDSR, NDSR_WRDREQ | NDSR_RDDREQ); > + enable_int(info, NDCR_INT_MASK); > + > + return IRQ_HANDLED; > +} > + > static irqreturn_t pxa3xx_nand_irq(int irq, void *devid) > { > struct pxa3xx_nand_info *info =3D devid; > unsigned int status, is_completed =3D 0, is_ready =3D 0; > unsigned int ready, cmd_done; > + irqreturn_t ret =3D IRQ_HANDLED; > =20 > if (info->cs =3D=3D 0) { > ready =3D NDSR_FLASH_RDY; > @@ -613,9 +627,11 @@ static irqreturn_t pxa3xx_nand_irq(int irq, void *de= vid) > start_data_dma(info); > goto NORMAL_IRQ_EXIT; > } else { > + disable_int(info, NDCR_INT_MASK); > info->state =3D (status & NDSR_RDDREQ) ? > STATE_PIO_READING : STATE_PIO_WRITING; > - handle_data_pio(info); > + ret =3D IRQ_WAKE_THREAD; > + goto NORMAL_IRQ_EXIT; > } > } > if (status & cmd_done) { > @@ -656,7 +672,7 @@ static irqreturn_t pxa3xx_nand_irq(int irq, void *dev= id) > if (is_ready) > complete(&info->dev_ready); > NORMAL_IRQ_EXIT: > - return IRQ_HANDLED; > + return ret; > } > =20 > static inline int is_buf_blank(uint8_t *buf, size_t len) > @@ -1672,7 +1688,8 @@ static int alloc_nand_resource(struct platform_devi= ce *pdev) > /* initialize all interrupts to be disabled */ > disable_int(info, NDSR_MASK); > =20 > - ret =3D request_irq(irq, pxa3xx_nand_irq, 0, pdev->name, info); > + ret =3D request_threaded_irq(irq, pxa3xx_nand_irq, > + pxa3xx_nand_irq_thread, 0, pdev->name, info); Using IRQF_ONESHOT would allow you not to do the interrupt enable / disable dance. Maxime --=20 Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com --8WA4ILJSyYAmUzbY Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJU5GaOAAoJEBx+YmzsjxAgAs4QAKZ59tojjJWwWgRjbW5eikOO AQECiWde9Z7NSezu0us6OxtAMEgHXDwa20EpzERa9MhO+NjIAXkeJQczU+QpnkMA /8KfIF8EXHivEoxlBqzGcdWQcm3ZHxrKjFBjW+z2z/2rGZYbaMcWOOm/UcbQM9sy DuAxv2wMZ+YufmV+zOLtMOcbLctMia119SNRpQYXeApxt+gAO3SH77H5sy0VGxbM Avci73VJZTn81ozOGIO/dYR5ExshnLepeyoLkCFF22CkK31vC5UY6U+lZi9jij8E BoZJ9zrETDtqMbeEgizBv7AKhKo4fm7lcp9ZL2D5dWgkcek4u+NTv1AbCVt9Qdtm vifQRpQI86f9Wj0wvGnCHUeS/GvWR6/3YPZAUKglmt0//yZ6Ij3dddT03BXciRwL v5Qf2nz6AfC2SKe/O5yPH+RXZgWteYdP+9R1KfhlTkyraLEA8fR7DxgatNo0E9Lw ooLlDdwCf3ueXFhsTGf1TOucwwrr6YMgbWBbCpHnHuwvhJVvlZb+PpbAeHYZJThl 5mdCZwxstUeVZPLcU1HH8MdTewSLMnkeyXctKtEQE6NT7uDYNzzvuDH/2mkRWp+F KMHzykGtc6Jl7n3MlhmPk0bB8pwCKZ36TTbuKo4Rw9S/R/XX1UZkpH2vJR6YKVVa T9BZpZ2hRB14m+lUZZTZ =ri5A -----END PGP SIGNATURE----- --8WA4ILJSyYAmUzbY-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/