* Re: linux-next: Tree for March 26 (benet) [not found] <20090326190130.54fc6fde.sfr@canb.auug.org.au> @ 2009-03-26 15:46 ` Randy Dunlap 2009-03-26 19:30 ` [PATCH] benet: use do_div() for 64 bit divide Stephen Hemminger 0 siblings, 1 reply; 4+ messages in thread From: Randy Dunlap @ 2009-03-26 15:46 UTC (permalink / raw) To: Stephen Rothwell; +Cc: linux-next, LKML, netdev, linux-drivers Stephen Rothwell wrote: > Hi all, > > Changes since 20090325: on i386 build: drivers/built-in.o: In function `be_worker': be_main.c:(.text+0x827c7): undefined reference to `__udivdi3' be_main.c:(.text+0x8286c): undefined reference to `__udivdi3' Probably one of the called functions (that contains division) is inlined. -- ~Randy ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] benet: use do_div() for 64 bit divide 2009-03-26 15:46 ` linux-next: Tree for March 26 (benet) Randy Dunlap @ 2009-03-26 19:30 ` Stephen Hemminger 2009-03-26 20:10 ` Randy Dunlap 0 siblings, 1 reply; 4+ messages in thread From: Stephen Hemminger @ 2009-03-26 19:30 UTC (permalink / raw) To: Randy Dunlap, David S. Miller, Sathya Perla Cc: Stephen Rothwell, linux-next, netdev, linux-drivers 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 <shemminger@vyatta.com> --- 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 <asm/div64.h> 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; } ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] benet: use do_div() for 64 bit divide 2009-03-26 19:30 ` [PATCH] benet: use do_div() for 64 bit divide Stephen Hemminger @ 2009-03-26 20:10 ` Randy Dunlap 2009-03-27 7:26 ` David Miller 0 siblings, 1 reply; 4+ messages in thread From: Randy Dunlap @ 2009-03-26 20:10 UTC (permalink / raw) To: Stephen Hemminger Cc: David S. Miller, Sathya Perla, Stephen Rothwell, linux-next, netdev, linux-drivers 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 <shemminger@vyatta.com> Acked-by: Randy Dunlap <randy.dunlap@oracle.com> # 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 <asm/div64.h> > > 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 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] benet: use do_div() for 64 bit divide 2009-03-26 20:10 ` Randy Dunlap @ 2009-03-27 7:26 ` David Miller 0 siblings, 0 replies; 4+ messages in thread From: David Miller @ 2009-03-27 7:26 UTC (permalink / raw) To: randy.dunlap; +Cc: shemminger, sathyap, sfr, linux-next, netdev, linux-drivers From: Randy Dunlap <randy.dunlap@oracle.com> Date: Thu, 26 Mar 2009 13:10:11 -0700 > 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 <shemminger@vyatta.com> > > Acked-by: Randy Dunlap <randy.dunlap@oracle.com> # and Tested-by: (built) Applied, thanks everyone. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-03-27 7:26 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20090326190130.54fc6fde.sfr@canb.auug.org.au>
2009-03-26 15:46 ` linux-next: Tree for March 26 (benet) Randy Dunlap
2009-03-26 19:30 ` [PATCH] benet: use do_div() for 64 bit divide Stephen Hemminger
2009-03-26 20:10 ` Randy Dunlap
2009-03-27 7:26 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).