From: Felix Fietkau Date: Tue, 5 Dec 2017 13:40:32 +0000 (+0100) Subject: ar71xx: use global timestamp for hang check X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=798497c66e6a67d9dbad096c041e855abe0ee662;p=openwrt%2Fstaging%2F981213.git 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 --- 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 72e6b32c63..47b4c69c4d 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 @@ -816,7 +816,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); @@ -926,11 +926,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)) @@ -969,7 +969,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; }