From: Felix Fietkau <nbd@openwrt.org>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: netdev@vger.kernel.org, zajec5@gmail.com, hauke@hauke-m.de
Subject: Re: [PATCH v2 4/4] bgmac: fix DMA rx corruption
Date: Sun, 12 Apr 2015 20:46:06 +0200 [thread overview]
Message-ID: <552ABD6E.10000@openwrt.org> (raw)
In-Reply-To: <1428862182.25985.354.camel@edumazet-glaptop2.roam.corp.google.com>
On 2015-04-12 20:09, Eric Dumazet wrote:
> On Sun, 2015-04-12 at 16:22 +0200, Felix Fietkau wrote:
>> The driver needs to inform the hardware about the first invalid (not yet
>> filled) rx slot, by writing its DMA descriptor pointer offset to the
>> BGMAC_DMA_RX_INDEX register.
>>
>> This register was set to a value exceeding the rx ring size, effectively
>> allowing the hardware constant access to the full ring, regardless of
>> which slots are initialized.
>>
>> Fix this by updating the register in bgmac_dma_rx_setup_desc.
>>
>> Signed-off-by: Felix Fietkau <nbd@openwrt.org>
>> ---
>> drivers/net/ethernet/broadcom/bgmac.c | 27 ++++++++++++++++++---------
>> 1 file changed, 18 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
>> index e332de8..67993d7 100644
>> --- a/drivers/net/ethernet/broadcom/bgmac.c
>> +++ b/drivers/net/ethernet/broadcom/bgmac.c
>> @@ -362,6 +362,16 @@ static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac,
>> return 0;
>> }
>>
>> +static void bgmac_dma_rx_update_index(struct bgmac *bgmac,
>> + struct bgmac_dma_ring *ring)
>> +{
>> + dma_wmb();
>> +
>> + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
>> + ring->index_base +
>> + ring->end * sizeof(struct bgmac_dma_desc));
>> +}
>> +
>> static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
>> struct bgmac_dma_ring *ring, int desc_idx)
>> {
>> @@ -380,6 +390,8 @@ static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
>> dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[desc_idx].dma_addr));
>> dma_desc->ctl0 = cpu_to_le32(ctl0);
>> dma_desc->ctl1 = cpu_to_le32(ctl1);
>> +
>> + ring->end = (desc_idx + 1) % BGMAC_RX_RING_SLOTS;
>
> Given the fact that previous driver kind of worked, have you tried not
> doing the modulo at all here ?
The previous driver was causing reproducible DMA corruption issues under
load. My patch fixes this, and I've verified this with hours of stress
testing (previously I could reproduce the issue in minutes).
> ring->end = desc_idx + 1;
>
> It looks like the hardware accepted setting BGMAC_DMA_RX_INDEX to
> ring->index_base + ring->num_slots * sizeof(struct bgmac_dma_desc)
The hardware accepts it, but with that value, it considers all rx slot
entries filled, there's no CPU ownership bit in the descriptor.
According to documentation, that register indicates the first *invalid*
rx descriptor (i.e. one where the CPU hasn't posted a valid buffer yet).
> So apparently the presence of BGMAC_DESC_CTL0_EOT in last rx desc was
> enough to avoid any problem with this.
EOT serves a completely different purpose. It simply indicates the end
of the ring, telling the hardware to go back to the beginning for the
next descriptor.
- Felix
next prev parent reply other threads:[~2015-04-12 18:46 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-12 14:22 [PATCH v2 1/4] bgmac: simplify tx ring index handling Felix Fietkau
2015-04-12 14:22 ` [PATCH v2 2/4] bgmac: leave interrupts disabled as long as there is work to do Felix Fietkau
2015-04-12 14:22 ` [PATCH v2 3/4] bgmac: set received skb headroom to NET_SKB_PAD Felix Fietkau
2015-04-12 14:22 ` [PATCH v2 4/4] bgmac: fix DMA rx corruption Felix Fietkau
2015-04-12 18:09 ` Eric Dumazet
2015-04-12 18:46 ` Felix Fietkau [this message]
2015-04-12 19:04 ` Eric Dumazet
2015-04-12 19:25 ` Felix Fietkau
2015-04-12 20:29 ` Rafał Miłecki
2015-04-12 21:38 ` Felix Fietkau
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=552ABD6E.10000@openwrt.org \
--to=nbd@openwrt.org \
--cc=eric.dumazet@gmail.com \
--cc=hauke@hauke-m.de \
--cc=netdev@vger.kernel.org \
--cc=zajec5@gmail.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 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.