Message ID | 20150409214405.27465.51380.stgit@gmw-smvitp108.amr.corp.intel.com |
---|---|
State | Accepted |
Delegated to: | Jeff Kirsher |
Headers | show |
On 04/09/2015 02:45 PM, Jeff Kirsher wrote: > We were using s64 for lat_ns (latency nano-second value) since in > our calculations a negative value could be a resultant. For negative > values, we then assign lat_ns to be zero, so the value passed to > do_div() was never negative, but do_div() expects the argument type > to be u64, so do a cast to resolve a compile warning seen on > PowerPC. > > CC: Yanjiang Jin <yanjiang.jin@windriver.com> > CC: Yanir Lubetkin <yanirx.lubetkin@intel.com> > Reported-by: Yanjiang Jin <yanjiang.jin@windriver.com> > Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> > --- > v2: fixed the patch to not use a cast to resolve the PowerPC compile > warning > --- > drivers/net/ethernet/intel/e1000e/ich8lan.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c > index 9d81c03..7053863 100644 > --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c > +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c > @@ -1015,7 +1015,7 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) > u16 max_snoop, max_nosnoop; > u16 max_ltr_enc; /* max LTR latency encoded */ > s64 lat_ns; /* latency (ns) */ > - s64 value; > + u64 value; > u32 rxa; > > if (!hw->adapter->max_frame_size) { > @@ -1042,12 +1042,13 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) > */ > lat_ns = ((s64)rxa * 1024 - > (2 * (s64)hw->adapter->max_frame_size)) * 8 * 1000; > - if (lat_ns < 0) > - lat_ns = 0; > - else > - do_div(lat_ns, speed); > + if (lat_ns < 0) { > + value = 0; > + } else { > + value = lat_ns; > + do_div(value, speed); > + } > > - value = lat_ns; > while (value > PCI_LTR_VALUE_MASK) { > scale++; > value = DIV_ROUND_UP(value, (1 << 5)); Honestly the whole signed/unsigned thing is kind of a waste anyway. You could probably rewrite it to something like this and drop lat_ns entirely. rxa *= 512; value = (rxa > hw->adapter->max_frame_size) ? (rxa - hw->adapter->max_frame_size) * (16000 / speed) : 0; That should give you the same result without any need for the do_div or the signed values. - Alex
> From: Intel-wired-lan [mailto:intel-wired-lan-bounces@lists.osuosl.org] On > Behalf Of Alexander Duyck > Sent: Thursday, April 09, 2015 3:45 PM > To: Kirsher, Jeffrey T; intel-wired-lan@lists.osuosl.org > Cc: david.laight@aculab.com; Jin, Yanjiang (Wind River) > Subject: Re: [Intel-wired-lan] [net-next v2] e1000e: fix call to do_div() > to use u64 arg > > > > On 04/09/2015 02:45 PM, Jeff Kirsher wrote: > > We were using s64 for lat_ns (latency nano-second value) since in > > our calculations a negative value could be a resultant. For negative > > values, we then assign lat_ns to be zero, so the value passed to > > do_div() was never negative, but do_div() expects the argument type > > to be u64, so do a cast to resolve a compile warning seen on > > PowerPC. > > > > CC: Yanjiang Jin <yanjiang.jin@windriver.com> > > CC: Yanir Lubetkin <yanirx.lubetkin@intel.com> > > Reported-by: Yanjiang Jin <yanjiang.jin@windriver.com> > > Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> > > --- > > v2: fixed the patch to not use a cast to resolve the PowerPC compile > > warning > > --- > > drivers/net/ethernet/intel/e1000e/ich8lan.c | 13 +++++++------ > > 1 file changed, 7 insertions(+), 6 deletions(-) <snip> > > Honestly the whole signed/unsigned thing is kind of a waste anyway. You > could probably rewrite it to something like this and drop lat_ns entirely. > > rxa *= 512; > value = (rxa > hw->adapter->max_frame_size) ? > (rxa - hw->adapter->max_frame_size) * (16000 / speed) : 0; > > That should give you the same result without any need for the do_div or > the signed values. > > - Alex Anyone want to take a stab at striking out the signed / unsigned thing per Alex's suggestion? Meanwhile I've run tons of tests with this in the queue and don't want to old things up, so... Tested-by: Aaron Brown <aaron.f.brown@intel.com> > _______________________________________________ > Intel-wired-lan mailing list > Intel-wired-lan@lists.osuosl.org > http://lists.osuosl.org/mailman/listinfo/intel-wired-lan
On Mon, 2015-04-20 at 20:15 -0700, Brown, Aaron F wrote: > > > > Honestly the whole signed/unsigned thing is kind of a waste anyway. > You > > could probably rewrite it to something like this and drop lat_ns > entirely. > > > > rxa *= 512; > > value = (rxa > hw->adapter->max_frame_size) ? > > (rxa - hw->adapter->max_frame_size) * (16000 / speed) : 0; > > > > That should give you the same result without any need for the do_div > or > > the signed values. > > > > - Alex > > Anyone want to take a stab at striking out the signed / unsigned thing > per Alex's suggestion? > > Meanwhile I've run tons of tests with this in the queue and don't want > to old things up, so... > > Tested-by: Aaron Brown <aaron.f.brown@intel.com> Yeah, I will be working on a follow on patch to implement Alex's suggestions. For now, I wanted to go forward with this change to resolve the compile warning. I should have a patch later this week to implement Alex's suggestions, unless Yanir gets to it before me. :-)
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index 9d81c03..7053863 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c @@ -1015,7 +1015,7 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) u16 max_snoop, max_nosnoop; u16 max_ltr_enc; /* max LTR latency encoded */ s64 lat_ns; /* latency (ns) */ - s64 value; + u64 value; u32 rxa; if (!hw->adapter->max_frame_size) { @@ -1042,12 +1042,13 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) */ lat_ns = ((s64)rxa * 1024 - (2 * (s64)hw->adapter->max_frame_size)) * 8 * 1000; - if (lat_ns < 0) - lat_ns = 0; - else - do_div(lat_ns, speed); + if (lat_ns < 0) { + value = 0; + } else { + value = lat_ns; + do_div(value, speed); + } - value = lat_ns; while (value > PCI_LTR_VALUE_MASK) { scale++; value = DIV_ROUND_UP(value, (1 << 5));
We were using s64 for lat_ns (latency nano-second value) since in our calculations a negative value could be a resultant. For negative values, we then assign lat_ns to be zero, so the value passed to do_div() was never negative, but do_div() expects the argument type to be u64, so do a cast to resolve a compile warning seen on PowerPC. CC: Yanjiang Jin <yanjiang.jin@windriver.com> CC: Yanir Lubetkin <yanirx.lubetkin@intel.com> Reported-by: Yanjiang Jin <yanjiang.jin@windriver.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- v2: fixed the patch to not use a cast to resolve the PowerPC compile warning --- drivers/net/ethernet/intel/e1000e/ich8lan.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)