Message ID | 20191020031941.3805884-3-vivien.didelot@gmail.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | net: dsa: turn arrays of ports into a list | expand |
On 10/19/2019 8:19 PM, Vivien Didelot wrote: > Add a list of switch ports within the switch fabric. This will help the > lookup of a port inside the whole fabric, and it is the first step > towards supporting multiple CPU ports, before deprecating the usage of > the unique dst->cpu_dp pointer. > > In preparation for a future allocation of the dsa_port structures, > return -ENOMEM in case no structure is returned, even though this > error cannot be reached yet. > > Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
On 10/19/2019 8:19 PM, Vivien Didelot wrote: > Add a list of switch ports within the switch fabric. This will help the > lookup of a port inside the whole fabric, and it is the first step > towards supporting multiple CPU ports, before deprecating the usage of > the unique dst->cpu_dp pointer. > > In preparation for a future allocation of the dsa_port structures, > return -ENOMEM in case no structure is returned, even though this > error cannot be reached yet. BTW, this patch had a small hunk while applying which forced git am to ask for manual resolution, my net-next tree was based off v5.4-rc1-582-gebcd670d05d5.
> +static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) > +{ > + struct dsa_switch_tree *dst = ds->dst; > + struct dsa_port *dp; > + > + dp = &ds->ports[index]; > + > + dp->ds = ds; > + dp->index = index; > + > + INIT_LIST_HEAD(&dp->list); > + list_add(&dp->list, &dst->ports); > + > + return dp; > +} Bike shedding, but i don't particularly like the name touch. How about list. The opposite would then be delist, if we ever need it? Otherwise: Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew
On Mon, 21 Oct 2019 14:37:40 +0200, Andrew Lunn <andrew@lunn.ch> wrote: > > +static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) > > +{ > > + struct dsa_switch_tree *dst = ds->dst; > > + struct dsa_port *dp; > > + > > + dp = &ds->ports[index]; > > + > > + dp->ds = ds; > > + dp->index = index; > > + > > + INIT_LIST_HEAD(&dp->list); > > + list_add(&dp->list, &dst->ports); > > + > > + return dp; > > +} > > Bike shedding, but i don't particularly like the name touch. How > about list. The opposite would then be delist, if we ever need it? The fabric code uses "touch" for "get or create" already, so I used the same semantics for ports as well. But I'm not strongly attached to this naming anyway, so I will polish them all together in a future series. Thanks, Vivien
diff --git a/include/net/dsa.h b/include/net/dsa.h index 2e4fe2f8962b..6ff6dfcdc61d 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -125,6 +125,9 @@ struct dsa_switch_tree { */ struct dsa_port *cpu_dp; + /* List of switch ports */ + struct list_head ports; + /* * Data for the individual switch chips. */ @@ -195,6 +198,8 @@ struct dsa_port { struct work_struct xmit_work; struct sk_buff_head xmit_queue; + struct list_head list; + /* * Give the switch driver somewhere to hang its per-port private data * structures (accessible from the tagger). diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 1716535167ee..b6536641ac99 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -45,6 +45,8 @@ static struct dsa_switch_tree *dsa_tree_alloc(int index) dst->index = index; + INIT_LIST_HEAD(&dst->ports); + INIT_LIST_HEAD(&dst->list); list_add_tail(&dst->list, &dsa_tree_list); @@ -616,6 +618,22 @@ static int dsa_tree_add_switch(struct dsa_switch_tree *dst, return err; } +static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) +{ + struct dsa_switch_tree *dst = ds->dst; + struct dsa_port *dp; + + dp = &ds->ports[index]; + + dp->ds = ds; + dp->index = index; + + INIT_LIST_HEAD(&dp->list); + list_add(&dp->list, &dst->ports); + + return dp; +} + static int dsa_port_parse_user(struct dsa_port *dp, const char *name) { if (!name) @@ -742,6 +760,20 @@ static int dsa_switch_parse_member_of(struct dsa_switch *ds, return 0; } +static int dsa_switch_touch_ports(struct dsa_switch *ds) +{ + struct dsa_port *dp; + int port; + + for (port = 0; port < ds->num_ports; port++) { + dp = dsa_port_touch(ds, port); + if (!dp) + return -ENOMEM; + } + + return 0; +} + static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) { int err; @@ -750,6 +782,10 @@ static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) if (err) return err; + err = dsa_switch_touch_ports(ds); + if (err) + return err; + return dsa_switch_parse_ports_of(ds, dn); } @@ -807,6 +843,8 @@ static int dsa_switch_parse_ports(struct dsa_switch *ds, static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) { + int err; + ds->cd = cd; /* We don't support interconnected switches nor multiple trees via @@ -817,6 +855,10 @@ static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) if (!ds->dst) return -ENOMEM; + err = dsa_switch_touch_ports(ds); + if (err) + return err; + return dsa_switch_parse_ports(ds, cd); } @@ -849,7 +891,6 @@ static int dsa_switch_probe(struct dsa_switch *ds) struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) { struct dsa_switch *ds; - int i; ds = devm_kzalloc(dev, struct_size(ds, ports, n), GFP_KERNEL); if (!ds) @@ -858,11 +899,6 @@ struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) ds->dev = dev; ds->num_ports = n; - for (i = 0; i < ds->num_ports; ++i) { - ds->ports[i].index = i; - ds->ports[i].ds = ds; - } - return ds; } EXPORT_SYMBOL_GPL(dsa_switch_alloc);
Add a list of switch ports within the switch fabric. This will help the lookup of a port inside the whole fabric, and it is the first step towards supporting multiple CPU ports, before deprecating the usage of the unique dst->cpu_dp pointer. In preparation for a future allocation of the dsa_port structures, return -ENOMEM in case no structure is returned, even though this error cannot be reached yet. Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com> --- include/net/dsa.h | 5 +++++ net/dsa/dsa2.c | 48 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 6 deletions(-)