From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755992AbbDOCYh (ORCPT ); Tue, 14 Apr 2015 22:24:37 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:50348 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755851AbbDOCYc (ORCPT ); Tue, 14 Apr 2015 22:24:32 -0400 Message-ID: <552DCBD0.5030607@huawei.com> Date: Wed, 15 Apr 2015 10:24:16 +0800 From: Ding Tianhong User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Thomas Gleixner , David Miller CC: , , , , , , Subject: Re: [patch v2] net: hip04: Make tx coalesce timer actually work References: <3040901.Bp3bfgc1te@wuerfel> <20150414.141529.797692010779414843.davem@davemloft.net> In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.22.246] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2015/4/15 3:42, Thomas Gleixner wrote: > The code sets the expiry value of the timer to a relative value and > starts it with hrtimer_start_expires. That's fine, but that only works > once. The timer is started in relative mode, so the expiry value gets > overwritten with the absolut expiry time (now + expiry). > > So once the timer expired, a new call to hrtimer_start_expires results > in an immidiately expired timer, because the expiry value is > already in the past. > > Use the proper mechanisms to (re)start the timer in the intended way. > Acked-by: Ding Tianhong > Signed-off-by: Thomas Gleixner > Cc: "David S. Miller" > Cc: dingtianhong > Cc: Arnd Bergmann > Cc: Zhangfei Gao > Cc: Dan Carpenter > Cc: netdev@vger.kernel.org > --- > drivers/net/ethernet/hisilicon/hip04_eth.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > Index: linux/drivers/net/ethernet/hisilicon/hip04_eth.c > =================================================================== > --- linux.orig/drivers/net/ethernet/hisilicon/hip04_eth.c > +++ linux/drivers/net/ethernet/hisilicon/hip04_eth.c > @@ -413,6 +413,15 @@ out: > return count; > } > > +static void hip04_start_tx_timer(struct hip04_priv *priv) > +{ > + unsigned long ns = priv->tx_coalesce_usecs * NSEC_PER_USEC / 2; > + > + /* allow timer to fire after half the time at the earliest */ > + hrtimer_start_range_ns(&priv->tx_coalesce_timer, ns_to_ktime(ns), > + ns, HRTIMER_MODE_REL); > +} > + > static int hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev) > { > struct hip04_priv *priv = netdev_priv(ndev); > @@ -466,8 +475,7 @@ static int hip04_mac_start_xmit(struct s > } > } else if (!hrtimer_is_queued(&priv->tx_coalesce_timer)) { > /* cleanup not pending yet, start a new timer */ > - hrtimer_start_expires(&priv->tx_coalesce_timer, > - HRTIMER_MODE_REL); > + hip04_start_tx_timer(priv); > } > > return NETDEV_TX_OK; > @@ -549,7 +557,7 @@ done: > /* clean up tx descriptors and start a new timer if necessary */ > tx_remaining = hip04_tx_reclaim(ndev, false); > if (rx < budget && tx_remaining) > - hrtimer_start_expires(&priv->tx_coalesce_timer, HRTIMER_MODE_REL); > + hip04_start_tx_timer(priv); > > return rx; > } > @@ -809,7 +817,6 @@ static int hip04_mac_probe(struct platfo > struct hip04_priv *priv; > struct resource *res; > unsigned int irq; > - ktime_t txtime; > int ret; > > ndev = alloc_etherdev(sizeof(struct hip04_priv)); > @@ -846,9 +853,6 @@ static int hip04_mac_probe(struct platfo > */ > priv->tx_coalesce_frames = TX_DESC_NUM * 3 / 4; > priv->tx_coalesce_usecs = 200; > - /* allow timer to fire after half the time at the earliest */ > - txtime = ktime_set(0, priv->tx_coalesce_usecs * NSEC_PER_USEC / 2); > - hrtimer_set_expires_range(&priv->tx_coalesce_timer, txtime, txtime); > priv->tx_coalesce_timer.function = tx_done; > > priv->map = syscon_node_to_regmap(arg.np); > > . >