netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one
@ 2014-12-02 14:50 Andrey Volkov
  2014-12-02 20:40 ` Florian Fainelli
  0 siblings, 1 reply; 5+ messages in thread
From: Andrey Volkov @ 2014-12-02 14:50 UTC (permalink / raw)
  To: netdev; +Cc: Florian Fainelli

Hello,

In time of developing one of our devices (with huge, more then 6, number of onboard switches),
I've bumped with this ancient, I hope, restriction in the 'struct dsa_switch_tree' definition. 
So this simple patch remove this restriction and make dsa_switch_tree more scalable for 
the "usual" 1-2 switches configuration too.

P.S. I've plans to fix hardcoded number of ports too, but it is not so easy as with number of switches.
So if someone have any objections/suggestions I'll happy to discuss them.

Signed-off-by: Andrey Volkov <andrey.volkov@nexvision.fr>                                                                                                                                                                                    
---                                                                                                                                                                                                                                          
 include/net/dsa.h |    3 +--                                                                                                                                                                                                                
 net/dsa/dsa.c     |    7 +++----                                                                                                                                                                                                            
 2 files changed, 4 insertions(+), 6 deletions(-)                                                                                                                                                                                            
                                                                                                                                                                                                                                             
diff --git a/include/net/dsa.h b/include/net/dsa.h                                                                                                                                                                                           
index ed3c34b..733db2e 100644                                                                                                                                                                                                                
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -28,7 +28,6 @@ enum dsa_tag_protocol {
        DSA_TAG_PROTO_BRCM,
 };
 
-#define DSA_MAX_SWITCHES       4
 #define DSA_MAX_PORTS          12
 
 struct dsa_chip_data {
@@ -117,7 +116,7 @@ struct dsa_switch_tree {
        /*
         * Data for the individual switch chips.
         */
-       struct dsa_switch       *ds[DSA_MAX_SWITCHES];
+       struct dsa_switch       *ds[];
 };
 
 struct dsa_switch {
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 322c778..c081a19 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -604,8 +604,6 @@ static int dsa_of_probe(struct platform_device *pdev)
        pdev->dev.platform_data = pd;
        pd->netdev = &ethernet_dev->dev;
        pd->nr_chips = of_get_child_count(np);
-       if (pd->nr_chips > DSA_MAX_SWITCHES)
-               pd->nr_chips = DSA_MAX_SWITCHES;
 
        pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
                           GFP_KERNEL);
@@ -717,7 +715,7 @@ static int dsa_probe(struct platform_device *pdev)
                pd = pdev->dev.platform_data;
        }
 
-       if (pd == NULL || pd->netdev == NULL)
+       if (pd == NULL || pd->netdev == NULL || pd->nr_chips == 0)
                return -EINVAL;
 
        dev = dev_to_net_device(pd->netdev);
@@ -732,7 +730,8 @@ static int dsa_probe(struct platform_device *pdev)
                goto out;
        }
 
-       dst = kzalloc(sizeof(*dst), GFP_KERNEL);
+       dst = kzalloc(sizeof(*dst) +
+                       sizeof(struct dsa_switch *) * pd->nr_chips, GFP_KERNEL);
        if (dst == NULL) {
                dev_put(dev);
                ret = -ENOMEM;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one
  2014-12-02 14:50 [PATCH 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one Andrey Volkov
@ 2014-12-02 20:40 ` Florian Fainelli
  2014-12-04 15:54   ` [PATCH v2 " Andrey Volkov
  2014-12-04 17:29   ` [PATCH " Andrey Volkov
  0 siblings, 2 replies; 5+ messages in thread
From: Florian Fainelli @ 2014-12-02 20:40 UTC (permalink / raw)
  To: Andrey Volkov, netdev

On 02/12/14 06:50, Andrey Volkov wrote:
> Hello,
> 
> In time of developing one of our devices (with huge, more then 6, number of onboard switches),
> I've bumped with this ancient, I hope, restriction in the 'struct dsa_switch_tree' definition. 
> So this simple patch remove this restriction and make dsa_switch_tree more scalable for 
> the "usual" 1-2 switches configuration too.

Sounds reasonable to me, you probably want to resubmit and trim the
"Hello" form your commit message.

> 
> P.S. I've plans to fix hardcoded number of ports too, but it is not so easy as with number of switches.
> So if someone have any objections/suggestions I'll happy to discuss them.

I think the number of ports in a switch is something that should come
from the switch driver, and eventually intersected with what the
platform configuration has provided.

The difficulty is in case of sparse port number allocation because you
still want to allocate e.g: 6 ports even though Port 0 and 5 are used, I
don't think we want to introduce a logical to physical mapping, that
would be too error prone.

> 
> Signed-off-by: Andrey Volkov <andrey.volkov@nexvision.fr>                                                                                                                                                                                    
> ---                                                                                                                                                                                                                                          
>  include/net/dsa.h |    3 +--                                                                                                                                                                                                                
>  net/dsa/dsa.c     |    7 +++----                                                                                                                                                                                                            
>  2 files changed, 4 insertions(+), 6 deletions(-)                                                                                                                                                                                            
>                                                                                                                                                                                                                                              
> diff --git a/include/net/dsa.h b/include/net/dsa.h                                                                                                                                                                                           
> index ed3c34b..733db2e 100644                                                                                                                                                                                                                
> --- a/include/net/dsa.h
> +++ b/include/net/dsa.h
> @@ -28,7 +28,6 @@ enum dsa_tag_protocol {
>         DSA_TAG_PROTO_BRCM,
>  };
>  
> -#define DSA_MAX_SWITCHES       4
>  #define DSA_MAX_PORTS          12
>  
>  struct dsa_chip_data {
> @@ -117,7 +116,7 @@ struct dsa_switch_tree {
>         /*
>          * Data for the individual switch chips.
>          */
> -       struct dsa_switch       *ds[DSA_MAX_SWITCHES];
> +       struct dsa_switch       *ds[];
>  };
>  
>  struct dsa_switch {
> diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
> index 322c778..c081a19 100644
> --- a/net/dsa/dsa.c
> +++ b/net/dsa/dsa.c
> @@ -604,8 +604,6 @@ static int dsa_of_probe(struct platform_device *pdev)
>         pdev->dev.platform_data = pd;
>         pd->netdev = &ethernet_dev->dev;
>         pd->nr_chips = of_get_child_count(np);
> -       if (pd->nr_chips > DSA_MAX_SWITCHES)
> -               pd->nr_chips = DSA_MAX_SWITCHES;
>  
>         pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
>                            GFP_KERNEL);
> @@ -717,7 +715,7 @@ static int dsa_probe(struct platform_device *pdev)
>                 pd = pdev->dev.platform_data;
>         }
>  
> -       if (pd == NULL || pd->netdev == NULL)
> +       if (pd == NULL || pd->netdev == NULL || pd->nr_chips == 0)
>                 return -EINVAL;
>  
>         dev = dev_to_net_device(pd->netdev);
> @@ -732,7 +730,8 @@ static int dsa_probe(struct platform_device *pdev)
>                 goto out;
>         }
>  
> -       dst = kzalloc(sizeof(*dst), GFP_KERNEL);
> +       dst = kzalloc(sizeof(*dst) +
> +                       sizeof(struct dsa_switch *) * pd->nr_chips, GFP_KERNEL);
>         if (dst == NULL) {
>                 dev_put(dev);
>                 ret = -ENOMEM;
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one
  2014-12-02 20:40 ` Florian Fainelli
@ 2014-12-04 15:54   ` Andrey Volkov
  2014-12-09 19:45     ` David Miller
  2014-12-04 17:29   ` [PATCH " Andrey Volkov
  1 sibling, 1 reply; 5+ messages in thread
From: Andrey Volkov @ 2014-12-04 15:54 UTC (permalink / raw)
  To: Florian Fainelli, netdev

Replacing the hard-coded sized array "dsa_switch" by dynamic one
and remove useless DSA_MAX_SWITCHES define.
This patch also make dsa_switch_tree scalable from the "usual"
1-2 up to 10th switches configuration.

Signed-off-by: Andrey Volkov <andrey.volkov@nexvision.fr>
---
 include/net/dsa.h |    3 +--
 net/dsa/dsa.c     |    7 +++----
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/include/net/dsa.h b/include/net/dsa.h
index ed3c34b..733db2e 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -28,7 +28,6 @@ enum dsa_tag_protocol {
     DSA_TAG_PROTO_BRCM,
 };
 
-#define DSA_MAX_SWITCHES    4
 #define DSA_MAX_PORTS        12
 
 struct dsa_chip_data {
@@ -117,7 +116,7 @@ struct dsa_switch_tree {
     /*
      * Data for the individual switch chips.
      */
-    struct dsa_switch    *ds[DSA_MAX_SWITCHES];
+    struct dsa_switch    *ds[];
 };
 
 struct dsa_switch {
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 322c778..c081a19 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -604,8 +604,6 @@ static int dsa_of_probe(struct platform_device *pdev)
     pdev->dev.platform_data = pd;
     pd->netdev = &ethernet_dev->dev;
     pd->nr_chips = of_get_child_count(np);
-    if (pd->nr_chips > DSA_MAX_SWITCHES)
-        pd->nr_chips = DSA_MAX_SWITCHES;
 
     pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
                GFP_KERNEL);
@@ -717,7 +715,7 @@ static int dsa_probe(struct platform_device *pdev)
         pd = pdev->dev.platform_data;
     }
 
-    if (pd == NULL || pd->netdev == NULL)
+    if (pd == NULL || pd->netdev == NULL || pd->nr_chips == 0)
         return -EINVAL;
 
     dev = dev_to_net_device(pd->netdev);
@@ -732,7 +730,8 @@ static int dsa_probe(struct platform_device *pdev)
         goto out;
     }
 
-    dst = kzalloc(sizeof(*dst), GFP_KERNEL);
+    dst = kzalloc(sizeof(*dst) +
+            sizeof(struct dsa_switch *) * pd->nr_chips, GFP_KERNEL);
     if (dst == NULL) {
         dev_put(dev);
         ret = -ENOMEM;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one
  2014-12-02 20:40 ` Florian Fainelli
  2014-12-04 15:54   ` [PATCH v2 " Andrey Volkov
@ 2014-12-04 17:29   ` Andrey Volkov
  1 sibling, 0 replies; 5+ messages in thread
From: Andrey Volkov @ 2014-12-04 17:29 UTC (permalink / raw)
  To: Florian Fainelli; +Cc: netdev


Le 02/12/2014 21:40, Florian Fainelli a écrit :
> On 02/12/14 06:50, Andrey Volkov wrote:
>> Hello,
>>
>> In time of developing one of our devices (with huge, more then 6, number of onboard switches),
>> I've bumped with this ancient, I hope, restriction in the 'struct dsa_switch_tree' definition. 
>> So this simple patch remove this restriction and make dsa_switch_tree more scalable for 
>> the "usual" 1-2 switches configuration too.
> Sounds reasonable to me, you probably want to resubmit and trim the
> "Hello" form your commit message.
>
>> P.S. I've plans to fix hardcoded number of ports too, but it is not so easy as with number of switches.
>> So if someone have any objections/suggestions I'll happy to discuss them.
> I think the number of ports in a switch is something that should come
> from the switch driver, and eventually intersected with what the
> platform configuration has provided.
Yes it's exactly what I've in my mind. Also in our project I need to handle currently unsupported case:
when switches combined into the stacks by more than one hardwired links, i.e. some ports must be
configured as part of 'hard-coded' trunks.

> The difficulty is in case of sparse port number allocation because you
> still want to allocate e.g: 6 ports even though Port 0 and 5 are used, I
> don't think we want to introduce a logical to physical mapping, that
> would be too error prone.
Agree.


>
>> Signed-off-by: Andrey Volkov <andrey.volkov@nexvision.fr>                                                                                                                                                                                    
>> ---                                                                                                                                                                                                                                          
>>  include/net/dsa.h |    3 +--                                                                                                                                                                                                                
>>  net/dsa/dsa.c     |    7 +++----                                                                                                                                                                                                            
>>  2 files changed, 4 insertions(+), 6 deletions(-)                                                                                                                                                                                            
>>                                                                                                                                                                                                                                              
>> diff --git a/include/net/dsa.h b/include/net/dsa.h                                                                                                                                                                                           
>> index ed3c34b..733db2e 100644                                                                                                                                                                                                                
>> --- a/include/net/dsa.h
>> +++ b/include/net/dsa.h
>> @@ -28,7 +28,6 @@ enum dsa_tag_protocol {
>>         DSA_TAG_PROTO_BRCM,
>>  };
>>  
>> -#define DSA_MAX_SWITCHES       4
>>  #define DSA_MAX_PORTS          12
>>  
>>  struct dsa_chip_data {
>> @@ -117,7 +116,7 @@ struct dsa_switch_tree {
>>         /*
>>          * Data for the individual switch chips.
>>          */
>> -       struct dsa_switch       *ds[DSA_MAX_SWITCHES];
>> +       struct dsa_switch       *ds[];
>>  };
>>  
>>  struct dsa_switch {
>> diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
>> index 322c778..c081a19 100644
>> --- a/net/dsa/dsa.c
>> +++ b/net/dsa/dsa.c
>> @@ -604,8 +604,6 @@ static int dsa_of_probe(struct platform_device *pdev)
>>         pdev->dev.platform_data = pd;
>>         pd->netdev = &ethernet_dev->dev;
>>         pd->nr_chips = of_get_child_count(np);
>> -       if (pd->nr_chips > DSA_MAX_SWITCHES)
>> -               pd->nr_chips = DSA_MAX_SWITCHES;
>>  
>>         pd->chip = kcalloc(pd->nr_chips, sizeof(struct dsa_chip_data),
>>                            GFP_KERNEL);
>> @@ -717,7 +715,7 @@ static int dsa_probe(struct platform_device *pdev)
>>                 pd = pdev->dev.platform_data;
>>         }
>>  
>> -       if (pd == NULL || pd->netdev == NULL)
>> +       if (pd == NULL || pd->netdev == NULL || pd->nr_chips == 0)
>>                 return -EINVAL;
>>  
>>         dev = dev_to_net_device(pd->netdev);
>> @@ -732,7 +730,8 @@ static int dsa_probe(struct platform_device *pdev)
>>                 goto out;
>>         }
>>  
>> -       dst = kzalloc(sizeof(*dst), GFP_KERNEL);
>> +       dst = kzalloc(sizeof(*dst) +
>> +                       sizeof(struct dsa_switch *) * pd->nr_chips, GFP_KERNEL);
>>         if (dst == NULL) {
>>                 dev_put(dev);
>>                 ret = -ENOMEM;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one
  2014-12-04 15:54   ` [PATCH v2 " Andrey Volkov
@ 2014-12-09 19:45     ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2014-12-09 19:45 UTC (permalink / raw)
  To: andrey.volkov; +Cc: f.fainelli, netdev

From: Andrey Volkov <andrey.volkov@nexvision.fr>
Date: Thu, 04 Dec 2014 16:54:32 +0100

> @@ -732,7 +730,8 @@ static int dsa_probe(struct platform_device *pdev)
>          goto out;
>      }
>  
> -    dst = kzalloc(sizeof(*dst), GFP_KERNEL);
> +    dst = kzalloc(sizeof(*dst) +
> +            sizeof(struct dsa_switch *) * pd->nr_chips, GFP_KERNEL);

Your email client has completely corrupted your patch.  For one thing it
has transformed TAB characters into spaces.

Please read Documentation/email-clients.txt, email the patch to yourself,
and then try to successfully apply the patch you receive in that email.
If it doesn't work for you, it won't work for us either.

Do not resubmit this patch until your have fully resolved this, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-12-09 19:45 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-02 14:50 [PATCH 1/1] net: dsa: replacing the hard-coded sized array "dsa_switch" by dynamic one Andrey Volkov
2014-12-02 20:40 ` Florian Fainelli
2014-12-04 15:54   ` [PATCH v2 " Andrey Volkov
2014-12-09 19:45     ` David Miller
2014-12-04 17:29   ` [PATCH " Andrey Volkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).