amd-xgbe: Add a check for an skb in the timestamp path
authorLendacky, Thomas <Thomas.Lendacky@amd.com>
Wed, 28 Jun 2017 18:41:58 +0000 (13:41 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Jun 2017 19:14:16 +0000 (15:14 -0400)
Spurious Tx timestamp interrupts can cause an oops in the Tx timestamp
processing function if a Tx timestamp skb is NULL. Add a check to insure
a Tx timestamp skb is present before attempting to use it.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-drv.c

index a934bd5d05075308f6087c5a4aaa0e099251fda3..20685100ce12d3370d68c1572c896b18a7fea67c 100644 (file)
@@ -1212,6 +1212,10 @@ static void xgbe_tx_tstamp(struct work_struct *work)
        u64 nsec;
        unsigned long flags;
 
+       spin_lock_irqsave(&pdata->tstamp_lock, flags);
+       if (!pdata->tx_tstamp_skb)
+               goto unlock;
+
        if (pdata->tx_tstamp) {
                nsec = timecounter_cyc2time(&pdata->tstamp_tc,
                                            pdata->tx_tstamp);
@@ -1223,8 +1227,9 @@ static void xgbe_tx_tstamp(struct work_struct *work)
 
        dev_kfree_skb_any(pdata->tx_tstamp_skb);
 
-       spin_lock_irqsave(&pdata->tstamp_lock, flags);
        pdata->tx_tstamp_skb = NULL;
+
+unlock:
        spin_unlock_irqrestore(&pdata->tstamp_lock, flags);
 }