From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
To: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>,
"REE dirk.behme@de.bosch.com" <dirk.behme@de.bosch.com>,
"linux-renesas-soc@vger.kernel.org"
<linux-renesas-soc@vger.kernel.org>
Cc: "Shashikant.Suguni@in.bosch.com" <Shashikant.Suguni@in.bosch.com>
Subject: RE: [PATCH v2] ravb: On timeout disable IRQs to stop processing
Date: Fri, 22 May 2020 11:58:45 +0000 [thread overview]
Message-ID: <TY2PR01MB3692A45D81920C73C38E0E2CD8B40@TY2PR01MB3692.jpnprd01.prod.outlook.com> (raw)
In-Reply-To: <TY2PR01MB36925ABE9432E3F15EA778E2D8B40@TY2PR01MB3692.jpnprd01.prod.outlook.com>
Hi again and again,
> From: Yoshihiro Shimoda, Sent: Friday, May 22, 2020 8:17 PM
>
> Hi again,
>
> > From: Yoshihiro Shimoda, Sent: Friday, May 22, 2020 2:58 PM
> >
> > Hello Sergei-san,
> >
> > > From: Sergei Shtylyov, Sent: Monday, May 18, 2020 5:45 PM
> > >
> > > On 18.05.2020 7:54, Dirk Behme wrote:
> > >
> > > > Analyzing [1] it seems there is a race condition where ravb_start_xmit()
> > > > can be called from interrupt while tx skbuffs are being torn down in
> > > > the scheduled timeout handling. The actual timeout work is done in
> > > > ravb_tx_timeout_work() during which the tx skbuffs are torn down via
> > > > invocations of ravb_ring_free(). But there seems to be no flag to tell
> > > > the driver it is shutting down so it continues to use the ring buffer
> > > > when it should not.
> > > >
> > > > Fix this by disabling the interrupts in the timeout handler.
> > >
> > > Hm, given that we stop all TX queues prior to tearing down the buffers,
> > > it is somewhat strange that you see the driver's send path called...
> > > But disabling the interrupts seems the Right Thing anyways...
> >
> > I didn't reproduce this issue and I didn't know the root cause yet.
> > But, I'm feeling to strange. Especially, "ravb_start_xmit() can be called from interrupt".
> > I didn't find where ravb_start_xmit() can be called from interrupt for now.
> >
> > By the way, I'm thinking the following message is related to the issue.
> > > > ravb e6800000.ethernet ethernet: failed to switch device to config mode
> >
> > The ravb_config() output the message if failed. And, ravb_tx_timeout_work()
> > calls ravb_config() via ravb_stop_dma() and ravb_dmac_init().
> > ---
> > ravb_tx_timeout_work() {
> > ravb_stop_dma() // call ravb_config()
> >
> > ravb_ring_free() // *1
> > <snip>
> > ravb_dmac_init() // call ravb_config()
> > <snip>
> > }
> >
> > ravb_dmac_init()
> > {
> > <snip>
> > error = ravb_config() // "failed to switch device to config modes" here and -ETIMEDOUT
> > if (error)
> > return error // *2
> > ravb_ring_init() // *3
> > <snip>
> > }
> > --
> >
> > If ravb_config() failed at the *2, since ravb_ring_init() was not called,
> > any descriptors were not allocated and then the issue should happen.
> > Note that according to the datasheet, the controller cannot change the
> > mode from "Operation" to Configuration" when the controller is doing
> > TX or RX.
>
> I'm afraid but, this scenario seems wrong because if the controller
> enters "Configuration" once, the driver needs to change the mode to
> "Operation" for starting any transfer again.
I realized that ravb_stop_dma() is possible to return without ravb_rcv_snd_disable() and
ravb_config() calling if TCCR or CSR register indicates transmit is started.
> > I don't know why the first ravb_config() doesn't fail for now.
> > But, my scenario is one of functions below enables the TX and RX
> > by calling ravb_rcv_snd_enable():
> > - ravb_emac_interrupt_unlocked() ... if ESCR_LCHNG && !no_avb_link && PSR_LMON
> > - ravb_adjust_link() ... if no_avb_link && phydev->link
> > - ravb_set_rx_csum() ... if enabling NETIF_F_RXCSUM
In such the case (ravb_stop_dma() returns without any message),
I think my scenario is still alive without any these functions calling
because ravb_rcv_snd_disable() is not called.
I'll check the TCCR and CSR registers in next week.
Best regards,
Yoshihiro Shimoda
next prev parent reply other threads:[~2020-05-22 11:58 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-18 4:54 [PATCH v2] ravb: On timeout disable IRQs to stop processing Dirk Behme
2020-05-18 5:12 ` Shashikant Suguni (RBEI/ECF1)
2020-05-18 8:36 ` Sergei Shtylyov
2020-05-28 8:12 ` Behme Dirk (CM/ESO2)
2020-05-18 8:44 ` Sergei Shtylyov
2020-05-22 5:57 ` Yoshihiro Shimoda
2020-05-22 11:16 ` Yoshihiro Shimoda
2020-05-22 11:58 ` Yoshihiro Shimoda [this message]
2020-05-26 9:51 ` Yoshihiro Shimoda
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=TY2PR01MB3692A45D81920C73C38E0E2CD8B40@TY2PR01MB3692.jpnprd01.prod.outlook.com \
--to=yoshihiro.shimoda.uh@renesas.com \
--cc=Shashikant.Suguni@in.bosch.com \
--cc=dirk.behme@de.bosch.com \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=sergei.shtylyov@cogentembedded.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).