From mboxrd@z Thu Jan 1 00:00:00 1970 From: Randy Dunlap Subject: Re: [PATCH] benet: use do_div() for 64 bit divide Date: Thu, 26 Mar 2009 13:10:11 -0700 Message-ID: <49CBE123.5030204@oracle.com> References: <20090326190130.54fc6fde.sfr@canb.auug.org.au> <49CBA351.2000007@oracle.com> <20090326123005.34acd9fe@s6510> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: Received: from rcsinet13.oracle.com ([148.87.113.125]:41071 "EHLO rgminet13.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751118AbZCZULH (ORCPT ); Thu, 26 Mar 2009 16:11:07 -0400 In-Reply-To: <20090326123005.34acd9fe@s6510> Sender: linux-next-owner@vger.kernel.org List-ID: To: Stephen Hemminger Cc: "David S. Miller" , Sathya Perla , Stephen Rothwell , linux-next@vger.kernel.org, netdev@vger.kernel.org, linux-drivers@serverengines.com Stephen Hemminger wrote: > The benet driver is doing a 64 bit divide, which is not supported in Linux kernel > on 32 bit architectures. The correct way to do this is to use do_div(). > Compile tested on i386 only. > > Signed-off-by: Stephen Hemminger Acked-by: Randy Dunlap # and Tested-by: (built) Thanks. > --- a/drivers/net/benet/be_main.c 2009-03-25 15:31:35.000000000 -0700 > +++ b/drivers/net/benet/be_main.c 2009-03-26 12:28:21.645388379 -0700 > @@ -16,6 +16,7 @@ > */ > > #include "be.h" > +#include > > MODULE_VERSION(DRV_VER); > MODULE_DEVICE_TABLE(pci, be_dev_ids); > @@ -290,6 +291,17 @@ static struct net_device_stats *be_get_s > return &adapter->stats.net_stats; > } > > +static u32 be_calc_rate(u64 bytes, unsigned long ticks) > +{ > + u64 rate = bytes; > + > + do_div(rate, ticks / HZ); > + rate <<= 3; /* bytes/sec -> bits/sec */ > + do_div(rate, 1000000ul); /* MB/Sec */ > + > + return rate; > +} > + > static void be_tx_rate_update(struct be_adapter *adapter) > { > struct be_drvr_stats *stats = drvr_stats(adapter); > @@ -303,11 +315,9 @@ static void be_tx_rate_update(struct be_ > > /* Update tx rate once in two seconds */ > if ((now - stats->be_tx_jiffies) > 2 * HZ) { > - u32 r; > - r = (stats->be_tx_bytes - stats->be_tx_bytes_prev) / > - ((now - stats->be_tx_jiffies) / HZ); > - r = r / 1000000; /* M bytes/s */ > - stats->be_tx_rate = r * 8; /* M bits/s */ > + stats->be_tx_rate = be_calc_rate(stats->be_tx_bytes > + - stats->be_tx_bytes_prev, > + now - stats->be_tx_jiffies); > stats->be_tx_jiffies = now; > stats->be_tx_bytes_prev = stats->be_tx_bytes; > } > @@ -599,7 +609,6 @@ static void be_rx_rate_update(struct be_ > { > struct be_drvr_stats *stats = drvr_stats(adapter); > ulong now = jiffies; > - u32 rate; > > /* Wrapped around */ > if (time_before(now, stats->be_rx_jiffies)) { > @@ -610,11 +619,10 @@ static void be_rx_rate_update(struct be_ > /* Update the rate once in two seconds */ > if ((now - stats->be_rx_jiffies) < 2 * HZ) > return; > - > - rate = (stats->be_rx_bytes - stats->be_rx_bytes_prev) / > - ((now - stats->be_rx_jiffies) / HZ); > - rate = rate / 1000000; /* MB/Sec */ > - stats->be_rx_rate = rate * 8; /* Mega Bits/Sec */ > + > + stats->be_rx_rate = be_calc_rate(stats->be_rx_bytes > + - stats->be_rx_bytes_prev, > + now - stats->be_rx_jiffies); > stats->be_rx_jiffies = now; > stats->be_rx_bytes_prev = stats->be_rx_bytes; > } > -- ~Randy