All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Fabrice Gasnier <fabrice.gasnier@st.com>
Cc: Olivier Moysan <olivier.moysan@st.com>, <knaack.h@gmx.de>,
	<lars@metafoo.de>, <pmeerw@pmeerw.net>, <alexandre.torgue@st.com>,
	<benjamin.gaignard@st.com>, <linux-iio@vger.kernel.org>,
	<linux-stm32@st-md-mailman.stormreply.com>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2] iio: adc: stm32-adc: fix sleep in atomic context
Date: Sun, 15 Mar 2020 09:35:49 +0000	[thread overview]
Message-ID: <20200315093549.20764470@archlinux> (raw)
In-Reply-To: <288fb604-16c6-da52-533f-7f1440ed9daa@st.com>

On Mon, 9 Mar 2020 11:39:17 +0100
Fabrice Gasnier <fabrice.gasnier@st.com> wrote:

> On 3/9/20 11:02 AM, Olivier Moysan wrote:
> > This commit fixes the following error:
> > "BUG: sleeping function called from invalid context at kernel/irq/chip.c"
> > 
> > In DMA mode suppress the trigger irq handler, and make the buffer
> > transfers directly in DMA callback, instead.
> > 
> > Fixes: 2763ea0585c9 ("iio: adc: stm32: add optional dma support")
> > 
> > Signed-off-by: Olivier Moysan <olivier.moysan@st.com>  
> 
> Hi Olivier,
> 
> Acked-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Thanks.  Queued up locally but not pushed out just yet as I have a pull
request out to Greg.  Also marked for stable.

thanks,

Jonathan

> 
> Thanks,
> Fabrice
> 
> > ---
> > Changes in v2:
> > - Add "Fixes" tag in commit message
> > 
> > This solution has been already discussed in the thread
> > https://lkml.org/lkml/2019/3/30/171, and applied in STM32 DFSDM driver:
> > e19ac9d9a978 ("iio: adc: stm32-dfsdm: fix sleep in atomic context")
> > ---
> >  drivers/iio/adc/stm32-adc.c | 31 ++++++++++++++++++++++++++++---
> >  1 file changed, 28 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
> > index 80c3f963527b..ae622ee6d08c 100644
> > --- a/drivers/iio/adc/stm32-adc.c
> > +++ b/drivers/iio/adc/stm32-adc.c
> > @@ -1418,8 +1418,30 @@ static unsigned int stm32_adc_dma_residue(struct stm32_adc *adc)
> >  static void stm32_adc_dma_buffer_done(void *data)
> >  {
> >  	struct iio_dev *indio_dev = data;
> > +	struct stm32_adc *adc = iio_priv(indio_dev);
> > +	int residue = stm32_adc_dma_residue(adc);
> > +
> > +	/*
> > +	 * In DMA mode the trigger services of IIO are not used
> > +	 * (e.g. no call to iio_trigger_poll).
> > +	 * Calling irq handler associated to the hardware trigger is not
> > +	 * relevant as the conversions have already been done. Data
> > +	 * transfers are performed directly in DMA callback instead.
> > +	 * This implementation avoids to call trigger irq handler that
> > +	 * may sleep, in an atomic context (DMA irq handler context).
> > +	 */
> > +	dev_dbg(&indio_dev->dev, "%s bufi=%d\n", __func__, adc->bufi);
> >  
> > -	iio_trigger_poll_chained(indio_dev->trig);
> > +	while (residue >= indio_dev->scan_bytes) {
> > +		u16 *buffer = (u16 *)&adc->rx_buf[adc->bufi];
> > +
> > +		iio_push_to_buffers(indio_dev, buffer);
> > +
> > +		residue -= indio_dev->scan_bytes;
> > +		adc->bufi += indio_dev->scan_bytes;
> > +		if (adc->bufi >= adc->rx_buf_sz)
> > +			adc->bufi = 0;
> > +	}
> >  }
> >  
> >  static int stm32_adc_dma_start(struct iio_dev *indio_dev)
> > @@ -1845,6 +1867,7 @@ static int stm32_adc_probe(struct platform_device *pdev)
> >  {
> >  	struct iio_dev *indio_dev;
> >  	struct device *dev = &pdev->dev;
> > +	irqreturn_t (*handler)(int irq, void *p) = NULL;
> >  	struct stm32_adc *adc;
> >  	int ret;
> >  
> > @@ -1911,9 +1934,11 @@ static int stm32_adc_probe(struct platform_device *pdev)
> >  	if (ret < 0)
> >  		return ret;
> >  
> > +	if (!adc->dma_chan)
> > +		handler = &stm32_adc_trigger_handler;
> > +
> >  	ret = iio_triggered_buffer_setup(indio_dev,
> > -					 &iio_pollfunc_store_time,
> > -					 &stm32_adc_trigger_handler,
> > +					 &iio_pollfunc_store_time, handler,
> >  					 &stm32_adc_buffer_setup_ops);
> >  	if (ret) {
> >  		dev_err(&pdev->dev, "buffer setup failed\n");
> >   


WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron <jic23@kernel.org>
To: Fabrice Gasnier <fabrice.gasnier@st.com>
Cc: lars@metafoo.de, Olivier Moysan <olivier.moysan@st.com>,
	benjamin.gaignard@st.com, linux-iio@vger.kernel.org,
	linux-kernel@vger.kernel.org, pmeerw@pmeerw.net, knaack.h@gmx.de,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-arm-kernel@lists.infradead.org, alexandre.torgue@st.com
Subject: Re: [PATCH v2] iio: adc: stm32-adc: fix sleep in atomic context
Date: Sun, 15 Mar 2020 09:35:49 +0000	[thread overview]
Message-ID: <20200315093549.20764470@archlinux> (raw)
In-Reply-To: <288fb604-16c6-da52-533f-7f1440ed9daa@st.com>

On Mon, 9 Mar 2020 11:39:17 +0100
Fabrice Gasnier <fabrice.gasnier@st.com> wrote:

> On 3/9/20 11:02 AM, Olivier Moysan wrote:
> > This commit fixes the following error:
> > "BUG: sleeping function called from invalid context at kernel/irq/chip.c"
> > 
> > In DMA mode suppress the trigger irq handler, and make the buffer
> > transfers directly in DMA callback, instead.
> > 
> > Fixes: 2763ea0585c9 ("iio: adc: stm32: add optional dma support")
> > 
> > Signed-off-by: Olivier Moysan <olivier.moysan@st.com>  
> 
> Hi Olivier,
> 
> Acked-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Thanks.  Queued up locally but not pushed out just yet as I have a pull
request out to Greg.  Also marked for stable.

thanks,

Jonathan

> 
> Thanks,
> Fabrice
> 
> > ---
> > Changes in v2:
> > - Add "Fixes" tag in commit message
> > 
> > This solution has been already discussed in the thread
> > https://lkml.org/lkml/2019/3/30/171, and applied in STM32 DFSDM driver:
> > e19ac9d9a978 ("iio: adc: stm32-dfsdm: fix sleep in atomic context")
> > ---
> >  drivers/iio/adc/stm32-adc.c | 31 ++++++++++++++++++++++++++++---
> >  1 file changed, 28 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
> > index 80c3f963527b..ae622ee6d08c 100644
> > --- a/drivers/iio/adc/stm32-adc.c
> > +++ b/drivers/iio/adc/stm32-adc.c
> > @@ -1418,8 +1418,30 @@ static unsigned int stm32_adc_dma_residue(struct stm32_adc *adc)
> >  static void stm32_adc_dma_buffer_done(void *data)
> >  {
> >  	struct iio_dev *indio_dev = data;
> > +	struct stm32_adc *adc = iio_priv(indio_dev);
> > +	int residue = stm32_adc_dma_residue(adc);
> > +
> > +	/*
> > +	 * In DMA mode the trigger services of IIO are not used
> > +	 * (e.g. no call to iio_trigger_poll).
> > +	 * Calling irq handler associated to the hardware trigger is not
> > +	 * relevant as the conversions have already been done. Data
> > +	 * transfers are performed directly in DMA callback instead.
> > +	 * This implementation avoids to call trigger irq handler that
> > +	 * may sleep, in an atomic context (DMA irq handler context).
> > +	 */
> > +	dev_dbg(&indio_dev->dev, "%s bufi=%d\n", __func__, adc->bufi);
> >  
> > -	iio_trigger_poll_chained(indio_dev->trig);
> > +	while (residue >= indio_dev->scan_bytes) {
> > +		u16 *buffer = (u16 *)&adc->rx_buf[adc->bufi];
> > +
> > +		iio_push_to_buffers(indio_dev, buffer);
> > +
> > +		residue -= indio_dev->scan_bytes;
> > +		adc->bufi += indio_dev->scan_bytes;
> > +		if (adc->bufi >= adc->rx_buf_sz)
> > +			adc->bufi = 0;
> > +	}
> >  }
> >  
> >  static int stm32_adc_dma_start(struct iio_dev *indio_dev)
> > @@ -1845,6 +1867,7 @@ static int stm32_adc_probe(struct platform_device *pdev)
> >  {
> >  	struct iio_dev *indio_dev;
> >  	struct device *dev = &pdev->dev;
> > +	irqreturn_t (*handler)(int irq, void *p) = NULL;
> >  	struct stm32_adc *adc;
> >  	int ret;
> >  
> > @@ -1911,9 +1934,11 @@ static int stm32_adc_probe(struct platform_device *pdev)
> >  	if (ret < 0)
> >  		return ret;
> >  
> > +	if (!adc->dma_chan)
> > +		handler = &stm32_adc_trigger_handler;
> > +
> >  	ret = iio_triggered_buffer_setup(indio_dev,
> > -					 &iio_pollfunc_store_time,
> > -					 &stm32_adc_trigger_handler,
> > +					 &iio_pollfunc_store_time, handler,
> >  					 &stm32_adc_buffer_setup_ops);
> >  	if (ret) {
> >  		dev_err(&pdev->dev, "buffer setup failed\n");
> >   


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-03-15  9:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-09 10:02 [PATCH v2] iio: adc: stm32-adc: fix sleep in atomic context Olivier Moysan
2020-03-09 10:02 ` Olivier Moysan
2020-03-09 10:39 ` Fabrice Gasnier
2020-03-09 10:39   ` Fabrice Gasnier
2020-03-15  9:35   ` Jonathan Cameron [this message]
2020-03-15  9:35     ` Jonathan Cameron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200315093549.20764470@archlinux \
    --to=jic23@kernel.org \
    --cc=alexandre.torgue@st.com \
    --cc=benjamin.gaignard@st.com \
    --cc=fabrice.gasnier@st.com \
    --cc=knaack.h@gmx.de \
    --cc=lars@metafoo.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=olivier.moysan@st.com \
    --cc=pmeerw@pmeerw.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.