Skip to content

Commit

Permalink
dp83640: Delay scheduled work.
Browse files Browse the repository at this point in the history
Currently rx_timestamp_work reschedules itself as a regular workqueue item,
effectively causing it run constantly as long as there are packets left in
the queue. Fix by using delayed workqueue items, limiting it to run only
every two jiffies.

Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
ssorensen authored and davem330 committed Nov 3, 2015
1 parent 539e44d commit 4b06325
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions drivers/net/phy/dp83640.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
/* phyter seems to miss the mark by 16 ns */
#define ADJTIME_FIX 16

#define SKB_TIMESTAMP_TIMEOUT 2 /* jiffies */

#if defined(__BIG_ENDIAN)
#define ENDIAN_FLAG 0
#elif defined(__LITTLE_ENDIAN)
Expand Down Expand Up @@ -111,7 +113,7 @@ struct dp83640_private {
struct list_head list;
struct dp83640_clock *clock;
struct phy_device *phydev;
struct work_struct ts_work;
struct delayed_work ts_work;
int hwts_tx_en;
int hwts_rx_en;
int layer;
Expand Down Expand Up @@ -285,7 +287,7 @@ static void phy2rxts(struct phy_rxts *p, struct rxts *rxts)
rxts->seqid = p->seqid;
rxts->msgtype = (p->msgtype >> 12) & 0xf;
rxts->hash = p->msgtype & 0x0fff;
rxts->tmo = jiffies + 2;
rxts->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
}

static u64 phy2txts(struct phy_txts *p)
Expand Down Expand Up @@ -1115,7 +1117,7 @@ static int dp83640_probe(struct phy_device *phydev)
goto no_memory;

dp83640->phydev = phydev;
INIT_WORK(&dp83640->ts_work, rx_timestamp_work);
INIT_DELAYED_WORK(&dp83640->ts_work, rx_timestamp_work);

INIT_LIST_HEAD(&dp83640->rxts);
INIT_LIST_HEAD(&dp83640->rxpool);
Expand Down Expand Up @@ -1162,7 +1164,7 @@ static void dp83640_remove(struct phy_device *phydev)
return;

enable_status_frames(phydev, false);
cancel_work_sync(&dp83640->ts_work);
cancel_delayed_work_sync(&dp83640->ts_work);

skb_queue_purge(&dp83640->rx_queue);
skb_queue_purge(&dp83640->tx_queue);
Expand Down Expand Up @@ -1356,7 +1358,7 @@ static int dp83640_hwtstamp(struct phy_device *phydev, struct ifreq *ifr)
static void rx_timestamp_work(struct work_struct *work)
{
struct dp83640_private *dp83640 =
container_of(work, struct dp83640_private, ts_work);
container_of(work, struct dp83640_private, ts_work.work);
struct sk_buff *skb;

/* Deliver expired packets. */
Expand All @@ -1373,7 +1375,7 @@ static void rx_timestamp_work(struct work_struct *work)
}

if (!skb_queue_empty(&dp83640->rx_queue))
schedule_work(&dp83640->ts_work);
schedule_delayed_work(&dp83640->ts_work, SKB_TIMESTAMP_TIMEOUT);
}

static bool dp83640_rxtstamp(struct phy_device *phydev,
Expand Down Expand Up @@ -1412,9 +1414,11 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,

if (!shhwtstamps) {
skb_info->ptp_type = type;
skb_info->tmo = jiffies + 2;
skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
skb_queue_tail(&dp83640->rx_queue, skb);
schedule_work(&dp83640->ts_work);
schedule_delayed_work(&dp83640->ts_work, SKB_TIMESTAMP_TIMEOUT);
} else {
netif_rx_ni(skb);
}

return true;
Expand Down

0 comments on commit 4b06325

Please sign in to comment.