* [PATCH net-next 0/4] r8169: series with improvements to rtl_tx
@ 2020-03-06 22:53 Heiner Kallweit
2020-03-06 22:54 ` [PATCH net-next 1/4] r8169: convert while to for loop in rtl_tx Heiner Kallweit
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-03-06 22:53 UTC (permalink / raw)
To: Realtek linux nic maintainers, David Miller; +Cc: netdev@vger.kernel.org
This series includes few improvements to rtl_tx().
Heiner Kallweit (4):
r8169: convert while to for loop in rtl_tx
r8169: ensure tx_skb is fully reset after calling rtl8169_unmap_tx_skb
r8169: simplify usage of rtl8169_unmap_tx_skb
r8169: remove now unneeded barrier in rtl_tx
drivers/net/ethernet/realtek/r8169_main.c | 46 ++++++++---------------
1 file changed, 16 insertions(+), 30 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next 1/4] r8169: convert while to for loop in rtl_tx
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
@ 2020-03-06 22:54 ` Heiner Kallweit
2020-03-06 22:55 ` [PATCH net-next 2/4] r8169: ensure tx_skb is fully reset after calling rtl8169_unmap_tx_skb Heiner Kallweit
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-03-06 22:54 UTC (permalink / raw)
To: Realtek linux nic maintainers, David Miller; +Cc: netdev@vger.kernel.org
Slightly improve the code by converting this while to a for loop.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169_main.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 4495a3cf9..c0999efa0 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4392,9 +4392,8 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
dirty_tx = tp->dirty_tx;
smp_rmb();
- tx_left = tp->cur_tx - dirty_tx;
- while (tx_left > 0) {
+ for (tx_left = tp->cur_tx - dirty_tx; tx_left > 0; tx_left--) {
unsigned int entry = dirty_tx % NUM_TX_DESC;
struct ring_info *tx_skb = tp->tx_skb + entry;
u32 status;
@@ -4418,7 +4417,6 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
tx_skb->skb = NULL;
}
dirty_tx++;
- tx_left--;
}
if (tp->dirty_tx != dirty_tx) {
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 2/4] r8169: ensure tx_skb is fully reset after calling rtl8169_unmap_tx_skb
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
2020-03-06 22:54 ` [PATCH net-next 1/4] r8169: convert while to for loop in rtl_tx Heiner Kallweit
@ 2020-03-06 22:55 ` Heiner Kallweit
2020-03-06 22:56 ` [PATCH net-next 3/4] r8169: simplify usage of rtl8169_unmap_tx_skb Heiner Kallweit
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-03-06 22:55 UTC (permalink / raw)
To: Realtek linux nic maintainers, David Miller; +Cc: netdev@vger.kernel.org
So far tx_skb->skb is the only member of the two structs that is not
reset. Make understanding the code easier by resetting both structs
completely in rtl8169_unmap_tx_skb.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169_main.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index c0999efa0..359f029a7 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -3976,11 +3976,8 @@ static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
unsigned int len = tx_skb->len;
dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
-
- desc->opts1 = 0x00;
- desc->opts2 = 0x00;
- desc->addr = 0x00;
- tx_skb->len = 0;
+ memset(desc, 0, sizeof(*desc));
+ memset(tx_skb, 0, sizeof(*tx_skb));
}
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
@@ -3998,10 +3995,8 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
tp->TxDescArray + entry);
- if (skb) {
+ if (skb)
dev_consume_skb_any(skb);
- tx_skb->skb = NULL;
- }
}
}
}
@@ -4396,6 +4391,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
for (tx_left = tp->cur_tx - dirty_tx; tx_left > 0; tx_left--) {
unsigned int entry = dirty_tx % NUM_TX_DESC;
struct ring_info *tx_skb = tp->tx_skb + entry;
+ struct sk_buff *skb = tx_skb->skb;
u32 status;
status = le32_to_cpu(tp->TxDescArray[entry].opts1);
@@ -4410,11 +4406,10 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
tp->TxDescArray + entry);
- if (tx_skb->skb) {
+ if (skb) {
pkts_compl++;
- bytes_compl += tx_skb->skb->len;
- napi_consume_skb(tx_skb->skb, budget);
- tx_skb->skb = NULL;
+ bytes_compl += skb->len;
+ napi_consume_skb(skb, budget);
}
dirty_tx++;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 3/4] r8169: simplify usage of rtl8169_unmap_tx_skb
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
2020-03-06 22:54 ` [PATCH net-next 1/4] r8169: convert while to for loop in rtl_tx Heiner Kallweit
2020-03-06 22:55 ` [PATCH net-next 2/4] r8169: ensure tx_skb is fully reset after calling rtl8169_unmap_tx_skb Heiner Kallweit
@ 2020-03-06 22:56 ` Heiner Kallweit
2020-03-06 22:58 ` [PATCH net-next 4/4] r8169: remove now unneeded barrier in rtl_tx Heiner Kallweit
2020-03-10 2:07 ` [PATCH net-next 0/4] r8169: series with improvements to rtl_tx David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-03-06 22:56 UTC (permalink / raw)
To: Realtek linux nic maintainers, David Miller; +Cc: netdev@vger.kernel.org
Simplify the parameters taken by rtl8169_unmap_tx_skb, this makes
usage of this function easier to read and understand.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169_main.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 359f029a7..8a707d67c 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -3970,12 +3970,13 @@ static int rtl8169_init_ring(struct rtl8169_private *tp)
return rtl8169_rx_fill(tp);
}
-static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
- struct TxDesc *desc)
+static void rtl8169_unmap_tx_skb(struct rtl8169_private *tp, unsigned int entry)
{
- unsigned int len = tx_skb->len;
+ struct ring_info *tx_skb = tp->tx_skb + entry;
+ struct TxDesc *desc = tp->TxDescArray + entry;
- dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
+ dma_unmap_single(tp_to_dev(tp), le64_to_cpu(desc->addr), tx_skb->len,
+ DMA_TO_DEVICE);
memset(desc, 0, sizeof(*desc));
memset(tx_skb, 0, sizeof(*tx_skb));
}
@@ -3993,8 +3994,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
if (len) {
struct sk_buff *skb = tx_skb->skb;
- rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
- tp->TxDescArray + entry);
+ rtl8169_unmap_tx_skb(tp, entry);
if (skb)
dev_consume_skb_any(skb);
}
@@ -4303,7 +4303,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
return NETDEV_TX_OK;
err_dma_1:
- rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
+ rtl8169_unmap_tx_skb(tp, entry);
err_dma_0:
dev_kfree_skb_any(skb);
dev->stats.tx_dropped++;
@@ -4390,8 +4390,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
for (tx_left = tp->cur_tx - dirty_tx; tx_left > 0; tx_left--) {
unsigned int entry = dirty_tx % NUM_TX_DESC;
- struct ring_info *tx_skb = tp->tx_skb + entry;
- struct sk_buff *skb = tx_skb->skb;
+ struct sk_buff *skb = tp->tx_skb[entry].skb;
u32 status;
status = le32_to_cpu(tp->TxDescArray[entry].opts1);
@@ -4404,8 +4403,8 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
*/
dma_rmb();
- rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
- tp->TxDescArray + entry);
+ rtl8169_unmap_tx_skb(tp, entry);
+
if (skb) {
pkts_compl++;
bytes_compl += skb->len;
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 4/4] r8169: remove now unneeded barrier in rtl_tx
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
` (2 preceding siblings ...)
2020-03-06 22:56 ` [PATCH net-next 3/4] r8169: simplify usage of rtl8169_unmap_tx_skb Heiner Kallweit
@ 2020-03-06 22:58 ` Heiner Kallweit
2020-03-10 2:07 ` [PATCH net-next 0/4] r8169: series with improvements to rtl_tx David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-03-06 22:58 UTC (permalink / raw)
To: Realtek linux nic maintainers, David Miller; +Cc: netdev@vger.kernel.org
Until ae84bc187337 ("r8169: don't use bit LastFrag in tx descriptor
after send") we used to access another bit in the descriptor, therefore
it seems the barrier was needed. Since this commit DescOwn is the
only bit we're interested in, so the barrier isn't needed any longer.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169_main.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 8a707d67c..181b35b78 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4397,12 +4397,6 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
if (status & DescOwn)
break;
- /* This barrier is needed to keep us from reading
- * any other fields out of the Tx descriptor until
- * we know the status of DescOwn
- */
- dma_rmb();
-
rtl8169_unmap_tx_skb(tp, entry);
if (skb) {
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 0/4] r8169: series with improvements to rtl_tx
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
` (3 preceding siblings ...)
2020-03-06 22:58 ` [PATCH net-next 4/4] r8169: remove now unneeded barrier in rtl_tx Heiner Kallweit
@ 2020-03-10 2:07 ` David Miller
4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2020-03-10 2:07 UTC (permalink / raw)
To: hkallweit1; +Cc: nic_swsd, netdev
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Fri, 6 Mar 2020 23:53:43 +0100
> This series includes few improvements to rtl_tx().
Series applied, thanks Heiner.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-03-10 2:07 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-06 22:53 [PATCH net-next 0/4] r8169: series with improvements to rtl_tx Heiner Kallweit
2020-03-06 22:54 ` [PATCH net-next 1/4] r8169: convert while to for loop in rtl_tx Heiner Kallweit
2020-03-06 22:55 ` [PATCH net-next 2/4] r8169: ensure tx_skb is fully reset after calling rtl8169_unmap_tx_skb Heiner Kallweit
2020-03-06 22:56 ` [PATCH net-next 3/4] r8169: simplify usage of rtl8169_unmap_tx_skb Heiner Kallweit
2020-03-06 22:58 ` [PATCH net-next 4/4] r8169: remove now unneeded barrier in rtl_tx Heiner Kallweit
2020-03-10 2:07 ` [PATCH net-next 0/4] r8169: series with improvements to rtl_tx David Miller
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).