Re: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
On Mon, Feb 19, 2018 at 12:19:16PM +, David Laight wrote: > This seems to be somewhat excessive 64bit maths on a 32bit system. > It is more than enough to make timelo/timehi 'unsigned int'. Do you see a difference in the generated code? Thanks, Richard
Re: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
On Mon, Feb 19, 2018 at 12:19:16PM +, David Laight wrote: > This seems to be somewhat excessive 64bit maths on a 32bit system. > It is more than enough to make timelo/timehi 'unsigned int'. Do you see a difference in the generated code? Thanks, Richard
RE: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
From: Colin King > Sent: 16 February 2018 16:55 > > From: Colin Ian King> > The shifting of timehi by 16 bits to the left will be promoted to > a 32 bit signed int and then sign-extended to an u64. If the top bit > of timehi is set then all then all the upper bits of ns end up as also > being set because of the sign-extension. Fix this by making timehi and > timelo u64. Also move the declaration of ns. > > Detected by CoverityScan, CID#1465288 ("Unintended sign extension") > > Fixes: c6fe0ad2c349 ("net: dsa: mv88e6xxx: add rx/tx timestamping support") > Signed-off-by: Colin Ian King > --- > drivers/net/dsa/mv88e6xxx/hwtstamp.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/hwtstamp.c > b/drivers/net/dsa/mv88e6xxx/hwtstamp.c > index b251d534b70d..2149d332dea0 100644 > --- a/drivers/net/dsa/mv88e6xxx/hwtstamp.c > +++ b/drivers/net/dsa/mv88e6xxx/hwtstamp.c > @@ -293,7 +293,8 @@ static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip > *chip, > struct sk_buff *skb, u16 reg, > struct sk_buff_head *rxq) > { > - u16 buf[4] = { 0 }, status, timelo, timehi, seq_id; > + u16 buf[4] = { 0 }, status, seq_id; > + u64 ns, timelo, timehi; > struct skb_shared_hwtstamps *shwt; > int err; > > @@ -321,7 +322,7 @@ static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip > *chip, >*/ > for ( ; skb; skb = skb_dequeue(rxq)) { > if (mv88e6xxx_ts_valid(status) && seq_match(skb, seq_id)) { > - u64 ns = timehi << 16 | timelo; > + ns = timehi << 16 | timelo; This seems to be somewhat excessive 64bit maths on a 32bit system. It is more than enough to make timelo/timehi 'unsigned int'. David
RE: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
From: Colin King > Sent: 16 February 2018 16:55 > > From: Colin Ian King > > The shifting of timehi by 16 bits to the left will be promoted to > a 32 bit signed int and then sign-extended to an u64. If the top bit > of timehi is set then all then all the upper bits of ns end up as also > being set because of the sign-extension. Fix this by making timehi and > timelo u64. Also move the declaration of ns. > > Detected by CoverityScan, CID#1465288 ("Unintended sign extension") > > Fixes: c6fe0ad2c349 ("net: dsa: mv88e6xxx: add rx/tx timestamping support") > Signed-off-by: Colin Ian King > --- > drivers/net/dsa/mv88e6xxx/hwtstamp.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/hwtstamp.c > b/drivers/net/dsa/mv88e6xxx/hwtstamp.c > index b251d534b70d..2149d332dea0 100644 > --- a/drivers/net/dsa/mv88e6xxx/hwtstamp.c > +++ b/drivers/net/dsa/mv88e6xxx/hwtstamp.c > @@ -293,7 +293,8 @@ static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip > *chip, > struct sk_buff *skb, u16 reg, > struct sk_buff_head *rxq) > { > - u16 buf[4] = { 0 }, status, timelo, timehi, seq_id; > + u16 buf[4] = { 0 }, status, seq_id; > + u64 ns, timelo, timehi; > struct skb_shared_hwtstamps *shwt; > int err; > > @@ -321,7 +322,7 @@ static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip > *chip, >*/ > for ( ; skb; skb = skb_dequeue(rxq)) { > if (mv88e6xxx_ts_valid(status) && seq_match(skb, seq_id)) { > - u64 ns = timehi << 16 | timelo; > + ns = timehi << 16 | timelo; This seems to be somewhat excessive 64bit maths on a 32bit system. It is more than enough to make timelo/timehi 'unsigned int'. David
Re: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
From: Colin KingDate: Fri, 16 Feb 2018 16:55:05 + > From: Colin Ian King > > The shifting of timehi by 16 bits to the left will be promoted to > a 32 bit signed int and then sign-extended to an u64. If the top bit > of timehi is set then all then all the upper bits of ns end up as also > being set because of the sign-extension. Fix this by making timehi and > timelo u64. Also move the declaration of ns. > > Detected by CoverityScan, CID#1465288 ("Unintended sign extension") > > Fixes: c6fe0ad2c349 ("net: dsa: mv88e6xxx: add rx/tx timestamping support") > Signed-off-by: Colin Ian King Please indicate the appropriate target tree in your Subject lines in the future, for this it should be "[PATCH net-next]". Applied, thanks.
Re: [PATCH][V2] net: dsa: mv88e6xxx: avoid unintended sign extension on a 16 bit shift
From: Colin King Date: Fri, 16 Feb 2018 16:55:05 + > From: Colin Ian King > > The shifting of timehi by 16 bits to the left will be promoted to > a 32 bit signed int and then sign-extended to an u64. If the top bit > of timehi is set then all then all the upper bits of ns end up as also > being set because of the sign-extension. Fix this by making timehi and > timelo u64. Also move the declaration of ns. > > Detected by CoverityScan, CID#1465288 ("Unintended sign extension") > > Fixes: c6fe0ad2c349 ("net: dsa: mv88e6xxx: add rx/tx timestamping support") > Signed-off-by: Colin Ian King Please indicate the appropriate target tree in your Subject lines in the future, for this it should be "[PATCH net-next]". Applied, thanks.