From 2f194eb16021b969f2f14d984f4e802858d38a09 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 5 Dec 2017 14:40:32 +0100 Subject: [PATCH] ar71xx: use global timestamp for hang check Shrink the size of struct ag71xx_buf to 8 bytes, which improves cache footprint Signed-off-by: Felix Fietkau --- .../files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h | 5 +++-- .../drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h index 5ead6b316a..38dcc915f9 100644 --- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h +++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h @@ -100,9 +100,8 @@ struct ag71xx_buf { }; union { dma_addr_t dma_addr; - unsigned long timestamp; + unsigned int len; }; - unsigned int len; }; struct ag71xx_ring { @@ -170,6 +169,8 @@ struct ag71xx { struct napi_struct napi; u32 msg_enable; + unsigned long timestamp; + /* * From this point onwards we're not looking at per-packet fields. */ diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index 3e7bfb7074..40fd75397e 100644 --- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -807,7 +807,7 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb, i = (ring->curr + n - 1) & ring_mask; ring->buf[i].len = skb->len; ring->buf[i].skb = skb; - ring->buf[i].timestamp = jiffies; + ag->timestamp = jiffies; netdev_sent_queue(dev, skb->len); @@ -917,11 +917,11 @@ static void ag71xx_restart_work_func(struct work_struct *work) rtnl_unlock(); } -static bool ag71xx_check_dma_stuck(struct ag71xx *ag, unsigned long timestamp) +static bool ag71xx_check_dma_stuck(struct ag71xx *ag) { u32 rx_sm, tx_sm, rx_fd; - if (likely(time_before(jiffies, timestamp + HZ/10))) + if (likely(time_before(jiffies, ag->timestamp + HZ/10))) return false; if (!netif_carrier_ok(ag->dev)) @@ -960,7 +960,7 @@ static int ag71xx_tx_packets(struct ag71xx *ag, bool flush) if (!flush && !ag71xx_desc_empty(desc)) { if (pdata->is_ar724x && - ag71xx_check_dma_stuck(ag, ring->buf[i].timestamp)) { + ag71xx_check_dma_stuck(ag)) { schedule_delayed_work(&ag->restart_work, HZ / 2); dma_stuck = true; } -- 2.30.2