From: Andri Yngvason <andri.yngvason@marel.com>
To: linux-can@vger.kernel.org
Cc: wg@grandegger.com, mkl@pengutronix.de,
s.grosjean@peak-system.com, hrafnkell.eiriksson@marel.com,
haukur.hafsteinsson@marel.com
Subject: Re: peak_pci: TX Frame Loss
Date: Wed, 2 Dec 2015 18:09:37 +0000 [thread overview]
Message-ID: <20151202180937.19023.96078@maxwell.marel.net> (raw)
In-Reply-To: <20151118145121.32487.38169@maxwell.marel.net>
Quoting Andri Yngvason (2015-11-18 14:51:21)
[...]
> We've been experiencing frame loss on transmission in the peak_pci netdev
> driver.
[...]
Hi all,
I think I've figured it out.
I wrote two programs: One that sends out bursts of can frames with the same
can_id but increasing data[0] and one that listens to can frames and stops
ftrace when a frame is missing. These programs also place ftrace markers.
See link below [1].
In cases where frames were lost sja1000_write_cmdreg() is called from two cores
at the same time.
7) | sja1000_interrupt [sja1001]() {
[...]
3) | raw_sendmsg [can_raw]() {
[...]
3) | dev_hard_start_xmit() {
3) | sja1000_start_xmit [sja1000]() {
7) 2.071 us | peak_pci_read_reg [peak_pci]();
3) 3.901 us | peak_pci_read_reg [peak_pci]();
[...]
7) 2.066 us | peak_pci_read_reg [peak_pci]();
3) 0.139 us | can_put_echo_skb [can_dev]();
3) | sja1000_write_cmdreg [sja1000]() {
start_xmit acquires spin lock:
3) 0.050 us | _raw_spin_lock_irqsave();
start_xmit writes to command register:
3) 0.043 us | peak_pci_write_reg [peak_pci]();
3) 2.516 us | peak_pci_read_reg [peak_pci]();
7) | sja1000_write_cmdreg [sja1000]() {
sja1000_interrupt from other thread stalls on spin lock:
7) 2.035 us | _raw_spin_lock_irqsave();
start_xmit releases spin lock:
3) 0.083 us | _raw_spin_unlock_irqrestore();
sja1000_interrupt continues and writes to command register:
7) 0.057 us | peak_pci_write_reg [peak_pci]();
3) 4.456 us | }
3) + 21.813 us | }
7) 1.657 us | peak_pci_read_reg [peak_pci]();
3) + 22.632 us | }
3) 0.044 us | _raw_spin_lock();
3) + 26.822 us | }
3) 0.105 us | __local_bh_enable_ip();
3) + 30.474 us | }
3) + 30.985 us | }
sja1000_interrupt releases spin lock:
7) 0.072 us | _raw_spin_unlock_irqrestore();
As far as locking goes, this looks OK, but maybe the sja1000 (or peak's FPGA
implementation thereof) hasn't settled after writing to the command register?
I tried adding a delay to test my theory:
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
index f968d1e..b5115c2 100644
--- a/drivers/net/can/sja1000/sja1000.c
+++ b/drivers/net/can/sja1000/sja1000.c
@@ -93,6 +93,7 @@ static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val)
spin_lock_irqsave(&priv->cmdreg_lock, flags);
priv->write_reg(priv, SJA1000_CMR, val);
priv->read_reg(priv, SJA1000_SR);
+ udelay(10);
spin_unlock_irqrestore(&priv->cmdreg_lock, flags);
}
I've been running the test programs for a while now and I haven't lost a frame
yet, so this delay seems to solve the problem.
Do you guys think that this is an acceptable solution?
Should it maybe reside within peak_pci.c instead?
Regards,
Andri
[1] https://gist.github.com/any1/7062000f8c02b9b27bf6
next prev parent reply other threads:[~2015-12-02 18:26 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-18 14:51 peak_pci: TX Frame Loss Andri Yngvason
2015-11-19 8:38 ` Stephane Grosjean
2015-11-19 10:12 ` Andri Yngvason
2015-12-02 18:09 ` Andri Yngvason [this message]
2015-12-02 19:19 ` Oliver Hartkopp
2015-12-03 6:37 ` Oliver Hartkopp
2015-12-03 11:23 ` Andri Yngvason
2015-12-03 11:44 ` Marc Kleine-Budde
2015-12-08 10:21 ` Stephane Grosjean
2015-12-08 10:50 ` Andri Yngvason
2015-12-08 11:42 ` Stephane Grosjean
2015-12-08 12:24 ` Andri Yngvason
2015-12-08 14:12 ` [BULK]Re: " Stephane Grosjean
2015-12-22 8:13 ` Stephane Grosjean
2015-12-22 11:51 ` Andri Yngvason
2015-12-03 16:37 ` Stephane Grosjean
2015-12-03 8:20 ` Marc Kleine-Budde
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=20151202180937.19023.96078@maxwell.marel.net \
--to=andri.yngvason@marel.com \
--cc=haukur.hafsteinsson@marel.com \
--cc=hrafnkell.eiriksson@marel.com \
--cc=linux-can@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=s.grosjean@peak-system.com \
--cc=wg@grandegger.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).