[v5,2/4] net/bnx2x: fix warnings about rte_memcpy lengths
Checks
Commit Message
Bugfix: The vlan in the bulletin does not contain a VLAN header, only the
VLAN ID, so only copy 2 byte, not 4. The target structure has padding
after the field, so copying 2 byte too many is effectively harmless.
There is no need to backport this patch.
Use RTE_PTR_ADD where copying arrays to the offset of a first field in a
structure holding multiple fields, to avoid compiler warnings.
Bugzilla ID: 1146
Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
v5:
* No changes.
v4:
* Type casting did not fix the warnings, so use RTE_PTR_ADD instead.
v3:
* First patch in series.
---
drivers/net/bnx2x/bnx2x_stats.c | 11 +++++++----
drivers/net/bnx2x/bnx2x_vfpf.c | 2 +-
2 files changed, 8 insertions(+), 5 deletions(-)
Comments
On Wed, Dec 28, 2022, 16:10 Morten Brørup <mb@smartsharesystems.com> wrote:
> Bugfix: The vlan in the bulletin does not contain a VLAN header, only the
> VLAN ID, so only copy 2 byte, not 4. The target structure has padding
> after the field, so copying 2 byte too many is effectively harmless.
>
It is a small nitpick but why use rte_memcpy for a 2 byte / half-word copy?
Shouldn't assignment with casts be enough?
> There is no need to backport this patch.
>
> Use RTE_PTR_ADD where copying arrays to the offset of a first field in a
> structure holding multiple fields, to avoid compiler warnings.
>
> Bugzilla ID: 1146
>
> Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
>
> v5:
> * No changes.
> v4:
> * Type casting did not fix the warnings, so use RTE_PTR_ADD instead.
> v3:
> * First patch in series.
> ---
> drivers/net/bnx2x/bnx2x_stats.c | 11 +++++++----
> drivers/net/bnx2x/bnx2x_vfpf.c | 2 +-
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/bnx2x/bnx2x_stats.c
> b/drivers/net/bnx2x/bnx2x_stats.c
> index c07b01510a..1c44504663 100644
> --- a/drivers/net/bnx2x/bnx2x_stats.c
> +++ b/drivers/net/bnx2x/bnx2x_stats.c
> @@ -819,8 +819,9 @@ bnx2x_hw_stats_update(struct bnx2x_softc *sc)
>
> rte_memcpy(old, new, sizeof(struct nig_stats));
>
> - rte_memcpy(&(estats->rx_stat_ifhcinbadoctets_hi),
> &(pstats->mac_stx[1]),
> - sizeof(struct mac_stx));
> + rte_memcpy(RTE_PTR_ADD(estats,
> + offsetof(struct bnx2x_eth_stats, rx_stat_ifhcinbadoctets_hi)),
> + &(pstats->mac_stx[1]), sizeof(struct mac_stx));
> estats->brb_drop_hi = pstats->brb_drop_hi;
> estats->brb_drop_lo = pstats->brb_drop_lo;
>
> @@ -1492,9 +1493,11 @@ bnx2x_stats_init(struct bnx2x_softc *sc)
> REG_RD(sc, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38);
> if (!CHIP_IS_E3(sc)) {
> REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50,
> -
> &(sc->port.old_nig_stats.egress_mac_pkt0_lo), 2);
> + RTE_PTR_ADD(&(sc->port.old_nig_stats),
> + offsetof(struct nig_stats,
> egress_mac_pkt0_lo)), 2);
> REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50,
> -
> &(sc->port.old_nig_stats.egress_mac_pkt1_lo), 2);
> + RTE_PTR_ADD(&(sc->port.old_nig_stats),
> + offsetof(struct nig_stats,
> egress_mac_pkt1_lo)), 2);
> }
>
> /* function stats */
> diff --git a/drivers/net/bnx2x/bnx2x_vfpf.c
> b/drivers/net/bnx2x/bnx2x_vfpf.c
> index 63953c2979..87631c76ca 100644
> --- a/drivers/net/bnx2x/bnx2x_vfpf.c
> +++ b/drivers/net/bnx2x/bnx2x_vfpf.c
> @@ -54,7 +54,7 @@ bnx2x_check_bull(struct bnx2x_softc *sc)
> if (valid_bitmap & (1 << MAC_ADDR_VALID) && memcmp(bull->mac,
> sc->old_bulletin.mac, ETH_ALEN))
> rte_memcpy(&sc->link_params.mac_addr, bull->mac, ETH_ALEN);
> if (valid_bitmap & (1 << VLAN_VALID))
> - rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan,
> RTE_VLAN_HLEN);
> + rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan,
> sizeof(bull->vlan));
>
> sc->old_bulletin = *bull;
>
> --
> 2.17.1
>
>
From: Stanisław Kardach [mailto:kda@semihalf.com]
Sent: Wednesday, 28 December 2022 17.14
> On Wed, Dec 28, 2022, 16:10 Morten Brørup <mb@smartsharesystems.com> wrote:
> > Bugfix: The vlan in the bulletin does not contain a VLAN header, only the
> > VLAN ID, so only copy 2 byte, not 4. The target structure has padding
> > after the field, so copying 2 byte too many is effectively harmless.
> It is a small nitpick but why use rte_memcpy for a 2 byte / half-word copy? Shouldn't assignment with casts be enough?
Absolutely. It would also have prevented the bug to begin with.
But in order to keep the changes minimal, I kept the rte_memcpy().
> > There is no need to backport this patch.
> >
> > Use RTE_PTR_ADD where copying arrays to the offset of a first field in a
> > structure holding multiple fields, to avoid compiler warnings.
> >
> > Bugzilla ID: 1146
> >
> > Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
> >
> > v5:
> > * No changes.
> > v4:
> > * Type casting did not fix the warnings, so use RTE_PTR_ADD instead.
> > v3:
> > * First patch in series.
> > ---
> > drivers/net/bnx2x/bnx2x_stats.c | 11 +++++++----
> > drivers/net/bnx2x/bnx2x_vfpf.c | 2 +-
> > 2 files changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/net/bnx2x/bnx2x_stats.c b/drivers/net/bnx2x/bnx2x_stats.c
> > index c07b01510a..1c44504663 100644
> > --- a/drivers/net/bnx2x/bnx2x_stats.c
> > +++ b/drivers/net/bnx2x/bnx2x_stats.c
> > @@ -819,8 +819,9 @@ bnx2x_hw_stats_update(struct bnx2x_softc *sc)
> >
> > rte_memcpy(old, new, sizeof(struct nig_stats));
> >
> > - rte_memcpy(&(estats->rx_stat_ifhcinbadoctets_hi), &(pstats->mac_stx[1]),
> > - sizeof(struct mac_stx));
> > + rte_memcpy(RTE_PTR_ADD(estats,
> > + offsetof(struct bnx2x_eth_stats, rx_stat_ifhcinbadoctets_hi)),
> > + &(pstats->mac_stx[1]), sizeof(struct mac_stx));
> > estats->brb_drop_hi = pstats->brb_drop_hi;
> > estats->brb_drop_lo = pstats->brb_drop_lo;
> >
> > @@ -1492,9 +1493,11 @@ bnx2x_stats_init(struct bnx2x_softc *sc)
> > REG_RD(sc, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38);
> > if (!CHIP_IS_E3(sc)) {
> > REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50,
> > - &(sc->port.old_nig_stats.egress_mac_pkt0_lo), 2);
> > + RTE_PTR_ADD(&(sc->port.old_nig_stats),
> > + offsetof(struct nig_stats, egress_mac_pkt0_lo)), 2);
> > REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50,
> > - &(sc->port.old_nig_stats.egress_mac_pkt1_lo), 2);
> > + RTE_PTR_ADD(&(sc->port.old_nig_stats),
> > + offsetof(struct nig_stats, egress_mac_pkt1_lo)), 2);
> > }
> >
> > /* function stats */
> > diff --git a/drivers/net/bnx2x/bnx2x_vfpf.c b/drivers/net/bnx2x/bnx2x_vfpf.c
> > index 63953c2979..87631c76ca 100644
> > --- a/drivers/net/bnx2x/bnx2x_vfpf.c
> > +++ b/drivers/net/bnx2x/bnx2x_vfpf.c
> > @@ -54,7 +54,7 @@ bnx2x_check_bull(struct bnx2x_softc *sc)
> > if (valid_bitmap & (1 << MAC_ADDR_VALID) && memcmp(bull->mac, sc->old_bulletin.mac, ETH_ALEN))
> > rte_memcpy(&sc->link_params.mac_addr, bull->mac, ETH_ALEN);
> > if (valid_bitmap & (1 << VLAN_VALID))
> > - rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan, RTE_VLAN_HLEN);
> > + rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan, sizeof(bull->vlan));
As Stanisław mentioned, this might as well be:
if (valid_bitmap & (1 << VLAN_VALID))
- rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan, RTE_VLAN_HLEN);
+ bull->vlan = sc->old_bulletin.vlan;
> >
> > sc->old_bulletin = *bull;
> >
> > --
> > 2.17.1
On Wed, 28 Dec 2022 17:38:56 +0100
Morten Brørup <mb@smartsharesystems.com> wrote:
> From: Stanisław Kardach [mailto:kda@semihalf.com]
> Sent: Wednesday, 28 December 2022 17.14
> > On Wed, Dec 28, 2022, 16:10 Morten Brørup <mb@smartsharesystems.com> wrote:
> > > Bugfix: The vlan in the bulletin does not contain a VLAN header, only the
> > > VLAN ID, so only copy 2 byte, not 4. The target structure has padding
> > > after the field, so copying 2 byte too many is effectively harmless.
> > It is a small nitpick but why use rte_memcpy for a 2 byte / half-word copy? Shouldn't assignment with casts be enough?
>
> Absolutely. It would also have prevented the bug to begin with.
> But in order to keep the changes minimal, I kept the rte_memcpy().
For small fixed values compiler can optimize memcpy into one instruction.
Not so with current rte_memcpy
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Wednesday, 28 December 2022 18.03
>
> On Wed, 28 Dec 2022 17:38:56 +0100
> Morten Brørup <mb@smartsharesystems.com> wrote:
>
> > From: Stanisław Kardach [mailto:kda@semihalf.com]
> > Sent: Wednesday, 28 December 2022 17.14
> > > On Wed, Dec 28, 2022, 16:10 Morten Brørup
> <mb@smartsharesystems.com> wrote:
> > > > Bugfix: The vlan in the bulletin does not contain a VLAN header,
> only the
> > > > VLAN ID, so only copy 2 byte, not 4. The target structure has
> padding
> > > > after the field, so copying 2 byte too many is effectively
> harmless.
> > > It is a small nitpick but why use rte_memcpy for a 2 byte / half-
> word copy? Shouldn't assignment with casts be enough?
> >
> > Absolutely. It would also have prevented the bug to begin with.
> > But in order to keep the changes minimal, I kept the rte_memcpy().
>
> For small fixed values compiler can optimize memcpy into one
> instruction.
> Not so with current rte_memcpy
Good point, Stephen.
I took another look at it, and the two byte rte_memcpy() is only used in a slow path function, so no need to optimize further.
If the maintainers disagree, and want to optimize anyway, here's a proposal:
/* check the mac address and VLAN and allocate memory if valid */
if (valid_bitmap & (1 << MAC_ADDR_VALID) && !rte_is_same_ether_addr(
(const struct rte_ether_addr *)&bull->mac,
(const struct rte_ether_addr *)&sc->old_bulletin.mac))
rte_ether_addr_copy((const struct rte_ether_addr *)&bull->mac,
(struct rte_ether_addr *)&sc->link_params.mac_addr);
if (valid_bitmap & (1 << VLAN_VALID))
bull->vlan = sc->old_bulletin.vlan;
Hello bnx2x maintainers,
On Wed, Dec 28, 2022 at 6:37 PM Morten Brørup <mb@smartsharesystems.com> wrote:
>
> > From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> > Sent: Wednesday, 28 December 2022 18.03
> >
> > On Wed, 28 Dec 2022 17:38:56 +0100
> > Morten Brørup <mb@smartsharesystems.com> wrote:
> >
> > > From: Stanisław Kardach [mailto:kda@semihalf.com]
> > > Sent: Wednesday, 28 December 2022 17.14
> > > > On Wed, Dec 28, 2022, 16:10 Morten Brørup
> > <mb@smartsharesystems.com> wrote:
> > > > > Bugfix: The vlan in the bulletin does not contain a VLAN header,
> > only the
> > > > > VLAN ID, so only copy 2 byte, not 4. The target structure has
> > padding
> > > > > after the field, so copying 2 byte too many is effectively
> > harmless.
> > > > It is a small nitpick but why use rte_memcpy for a 2 byte / half-
> > word copy? Shouldn't assignment with casts be enough?
> > >
> > > Absolutely. It would also have prevented the bug to begin with.
> > > But in order to keep the changes minimal, I kept the rte_memcpy().
> >
> > For small fixed values compiler can optimize memcpy into one
> > instruction.
> > Not so with current rte_memcpy
>
> Good point, Stephen.
>
> I took another look at it, and the two byte rte_memcpy() is only used in a slow path function, so no need to optimize further.
>
> If the maintainers disagree, and want to optimize anyway, here's a proposal:
>
> /* check the mac address and VLAN and allocate memory if valid */
> if (valid_bitmap & (1 << MAC_ADDR_VALID) && !rte_is_same_ether_addr(
> (const struct rte_ether_addr *)&bull->mac,
> (const struct rte_ether_addr *)&sc->old_bulletin.mac))
> rte_ether_addr_copy((const struct rte_ether_addr *)&bull->mac,
> (struct rte_ether_addr *)&sc->link_params.mac_addr);
> if (valid_bitmap & (1 << VLAN_VALID))
> bull->vlan = sc->old_bulletin.vlan;
>
Please review/advise.
Thanks.
@@ -819,8 +819,9 @@ bnx2x_hw_stats_update(struct bnx2x_softc *sc)
rte_memcpy(old, new, sizeof(struct nig_stats));
- rte_memcpy(&(estats->rx_stat_ifhcinbadoctets_hi), &(pstats->mac_stx[1]),
- sizeof(struct mac_stx));
+ rte_memcpy(RTE_PTR_ADD(estats,
+ offsetof(struct bnx2x_eth_stats, rx_stat_ifhcinbadoctets_hi)),
+ &(pstats->mac_stx[1]), sizeof(struct mac_stx));
estats->brb_drop_hi = pstats->brb_drop_hi;
estats->brb_drop_lo = pstats->brb_drop_lo;
@@ -1492,9 +1493,11 @@ bnx2x_stats_init(struct bnx2x_softc *sc)
REG_RD(sc, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38);
if (!CHIP_IS_E3(sc)) {
REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50,
- &(sc->port.old_nig_stats.egress_mac_pkt0_lo), 2);
+ RTE_PTR_ADD(&(sc->port.old_nig_stats),
+ offsetof(struct nig_stats, egress_mac_pkt0_lo)), 2);
REG_RD_DMAE(sc, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50,
- &(sc->port.old_nig_stats.egress_mac_pkt1_lo), 2);
+ RTE_PTR_ADD(&(sc->port.old_nig_stats),
+ offsetof(struct nig_stats, egress_mac_pkt1_lo)), 2);
}
/* function stats */
@@ -54,7 +54,7 @@ bnx2x_check_bull(struct bnx2x_softc *sc)
if (valid_bitmap & (1 << MAC_ADDR_VALID) && memcmp(bull->mac, sc->old_bulletin.mac, ETH_ALEN))
rte_memcpy(&sc->link_params.mac_addr, bull->mac, ETH_ALEN);
if (valid_bitmap & (1 << VLAN_VALID))
- rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan, RTE_VLAN_HLEN);
+ rte_memcpy(&bull->vlan, &sc->old_bulletin.vlan, sizeof(bull->vlan));
sc->old_bulletin = *bull;