lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <YxqbvwlHi4Au0Q5Z@lunn.ch> Date: Fri, 9 Sep 2022 03:49:51 +0200 From: Andrew Lunn <andrew@...n.ch> To: Mattias Forsblad <mattias.forsblad@...il.com> Cc: netdev@...r.kernel.org, Vivien Didelot <vivien.didelot@...il.com>, Florian Fainelli <f.fainelli@...il.com>, Vladimir Oltean <olteanv@...il.com>, "David S . Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com> Subject: Re: [PATCH net-next v7 5/6] net: dsa: mv88e6xxx: rmon: Use RMU for reading RMON data > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c > index bbdf229c9e71..bd16afa2e1a5 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.c > +++ b/drivers/net/dsa/mv88e6xxx/chip.c > @@ -1234,16 +1234,30 @@ static int mv88e6xxx_stats_get_stats(struct mv88e6xxx_chip *chip, int port, > u16 bank1_select, u16 histogram) > { > struct mv88e6xxx_hw_stat *stat; > + int offset = 0; > + u64 high; > int i, j; > > for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) { > stat = &mv88e6xxx_hw_stats[i]; > if (stat->type & types) { > - mv88e6xxx_reg_lock(chip); > - data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port, > - bank1_select, > - histogram); > - mv88e6xxx_reg_unlock(chip); > + if (mv88e6xxx_rmu_available(chip) && I was trying to avoid code like this, by the use of the ops. In terms of code, you are actually reusing very little here. What you are re-using is the table of statistics. I would add a new function, not change this function. > + !(stat->type & STATS_TYPE_PORT)) { > + if (stat->type & STATS_TYPE_BANK1) > + offset = 32; > + > + data[j] = chip->ports[port].rmu_raw_stats[stat->reg + offset]; > + if (stat->size == 8) { > + high = chip->ports[port].rmu_raw_stats[stat->reg + offset > + + 1]; > + data[j] += (high << 32); > + } > + } else { > + mv88e6xxx_reg_lock(chip); > + data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port, > + bank1_select, histogram); > + mv88e6xxx_reg_unlock(chip); > + } > > j++; > } > diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h > index 566d18cf5170..5459037067e6 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.h > +++ b/drivers/net/dsa/mv88e6xxx/chip.h > @@ -266,6 +266,7 @@ struct mv88e6xxx_vlan { > struct mv88e6xxx_port { > struct mv88e6xxx_chip *chip; > int port; > + u64 rmu_raw_stats[64]; That is a lot of space you don't actually need. Once you have a clean set of functions, you can simply pass the raw data as a parameter. Andrew
Powered by blists - more mailing lists